Базовый курс. Занятие №9
Заключительное занятие по второму блоку базового курса.
Необходимо изучить следующие главы.
Глава 11. Запросы.
Глава 12. Условное проведение.
Глава 13. Планы видов характеристик.
Глава 14. Создание отчетов.
Глава 15. Обработки.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитаться по домашним заданиям не получиться.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
ДЗ выполнил: в основном по разбору ДЗ, но отчеты сам делал.
Обратная связь:
Работа с запросами, глава с регистрами и условное и безусловное проведение документов оказалось очень полезным. Мастер группа по СКД была бы в самы раз!
> Мастер группа по СКД была бы в самы раз!
СКД много времени уделяется в продвинутом курсе.
Задание выполнено. Контроль остатков выполнил, следуя примеру в главе 12 2-го блока, добавив дополнительное измерение Качество, сделал в обработке проведения запись в регистр ОстаткиТоваров, затем проверил запросом на отрицательное количество. Возможность “бесконтрольного” проведения отдельными пользователями реализована условием в обработке проведения. Созданы регистры Продажи(обороты) и Взаиморасчеты(остатки), в обработках проведения реализованы движения по ним(Продажи – в Реализации товаров, Взаиморасчеты – Реализация и оплаты от поставщиков увеличивают долг, Поступления и оплаты от покупателей долг уменьшают). Набор храню в регистре сведений(как сделано в УТ), таким образом из регистра заполняется вспомогательная табличная часть, по которой , как и по основной, формируются движения документов. Далее сделал отчеты на СКД – проблем не возникло.
Задание выполнил. Ваше решение еще не видел.
Остатки:
– Контроль сделал по способу для 8.2, Итоговый запрос выглядит так:
ВЫБРАТЬ
ОстаткиТоваровОстатки.Номенклатура,
ОстаткиТоваровОстатки.ВидБрака,
-ОстаткиТоваровОстатки.КоличествоОстаток КАК Недостача
ИЗ
РегистрНакопления.ОстаткиТоваров.Обороты(, , Регистратор, ) КАК ОстаткиТоваровОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(&Момент, ) КАК ОстаткиТоваровОстатки
ПО (ОстаткиТоваровОстатки.Номенклатура = ОстаткиТоваровОбороты.Номенклатура)
И (ОстаткиТоваровОстатки.ВидБрака = ОстаткиТоваровОбороты.ВидБрака)
ГДЕ
ОстаткиТоваровОстатки.КоличествоОстаток < 0
И ОстаткиТоваровОбороты.Регистратор = &Ссылка
Сначала связывал Табличную часть и Остатки, но во время решения задачи по “устойчивости” наборов при перепроведении получилась подобная конструкция. Скорее всего надо было просто использовать одну вирт.таблицу ОстаткиИОбороты. Сообщения о недостаче выдаю через СообщениеПользователю. Для отмены контроля добавил 2 строчки:
Перед проверкой: ПроведениеБезКонроляОстатков = ОбщиеФункцииСервер.СинхронизацияПользователей(“”).ПроведениеБезКонроляОстатков;
В цикле: Отказ = Не ПроведениеБезКонроляОстатков;
Кнопку “Провести без контроля” реализовал на подобие печати: Создал команду у документа, в модуле менеджера прописал:
ДокОб = Док.ПолучитьОбъект();
ДокОб.ПринудительноеПроведение = Истина;
ДокОб.Записать(РежимЗаписиДокумента.Проведение);
где ПринудительноеПроведение – это переменная модуля объекта Расх.Накладной. И соответственно Если НЕ ПринудительноеПроведение Тогда идет проверка.
“Историю” набора для документа беру из набора движений Остатки товаров. Для этого создал у регистра ОстаткиТоваров 2 реквизита: Набор и КоличествоНабора. При проведении проверяю: если есть движения, то из них получаю состав, если нет, то беру состав из ТЧ справочника Номенклатуры.
ИначеЕсли СтрокаТЗ.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Набор Тогда
МассСтрок = ТЗРезНабор.НайтиСтроки(Новый Структура(“Набор”,СтрокаТЗ.Номенклатура));
Если МассСтрок.Количество() = 0 Тогда
Для Каждого СтрокаТЧСпр Из СтрокаТЗ.Номенклатура.Комплектующие Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
Движение.ВидБрака = СтрокаТЗ.ВидБрака;
Движение.Количество = СтрокаТЧСпр.Количество * СтрокаТЗ.Количество * СтрокаТЗ.Коэффициент;
Движение.Номенклатура = СтрокаТЧСпр.Комплектующая;
Движение.Период = Дата;
Движение.Набор = СтрокаТЗ.Номенклатура;
Движение.КоличествоНабора = СтрокаТЗ.Количество * СтрокаТЗ.Коэффициент;
КонецЦикла;
Иначе
Для Каждого Эл Из МассСтрок Цикл
Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
Движение.ВидБрака = СтрокаТЗ.ВидБрака;
Движение.Количество = (Эл.Количество / Эл.КоличествоНабора) * СтрокаТЗ.Количество * СтрокаТЗ.Коэффициент;
Движение.Номенклатура = Эл.Номенклатура;
Движение.Период = Дата;
Движение.Набор = СтрокаТЗ.Номенклатура;
Движение.КоличествоНабора = СтрокаТЗ.Количество * СтрокаТЗ.Коэффициент;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Услуги остатки не двигают.
Продажи и Взаиморасчеты – просто прописал движения, никаких доп опций не требовалось…В Выписке создал ТЧ и по ней сделал проведение по Взаиморасчетам. Считаю, что если сумма отрицательная, то мы должны, а если положительная, то нам.
Отчеты строил в СКД.
Долги по менеджерам:
ВЫБРАТЬ
ВзаиморасчетыОстатки.Контрагент КАК Контрагент,
ВзаиморасчетыОстатки.Контрагент.Менеджер КАК Менеджер,
ВзаиморасчетыОстатки.СуммаОстаток КАК Сумма
ИЗ
РегистрНакопления.Взаиморасчеты.Остатки(, ) КАК ВзаиморасчетыОстатки
Фильтрацию не делал, вроде не требовалась.
Прогнозируемый фин. результат:
ВЫБРАТЬ
ОстаткиТоваровОстатки.Номенклатура,
ОстаткиТоваровОстатки.КоличествоОстаток КАК Количество,
ЦеныНоменклатурыЗакуп.Цена КАК ЦенаЗакупа,
ЦеныНоменклатурыПродажа.Цена КАК ЦенаПродажи,
(ЕСТЬNULL(ЦеныНоменклатурыПродажа.Цена, 0) – ЕСТЬNULL(ЦеныНоменклатурыЗакуп.Цена, 0)) * ОстаткиТоваровОстатки.КоличествоОстаток КАК ПланируемаяПрибыль
ИЗ
РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦен.Закупочные)) КАК ЦеныНоменклатурыЗакуп
ПО ОстаткиТоваровОстатки.Номенклатура = ЦеныНоменклатурыЗакуп.Номенклатура
И ОстаткиТоваровОстатки.Номенклатура.БазоваяЕдиница = ЦеныНоменклатурыЗакуп.ЕдиницаИзмерения.ЕдиницаПоКлассификатору
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, ТипЦен = ЗНАЧЕНИЕ(Справочник.ТипыЦен.Розничные)) КАК ЦеныНоменклатурыПродажа
ПО ОстаткиТоваровОстатки.Номенклатура = ЦеныНоменклатурыПродажа.Номенклатура
И ОстаткиТоваровОстатки.Номенклатура.БазоваяЕдиница = ЦеныНоменклатурыПродажа.ЕдиницаИзмерения.ЕдиницаПоКлассификатору
Использовал предопределенные значения, можно их было вынести и в параметры, чтоб пользователи сами выбирали типы цен. Но н требовалось.
Рейтинг менеджеров:
ВЫБРАТЬ
ЕСТЬNULL(ПродажиОбороты.Менеджер,ВзаиморасчетыОстатки.Контрагент.Менеджер) КАК Менеджер,
ПродажиОбороты.СуммаОборот КАК СуммаПродаж,
ВзаиморасчетыОстатки.СуммаОстаток КАК СуммаЗадолженности,
ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) – ЕСТЬNULL(ВзаиморасчетыОстатки.СуммаОстаток, 0) КАК Рейтинг
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки
ПО ПродажиОбороты.Контрагент = ВзаиморасчетыОстатки.Контрагент
1. Новое для меня было СКД и ПВХ. ПВХ раньше использовал, но просто копировал из типовых решения (настройка пользователей). Изменился подход к контролю остатков, но пока так и не понял решения по себестоимости при продаже. В курсе про него вскользь упоминается, в типовые пока глянуть не могу.
2. Не могу выделить затруднений. Просто некоторые моменты забываются и во время практики “освежаю” в памяти пройденный материал пересматривая тот или иной момент.
3. Если брать из тем блока, то конечно СКД. Если же говорить про темы вообще, то ПланыОбмена не распределенка.
Задание выполнила, причем половину делала уже с вашим решением ДЗ, т.к. сама выполнить не смогла.
Запросы и СКД для меня самая большая проблема. Хотелось, чтобы в какой-то МГ рассмотрелись сложные запросы. Я не понимаю, что у меня будет в результате запроса, поэтому любой запрос делаю пошагово сначала в консоле.
>поэтому любой запрос делаю пошагово сначала в консоле
Это правильный подход. Чуть позже будете понимать и сможете писать запросы без консоли.
А действительно сложные запросы рассматриваются в курсе продвинутом.
Выполнила.
1) В общем модуле сделала процедуру проверки на количество. Из реализации в процедуре проведения сначала проводим по регистру остатков товара, затем формируем структуру, которую передаем в процедуру общего модуля.
// выгружаем табличную часть
Запрос = Новый Запрос;
Запрос.Текст = ”
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| &Период КАК Период,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| ВЫБОР
| КОГДА РеализацияТоваровТовар.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидНоменклатуры.Набор)
| ТОГДА РеализацияТоваровСоставНаборов.Номенклатура
| ИНАЧЕ РеализацияТоваровТовар.Номенклатура
| КОНЕЦ КАК Номенклатура,
| РеализацияТоваровТовар.Качество,
| МАКСИМУМ(РеализацияТоваровТовар.НомерСтроки) КАК НомерСтроки,
| ВЫБОР
| КОГДА РеализацияТоваровТовар.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидНоменклатуры.Набор)
| ТОГДА РеализацияТоваровСоставНаборов.Количество * РеализацияТоваровСоставНаборов.Коэффициент * РеализацияТоваровТовар.Количество * РеализацияТоваровТовар.Коэффициент
| ИНАЧЕ РеализацияТоваровТовар.Количество * РеализацияТоваровТовар.Коэффициент
| КОНЕЦ КАК Количество
|ИЗ
| Документ.РеализацияТоваров.Товар КАК РеализацияТоваровТовар
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров.СоставНаборов КАК РеализацияТоваровСоставНаборов
| ПО РеализацияТоваровТовар.Номенклатура = РеализацияТоваровСоставНаборов.Набор
|ГДЕ
| РеализацияТоваровТовар.Ссылка = &Ссылка
| И РеализацияТоваровТовар.Номенклатура.ВидНоменклатуры <> &Услуга
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовар.Качество,
| ВЫБОР
| КОГДА РеализацияТоваровТовар.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидНоменклатуры.Набор)
| ТОГДА РеализацияТоваровСоставНаборов.Номенклатура
| ИНАЧЕ РеализацияТоваровТовар.Номенклатура
| КОНЕЦ,
| ВЫБОР
| КОГДА РеализацияТоваровТовар.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидНоменклатуры.Набор)
| ТОГДА РеализацияТоваровСоставНаборов.Количество * РеализацияТоваровСоставНаборов.Коэффициент * РеализацияТоваровТовар.Количество * РеализацияТоваровТовар.Коэффициент
| ИНАЧЕ РеализацияТоваровТовар.Количество * РеализацияТоваровТовар.Коэффициент
| КОНЕЦ
|”;
Запрос.УстановитьПараметр(“Услуга”,Перечисления.ВидНоменклатуры.Услуга);
Запрос.УстановитьПараметр(“Ссылка”,Ссылка);
Запрос.УстановитьПараметр(“Период”,Дата);
ТЗТовар = Запрос.Выполнить().Выгрузить();
// создаем движения по остаткам товара
ДвиженияПоОстаткам = Движения.ОстаткиНоменклатуры;
ДвиженияПоОстаткам.Загрузить(ТЗТовар);
ДвиженияПоОстаткам.Записать();
// таб.часть передаем для проверки по остаткам
СтруктураПроверки = Новый Структура(“Граница, Товар”);
СтруктураПроверки.Граница = Новый
Граница(Дата, ВидГраницы.Включая);
ТЗТоварПроверка = ТЗТовар.Скопировать(,”Номенклатура,Качество”);
СтруктураПроверки.Товар = ТЗТоварПроверка;
Результат = МодульВызоваССервера.ПроверитьОстаткиТовара(СтруктураПроверки);
Это уже с учетом наборов. Обратно получаем выборку или Неопределено. И в зависимости от результата уже формиуем движения дальше или просто выдаем ошибки.
Кнопка из списка реализована просто с помощью глоб.переменной модуля объекта документа.
2) создан оборотный регистр Продажи, создан регистр остатков Взаимозачеты, создан документ Выписка.
3) Т.к. не требовалось отслеживать наборы по времени, то выбрала подчиненный справочник СоставНабора. В документах создала таб.часть СоставНаборов, которую заполняю при изменении номенклатуры, если номенклатура набор.
4) созданы отчеты.
По ходу дела возник вопрос: не нашлась как манипулировать панелью навигации. Например, захотелось сделать чтоб подчиненный справочник СоставНабора был виден только когда у номенклатуры выбран вид Набор.
Еще проблемка в открытии модальной формы из документа реализации (просмотр набора): не получается установить отбор в открывающейся форме. Но я думаю это решится со временем.
Очень интересно было сравнение проведений документов в 82 и 81. Трудностей в понимании материала никаких не возникло, но 9 задание достаточно сложное и пришлось посидеть над ним.
>подчиненный справочник СоставНабора был виден только когда у номенклатуры выбран вид Набор
К сожалению, управляемым интерфейсом нельзя манипулировать программно. Поэтому такой возможности нет.
>не получается установить отбор в открывающейся форме
Задачу не совсем понял. Но общая рекомендация такая: для передачи произвольного отбора нужно перехватывать событие открытия формы, отменять его, открывать форму программно с указанными параметрами (отбором, …).
Задание выполнено. Не получилось реализовать работу с наборами.
Вопрос 1. Новой была информация о концепции проведения документов в 8.2, отличной от 8.1.
Вопросы 2, 3. Теоретический материал изложен очень хорошо, все понятно. Затруднения происходят с реализацией конкретных задач, с принятием решений, как именно организовать хранение данных в БД, как их более оптимально обрабатывать. Эти темы и хотелось бы рассмотреть в мастер-группе.
Задание выполнил.
В документе РеализацияТоваров создал процедуру ОбработкаПроведения. В которой делаю движения по регистру ОстаткиНоменклатуры (ресурс Количество =Количечтво*Коэф ) и далее делаю проверку по отрицательным остаткам. Для получения остатков использую запрос аналогичный запросу показанный в уроках по условному проведению, единственно добавляю еще одно условие связи таблиц по полю Качество. Если Результат запроса не пустой, то параметру Отказ присваиваю Истина, при условии что у текущего пользователя не стоит признак «ПроводитьБезКотроля» (реквизит спр. Пользователи). Его значение получаю так: ОбщиеФункцииСервер.СинхронизацияПользователей().ПроводитьБезКотроля.
Задачу по проведению из списка без проверки решил следующим образом:
Создал экспортную переменную ПроводитьБезПроверки в модуле док-та РеализацияТоваров, в модуле формы создал процедуру НаСервереБезКонтекста, в которой из ссылки получаю объект док-та, перем. ПроводитьБезПроверки=Истина и записываю с режимом записи Проведение.
Наборы реализовал следующим образом: Создал документ «Создать набор» в шапке выбирается товар набор в таб. Части комплектующие и количество. При проведение документ двигает регистр сведений Наборы (Измерения Набор (спр. Номенклатура) и Номер (число, номер строки в таб. части). Ресурсы Товар и Количество ). В документах поступление и реализация изменил запрос получения данных для движений, где еще получаю и комплектующие и их количество. Отчеты сделал, проблем не возникло.
не хватило время… пока пропустил ДЗ ограничившись просмотром решения…
ДЗ сложное и нужно что то промежуточное…. )=
Задание выполнено.
Задача выполнена все ОК. Реализовал одну из 3 известных схем работы с наборами.
Задание выполнено.
1. Проведение документа “РеализацияТовара”.
В справочник “Пользователи” добавлен реквизит “КонтрольОстатков” типа “Булево”.
Создан регистр оборотов “Продажи” с измерениями “Номенклатура”(тип Номенклатура) и ресурсами “Количество” и “Сумма”.
В форме списка документа “РеализацияТовара” создана команда “Провести без контроля”.
Код реализации действий этой команды:
Модуль формы:
&НаКлиенте
Процедура ПровестиБезКонтроля(Команда)
ПровестиБезКонтроляСервер(Элементы.Список.ТекущаяСтрока);
Элементы.Список.Обновить();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПровестиБезКонтроляСервер(Ссылка)
ДокОбъект = Ссылка.ПолучитьОбъект();
ДокОбъект.ПровестиБезКонтроля();
КонецПроцедуры // ПровестиБезКонтроляСервер()
Модуль объекта:
Процедура ПровестиБезКонтроля() Экспорт
ВыполнитьДвиженияПоРегистрам();
Движения.ОстаткиТоваров.Записать();
Проведен = Истина;
Записать();
КонецПроцедуры
Взаиморасчеты.
Поступление товара – Расход (мы должны). Реализация товар – для на Приход (нам должны).
Создан регистр остатков “Взаиморасчеты”. Измерения: “Контрагент”(тип справочник “Контрагенты”).
Ресурсы: Сумма.
Добавлено движение по регистру “Взаиморасчеты” для документа “Поступление товара”
ТаблицаЗапроса.Свернуть(“Период, Контрагент”, “Сумма”);
Если ТаблицаЗапроса.Количество > 0 Тогда
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
Движение.Период = ТаблицаЗапроса[0].Период;
Движение.Контрагент = ТаблицаЗапроса[0].Контрагент;
Движение.Сумма = ТаблицаЗапроса[0].Сумма;
КонецЕсли;
Добавлено движение по регистру “Взаиморасчеты” для документа “Реализация товара”
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Сумма = Товары.Итог(“Сумма”);
Создан документ “Выписка”.
Приход – платят нам. Расход – платим мы. Код обработки проведения
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;
Для Каждого ТекСтрокаПриходРасход Из ПриходРасход Цикл
Если ТекСтрокаПриходРасход.Приход <> 0 Тогда
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаПриходРасход.Контрагент;
Движение.Сумма = ТекСтрокаПриходРасход.Приход;
КонецЕсли;
Если ТекСтрокаПриходРасход.Расход <> 0 Тогда
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаПриходРасход.Контрагент;
Движение.Сумма = ТекСтрокаПриходРасход.Расход;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Работа с наборами.
Не сделано. Возникли трудности при реализации.
Отчеты сделаны с помощью СКД.
Выполнил в попыхах. Все получилось! Приступаю к просмотру решению ДЗ №9. Пытаюсь догнать курс, так как сложно найти время для того, чтобы успевать вовремя, благо впереди выходные можно будет подтянуться)))
Задание выполнил в попыхах. Все получилось! Приступаю к просмотру решения дз. Пытаюсь нагнать курс, так как темп очень быстрый, сложно успевать, благо впереди выходные можно будет все успеть))) Спасибо.
Создал план видов характеристик, регистр сведений и справочник для настройки дополнительных прав пользователя (проверять остаток номенклатуры или нет). В общем модуле ДвиженияПоРегистрамСервер создал процедуры, которые создают движения в момент проведения документов по следующим регистрам: ОстаткиНоменклатуры, Продажи, Закупки,
ВзаиморасчетыСКонтрагентами.
По регистру накопления ОстаткиНоменклатуры движения записываются только для номенклатуры с видом Товар. Номенклатура с видом Набор “расшифровывается” перед записью в регистр. Движения по услугам не регистрируются. Проверка на отрицательный остаток осуществляется с помощью пакетного запроса. При этом проверяется наличие необходимой номенклатуры с необходимым качеством на МоментВремени документа: Запрос.УстановитьПараметр(“Дата”, Новый Граница(Документ.МоментВремени(), ВидГраницы.Включая)).
Далее, в зависимости от того, осуществляется контроль остатка для текущего пользователя или нет, выставляем для переменной Отказ значение Истина или Ложь. Таким образом, мы сначала делаем движения по регистру, потом проверяем на отрицательный остаток, а потом присваиваем параметру Отказ необходимое значение.
Создана кнопка, позволяющая сделать движения по документу реализации прямо из списка документов. При этом значение реквизита Проведен документа не устанавливается в истину.
Создан документ Выписка, в табличной части которого указывается вид движения денежных средств, контрагента и сумму. Для ведения взаиморасчетов по контрагентам был создан одноименный регистр накопления с видом Остатки. Регистраторами для него являются документы: ПоступлениеТоваров, РеализацияТоваров, Выписка.
Для учета наборов создан непериодический подчиненный регистр сведений НаборыНоменклатуры с измерениями Набор и Номенклатура. Оба измерения имеют тип СправочникСсылка.Номенклатура. Также присутствует ресурс КоличествоВНаборе. Набор создается при помощи документа Набор. В этом документе в реквизитах указываем номенклатуру-набор, а в табличной части – состав набора.
При помощи СКД созданы необходимые отчеты.
1. Повторил уже пройденный ранее материал. На многие вещи взглянул с другой точки зрения.
2. Затруднений не возникало.
3. Интересно было бы более подробно рассмотреть тему запросов, а точнее возможные “особенности” и глюки в поведении платформы, при исполнении запросов. Хотя, возможно, это тема для мастер-группы продвинутого курса.
Задание выполнено.
Сначала было исправлено задание №8 в части перепроведения/отмены проведения документа “КонтактСКлиентом”; проверка по движениям номенклатуры перенесена в обработчик “ОбработкаПроверкиЗаполнения”, движения документа поступления формируются с помощью метода “Загрузить” набора записей, добавлен реквизит “Коэффициент” в документы поступления/реализации.
Основные моменты при решении задания №9:
1. Хранение данных о наборах реализовано с помощью непериодического регистра сведений с измерениями: Набор, Комплектющая (оба измерения имеют тип СправочникСсылка.Номенклатура”); ресурс: Количество. Для задания/изменения состава набора сделан специальный документ, который в качестве набора позволяет выбрать номенклатуру с видом “Набор”, а в качестве комплектующих – номенклатуру с видом “Товар”. Если по набору имеются движения в регистрах, то менять его состав нельзя. Также для упрощения задачи принято жесткое условие: если элемент справочника “Номенклатура” записан, то изменить вид номенклатуры нельзя.
2. Реализован контроль остатков для документа “Реализация”, есть возможность устанавливать контроль остатков для конкретного пользователя (завел булевский реквизит в справочнике “Пользователи”), возможность безусловного проведения документа (с помощью экспортной процедуры модуля объекта). В документах отгрузки/поступления наборы автоматически трансформируются в комплектующие, для услуг не делается движений по регистрам остатков.
3. Добавлен регистр для учета взаиморасчетов с контрагентами, документ “Выписка”. Измерения регистра: “Контрагент”, “ВидОперации”, ресурс: “Сумма”. При этом “ВидОперации” может принимать 2 значения – расчеты с поставщиками или расчеты с покупателями. Это измерение используется при построении отчета “Рейтинг менеджеров”, где имеет смысл учитывать задолженность контрагентов, возникающую благодаря продажам менеджеров (взаиморасчеты с покупателями).
4. Все отчеты выполнил с помощью системы компоновки данных.
Обратная связь:
1. Узнал много нового: условное проведение, работа с наборами записей, СКД и много другого.
2. Основное затруднение с темой “Условное проведение”. Общая картина понятна, однако осталось несколько вопросов, которые я отправил на ящик мастер-группы.
3. Подробнее хотелось бы рассмотреть СКД, однако я полагаю, что работа этого механизма будет раскрываться далее по ходу курса.
Задание выполнено
Изменение и добавление метаданных.
1.Создал оборотный регистр накопления «Продажи».
2.В документ «реализация товаров» добавил реквизит «менеджер» для записи информации в регистр «Продажи».
3.Создал остаточный регистр накопления «ВзаиморасчетыСКонтрагентами»: измерения – контрагент; ресурс – сумма.
4.Создал документ «Выписка». Добавил табличную часть с реквизитами «контрагент», «Сумма приход» и «Сумма расход».
5.В документы «Поступления товаров» и «Реализация товаров» добавил табличную часть «услуги».
6..Создал регистр сведений «Состав набора»: измерения – номенклатура, комплектующая; ресурсы – количество, единица измерения.
7.В справочник «Пользователи» добавлен реквизит «Контроль остатков».
Обработка операций.
1.При проведении реализации товаров осуществлен контроль остатков по регистру «остатки номенклатуры». Применен алгоритм рекомендованный в уроках, т.е. сначала запись в регистр, а затем проверка на отрицательные остатки. Если у пользователя установлен признак «контроль остатков» и по остаткам товара сформируются отрицательные остатки, то документ не будет проведен. Если у пользователя снят признак «контроль остатков», то диагностическое сообщение будет выдано и документ будет проведен. Добавлены движения по регистру «взаиморасчетов» и регистру «продажи». Добавлена обработка таб. части «услуги». По таб.части «услуги» движения осуществляются только по регистру «продажи». По регистру «взаиморасчеты» сумма по услугам включена в общую сумму документа.
2.По документу «поступление товаров» добавил движения в регистр «Взаиморасчеты с контрагентами», добавил обработку таб. части «услуги».
3.По документу «Выписка» движения только по регистру «ВзаиморасчетыСКонтрагентами».
Все отчеты строятся с помощью компоновки.
1.Долги по менеджерам. В отчете используется таблица остатков регистра «ВзаиморасчетыСКонтрагентами» и данные из рег. сведений «МенеджерыКонтрагентов».
2.Прогноз. финансовый результат. Ипользуется таблица остатков регистра «остатки номенклатура» и рег.сведений «цены номенклатуры».
3.Рейтингм менеджеров. Используется таблица оборотов регистра «Продажи» и таблица остатков регистра «ВзаиморасчетыСКонтрагентами».
Задание сделала не до конца по причине “не успела”. Руки не дошли до отчетов.
В справочник Пользователи добавила ,булевский реквизит «НетКонтроляОстатков».
Добавила регистр остатков ОстаткиНоменклатуры, Взаиморасчеты и оборотный регистр Продажи.
Описала модуль проведения документа РеализацияТоваровИУслуг согласно методике, описанной в видеоуроках.
Создала документ Выписка, описала движения по регистру Взаиморасчеты.
Добавила справочник Наборы, подчиненный справочнику Номенклатура с реквизитами Номенклатура, Количество, Единица измерения. Изменила модуль проведения докумета ПоступленияТоваров с учетом вида номенклатуры. Если вид номенклатуры = услуги, то движения по регистру остатков не делаю, если это набор – делаю движения по составу набора из справочника.
В справочнике «Пользователи» добавлен реквизит «КонтрольОстатковПриПроведении»
Создаем оборотный РН «Продажи» с заданной структурой
Создаем РС «СоставНабора» с обработчиком:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
ВидНоменклатурыНабор = Перечисления.ВидыНоменклатуры.Набор;
ВидНоменклатурыТовар = Перечисления.ВидыНоменклатуры.Товар;
Для Каждого Проводка Из ЭтотОбъект Цикл
Индекс = ЭтотОбъект.Индекс(Проводка);
Если Не Проводка.Набор.ВидНоменклатуры = ВидНоменклатурыНабор Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = “Не указан набор”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Не Проводка.Номенклатура.ВидНоменклатуры = ВидНоменклатурыТовар Тогда
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = “Не указана номенклатура”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
4. В документе «РеализацияТоваров» добавляем обработчик:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиНоменклатуры.Очистить();
Движения.Продажи.Очистить();
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Продажи.Записывать = Истина;
БД = Новый БлокировкаДанных;
БД_ОстНом = БД.Добавить(“РегистрНакопления.ОстаткиНоменклатуры”);
БД_ОстНом.ИсточникДанных = Товары;
БД_ОстНом.ИспользоватьИзИсточникаДанных(“Номенклатура, Качество”,”Номенклатура, Качество”);
БД_ОстНом.Режим =РежимБлокировкиДанных.Исключительный;
БД.Заблокировать();
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваровТовары.НомерСтроки,
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.ЕдиницаИзмерения,
| РеализацияТоваровТовары.К,
| РеализацияТоваровТовары.Качество,
| РеализацияТоваровТовары.Количество,
| РеализацияТоваровТовары.Цена,
| РеализацияТоваровТовары.Сумма,
| РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры
|ПОМЕСТИТЬ ТоварТЧ
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварТЧ.НомерСтроки,
| ТоварТЧ.Номенклатура,
| ТоварТЧ.ЕдиницаИзмерения,
| ТоварТЧ.К,
| ТоварТЧ.Качество,
| ТоварТЧ.Количество
|ПОМЕСТИТЬ ВТ_Товара
|ИЗ
| ТоварТЧ КАК ТоварТЧ
|ГДЕ
| ТоварТЧ.ВидНоменклатуры <> ЗНАЧЕНИЕ(перечисление.видыноменклатуры.набор)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ТоварТЧ.НомерСтроки,
| СоставНабора.Номенклатура,
| ТоварТЧ.ЕдиницаИзмерения,
| ТоварТЧ.К,
| ТоварТЧ.Качество,
| ТоварТЧ.Количество * СоставНабора.Количество
|ИЗ
| ТоварТЧ КАК ТоварТЧ
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставНабора КАК СоставНабора
| ПО ТоварТЧ.Номенклатура = СоставНабора.Набор
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Товара.НомерСтроки,
| ВТ_Товара.Номенклатура,
| ВТ_Товара.ЕдиницаИзмерения,
| ВТ_Товара.К,
| ВТ_Товара.Качество,
| ВТ_Товара.Количество
|ИЗ
| ВТ_Товара КАК ВТ_Товара”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// регистр ОстаткиНоменклатуры Расход
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Движение.Качество = ВыборкаДетальныеЗаписи.Качество;
Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
КонецЦикла;
Движения.Записать();
Запрос.Текст =
“ВЫБРАТЬ
| СРЕДНЕЕ(ОстаткиНоменклатурыОстатки.КоличествоОстаток) КАК КоличествоОстаток,
| ВТ_Товара.НомерСтроки,
| ВТ_Товара.Номенклатура
|ИЗ
| ВТ_Товара КАК ВТ_Товара
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(&ДатаОстатков, ) КАК ОстаткиНоменклатурыОстатки
| ПО ВТ_Товара.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
| И ВТ_Товара.Качество = ОстаткиНоменклатурыОстатки.Качество
|ГДЕ
| ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0
|
|СГРУППИРОВАТЬ ПО
| ВТ_Товара.НомерСтроки,
| ВТ_Товара.Номенклатура”;
Запрос.УстановитьПараметр(“ДатаОстатков”, Новый Граница(Дата, ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Индекс = ВыборкаДетальныеЗаписи.НомерСтроки;
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = “В строке ” + Индекс + ” нехватает номенклатуры “+ВыборкаДетальныеЗаписи.Номенклатура+” ” + ВыборкаДетальныеЗаписи.КоличествоОстаток;
Сообщение.Поле = “[” + Индекс + “].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
Пользователь = ОбщиеФункцииСервер.СинхронизацияПользователей();
Если НЕ Результат.Пустой() И Пользователь.КонтрольОстатковПриПроведении Тогда
Отказ = Истина
КонецЕсли;
Для Каждого ТекСтрокаТовары Из Товары Цикл
// регистр Продажи
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Менеджер = КонтактноеЛицо;
Движение.Количество = ТекСтрокаТовары.Количество;
Движение.Сумма = ТекСтрокаТовары.Сумма;
КонецЦикла;
КонецПроцедуры
5. Добавляем отчеты (затрудней небыло)
Создал булевский реквизит НеКонтролироватьОтрицательныеОстатки в спр-ке Пользователи.
Для хранения комплектации наборов использовал РС Наборы
Создал оборотный РН Продажи и РН Взаиморасчеты, документ Взаиморасчеты
Для устойчивости перепроведения док-та Реализация создал ТЧ Списание с реквизитами Номенклатура,Качество,Количество,НомерСтрокиТовары (для будущего контроля).
В процедуре ПередЗаписью результат запроса <code>
“ВЫБРАТЬ
| ЕСТЬNULL(Наборы.Комплектующая, РеализацияТоваровТовары.Номенклатура) КАК Номенклатура,
| ЕСТЬNULL(Наборы.Количество * РеализацияТоваровТовары.Количество, РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.К) КАК Количество,
| ЕСТЬNULL(Наборы.Качество, РеализацияТоваровТовары.Качество) КАК Качество,
| РеализацияТоваровТовары.НомерСтроки КАК НомерСтрокиТовары
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Наборы КАК Наборы
| ПО (Наборы.Набор = РеализацияТоваровТовары.Номенклатура)
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка”; </code>
выгружаю в ТЧ.
В процедуре ОбработкаПроведения() получаю пользователя из ОбщиеФункцииСервер.СинхронизацияПользователей. Из аналогичной процедуры получаю флаг РазрешитьПроведениеСОтрицательнымиОстатками для текущего пользователя.
Затем создаю движения по регистрам ОстаткиНоменклатуры, Продажи, Взаиморасчеты.
Для регистра ОстаткиНоменклатуры движения записываю. Затем выполняю контроль остатков запросом. Если пользователю разрешено продавать остатки в минус, то Отказ в истину не ставлю.
Номер строки по которой вылез минус беру из реквизита ТЧ списание.
В форме списка документов создал команду проведения документа из текущей строки списка. Отключение контроля отрицательных остатков передаю в ОбработкуПроведения через переменную в параметрах сеанса.
Отчеты создал.
1. Первая часть выполнена примерно так, как показано в видео уроках. В процедуре Обработка проведения выполняются движения по регистру Остатки товаров. Затем выполняется запрос к виртуальной таблице остатки, регистра “ОстаткиТоваров”, результат запроса возвращает наименование номенклатуры и остаток товара, если остаток меньше нуля, то выполняется отказ проведения. В документ добавлен реквизит “Отключение контроля” (тип данных булево), перед выполнением отказа в проведении проверяется, взведен ли флаг. На форме также реализована кнопка “Проводка без контроля”, при нажатии на которую выполняется безусловное проведение (процедура в серверном модуле).
2. Создан регистр накопления “Учет продаж” с видом обороты. Обеспечено его заполнение при проведении документа Продажи.
3.Создан документ “Выписка” и Регистр накопления “Взаиморасчеты”. По регистру реализованы движения в документах поступления и продажи .
4.Реализованы отчеты.
5. Не выполнена часть задания с наборами.
__________________________________________________
Ответы на вопросы:
1. Поскольку изучаю 1С с нуля, то собственно любая информация в любом блоке для меня является новой.
2. Затруднения возникают во многих темах, достаточно трудно было с регистрами, частично преодолеть получается при повторном просмотре материалов, поиске дополнительной информации, а также изучении решений других участников.
3. На мастер-группы времени не хватает, успеваю только просматривать материал и выполнять задания, да и то с последним справился не до конца
И действительно очень не хватает форума для участников, это бы несколько облегчило процесс обучения.
1. Добавил в справочник “Пользователи” реквизит “КонтрольОстатков” вариантов много, но в данной ситуации выбрал этот.
На документе “РеализацияТоваров” в обработке проведения проверяю реквизит “КонтрольОстатков” по текущему пользователю.
В запросе выбрал из табличной части документа строки номенклатуры по документу и по дате(используя границу), сгруппировав по номенклатуре и взял минимум от номера строки.(Перещитавы количество в базовое левое соединение со спрвочником “ЕдиницыИзмерения”)
поместил это во временную таблицу, далее другим пакетом временную таблицу связал левым соединением с таблицей остатков по номенклатуре и качеству, высчитал разницу.
перебираю результат запроса. Если количество отрицательное выдаю сообщение пользователю на самую верхнюю строку(в запросе на номер строки функция минимум) в форме на строки табличной части.
Движения записываю только в том случае если есть остаток и только его списываю, пустышки отсеиваю.
Добавил на форме списка команду на команде определил вызов серверного метода без контекста в котором по выделенной строке выполняю проведение документа по регистру остатки товаров.( В модуле документа объекта определил экспортную процедуру к которой обращаюсь)
2. Добавил Регистр Накопления “Продажи” заполнение регистра добавил в обработку проведения в модуле документа объекта, добавляю количество с контролем остатка на складе сумму также пересчитываю находящееся на складе количество.
3.Добавил документ “Выписка” в табличной части реквизит контрагент, сумма прихода, суммарасхода.
4. Добавил Регистр Накопления “ВзаиморасчетыСКонтрагентами” вид регистра Остатки, изсерения сотрудник и контрагент, в документе “Выписка” воспользовался конструктором заполнения движения стандартным, после изменил : проверяю на наличие в реквизитах сумм значений и если есть добавляю, даже если оба реквизита заполнены.
Также добавил заполнение регистра в документы реализации и поступления.
В поступлении добавляю поступлении контрагента и сумму документа добавитьПриход
В авансовом отчёте сотрудника и сумму документа добавитьПриход()
Документ Авансовыйотчет В обработке проведения(модуль объекта) лишняя строка параметр к запросу(контрагент пустая ссылка делал на основании базы домашнего задания 8, может это важно)
Первая Часть домашнего задания, Если не опишу то времени уже не будет. Продолжение следует
Вторая Часть ДЗ.
5. Добавил в документах поступлений и реализаций табличную часть Услуги. Учитываю их при заполнении регистра взаиморасчетов. (можно было бы добавить и сумму документа В продажи товаров, но решил потренироватся)
6. Создал регистр сведений “СоставыНаборов” измерения Набор(справочник Номенклатура,указал параметр выбора набор) и номенклатура, ресурс количество.
В запросах, находящихся в модулях объектов документов в процедурах обработки проведения определяю, что за номенклатура(набор, товар, услуга) и функцией “Выбор” пересчитываю в Базовые Е.И., если есть ошибка выдаю на номер строки набора.Наборы выбираем также, как и номенклатуру в табличной части товары. Создавание наборов сделал только пользовательским напрямую в регистре, хотя и создал форму набора записей.
С отчётами особых трудностей не возникло, имел некий опыт в 1с 8.1.
1. Что нового я узнал во втором блоке или в чем поменялись взгляды после изучения
материала?
2. В какой теме были наибольшие затруднения, и что помогло их преодолеть?
3. Какую тему вы бы хотели подробнее раскрыть в мастер-группе
1. Что нового я узнал во втором блоке или в чем поменялись взгляды после изучения материала?
СКД и даты, стандартные периоды. и работа с ними.
2. В какой теме были наибольшие затруднения, и что помогло их преодолеть?
Все вопросы помогает преодолеть Повторная вычитка материала интересующего при разборе ДЗ, Синтаксис -помошник и практика.
3. Какую тему вы бы хотели подробнее раскрыть в мастер-группе?
До мастер-группы никак не могу добраться. Этим надо заниматься и уделять больше времени, выкусываю время где могу ))
Задание выполнил но не доконца, много с чем не разобрался. :((
Завтра будет решение, разберетесь..
Задание выполнил. Правда не знаю, вложился ли в срок :(.
Резюме:
1. Контроль остатка при проведении реализовал 2 способами: классически – получаются остатки товара по списку в таб. части, в цикле проверяется условие ТекущийОстаток – Количество => 0, если условие нарушается – то выводится предупреждение; вторым способом – записываются движения документа, потом анализируются остатки товара на предмет отрицательных, если они есть – то отмена проведения и уведомление. Контроль остатков – реквизит спр. Пользователи.
2. Рег. нак. Продажи (оборот, изм. Контрагент, Менеджер (спр. Пользователи), Номенклатура, все индексированы, ресурсы – Количество, Сумма). С заполнением проблем не возникло.
3. Рег. нак. Взаиморасчеты (оборот, изм. Контрагент, рес – Сумма). Документ Выписка, таб. часть Взаиморасчеты: Контрагент, СуммаПрихода, СуммаРасхода. С заполнением регистра проблем не возникло.
4. Для услуг в док. прихода/расхода создал таб. часть Услуги (Номенклатура, Сумма). В параметрах выбора номенклатуры отбор по виду номеклатуры.
5. Для наборов создал в спр. Номенклатура таб. часть Комплектующие (так как историю хранить не нужно). С проводками по остаткам проблем не возникло.
6. Отчеты сделал с помощью конструктора запросов с обработкой результата – вывод в таб. документ.
Ответы на вопросы:
1. Большая часть модуля была знакома, взгляд поменялся на проверку отрицательных остатков.
2. Регистры накопления и запросы – очень объемно освещенные темы. Но это положительные момент.
3. Не сделал вывод, в чем отличия и преимущества хранения информации в таб. части справочника или в независимом регистре сведений.
Вы уложились, все ок.
>в чем отличия и преимущества хранения информации в таб. части справочника или в независимом регистре сведений
Отличие в том, что в регистре поддерживается уникальность записей по набору измерений и периоду.
Задание выполнил частично… требуется отладка и совсем уже запутался, с таким плотным графиком и потоком информации в мой мозг.
Курс иногда просматриваю по два с половиной раза.. Жаль нет ускорителя в защищенных видео, как в VLC или KMPlayer.
Правильно говорит ilia задания лучше давать не из задания в задание а хоть, как то раздельно.
Ответы на вопросы
Что я узнал нового, так это 90% всей информации… не работал я до этого ни с какой 1С.
Затруднения в запросах, правильности построения этих самых запросов.
Хотелось бы подробнее про запросы и компоновку данных.
С заданием не справился. Споткнулся с условным проведением (с выбором параметров виртуальной таблицы Остатки Товаров Остатки). Регистр продаж создал, его заполнение обеспечил. С документом Выписка проблем не было. Заполнение регистра Взаиморасчеты организовал. Как красиво организовать набор не догадался. Отчеты просто не успел сделать.
Ответы: 1. Нового очень много. Но изучать интересно.
2. Повторю еще раз тему регистров и запросов.
3. Предложение ilia по организации домашних заданий поддерживаю.
Задание выполнено до, отчетов..не хватило время на отчеты. Много времени тратится на “навороты”.
Опыта по созданию отчета недостаточно поэтому хотелось бы иметь задания от простых к сложным. И словесное описание отчетов Без их внешнего вида “останавливает мысль”, так как нет уверенности , что правильно понято условие, а также нет уверенности что все сформировано правильно до задания по отчетам , что в свою очередь “отнимает силы”. Задание большое , но с отчетами хотелось бы разобраться хорошо. Может представить законченню базу (CD) и на ней попрактиковаться в отчетах, а также , что не менее важно разобраться в терминологии принятой для описания требований и решений. Очень хотелось бы по окончанию 2 блока этот этап “Закрыть”
Пожелание по внешнему виду отчетов записал.
Не совсем понял, что понимается под законченной базой. База с решением ДЗ№9 традиционно будет выложена вместе с видео-решением (в ближайшее время).
Считаю выполнил частично, так как были проблемы в проведении документов (связанных с Наборами, не реализовал выдачу информации пользователю, если не хватает остатков по набору, просто сообщение, что нехватка, но только по набору.)
1.Создал реквизит у справ-ка Пользователи РазрешитьМинусовыеОстатки типа Булево. При открытии эл-та спр-ка Пользователи проверяю если текущий пользователь Администратор, если нет, то запрещаю редактировать данный реквизит. Проверка выполняется в обработке формы эл-та ПриСозданииНаСервере.
Задачу с кнопкой в форме списка реализации и проведении документа без контроля реализовал так: создал форму списка и в ней кнопку Проведение без контроля с кодом:
<cod>
&НаКлиенте
Процедура ПровестиБезКонтроля(Команда)
ПровестиНаСервере(Элементы.Список.ТекущаяСтрока);
ОповеститьОбИзменении(Элементы.Список.ТекущаяСтрока);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПровестиНаСервере(СсылкаНаДокумент)
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ДокОбъект.Движения.ОстаткиТоваров.Записывать = Истина;
ДокОбъект.Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| РеализацияТоваровТовары.Ссылка.Дата КАК Период,
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент) КАК Количество,
| РеализацияТоваровТовары.Качество
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Качество,
| РеализацияТоваровТовары.Ссылка.Дата”;
Запрос.УстановитьПараметр(“Ссылка”, СсылкаНаДокумент);
ДокОбъект.Движения.ОстаткиТоваров.Загрузить(Запрос.Выполнить().Выгрузить());
ДокОбъект.Движения.Записать();
ДокОбъект.Проведен = Истина;
ДокОбъект.Записать();
КонецПроцедуры // ПровестиНаСервере()
&НаКлиентеПроцедура ПровестиБезКонтроля(Команда) ПровестиНаСервере(Элементы.Список.ТекущаяСтрока); ОповеститьОбИзменении(Элементы.Список.ТекущаяСтрока); КонецПроцедуры
&НаСервереБезКонтекстаПроцедура ПровестиНаСервере(СсылкаНаДокумент)
ДокОбъект = СсылкаНаДокумент.ПолучитьОбъект(); ДокОбъект.Движения.ОстаткиТоваров.Записывать = Истина; ДокОбъект.Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина; Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения, | РеализацияТоваровТовары.Ссылка.Дата КАК Период, | РеализацияТоваровТовары.Номенклатура, | СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент) КАК Количество, | РеализацияТоваровТовары.Качество |ИЗ | Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары |ГДЕ | РеализацияТоваровТовары.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РеализацияТоваровТовары.Номенклатура, | РеализацияТоваровТовары.Качество, | РеализацияТоваровТовары.Ссылка.Дата”; Запрос.УстановитьПараметр(“Ссылка”, СсылкаНаДокумент); ДокОбъект.Движения.ОстаткиТоваров.Загрузить(Запрос.Выполнить().Выгрузить()); ДокОбъект.Движения.Записать(); ДокОбъект.Проведен = Истина; ДокОбъект.Записать(); КонецПроцедуры // ПровестиНаСервере()
</cod>
Создал регистр продажи. Создал у документа Реализации реквизит Менеджер и при создании формы проверяю если новый документ создается, то присваиваю менеджера:
<cod>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Ключ.Пустая() Тогда
Объект.Менеджер = ОбщийМодульНаСервере.ПолучитьТекущегоПользователя();
КонецЕсли;
КонецПроцедуры
</cod>
Создал регистр накопления взаиморасчеты типа Остатки. Создал документ выписка с таб частью по тех. заданию. обработка проведения у выписки след.:
<cod>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ВыпискаВзаиморасчеты.Ссылка.Дата КАК Период,
| ВыпискаВзаиморасчеты.Контрагент КАК Контрагент,
| ВЫБОР
| КОГДА ВыпискаВзаиморасчеты.СуммаПриход – ВыпискаВзаиморасчеты.СуммаРасход < 0
| ТОГДА -(ВыпискаВзаиморасчеты.СуммаПриход – ВыпискаВзаиморасчеты.СуммаРасход)
| ИНАЧЕ ВыпискаВзаиморасчеты.СуммаПриход – ВыпискаВзаиморасчеты.СуммаРасход
| КОНЕЦ КАК Сумма,
| ВЫБОР
| КОГДА ВыпискаВзаиморасчеты.СуммаПриход – ВыпискаВзаиморасчеты.СуммаРасход < 0
| ТОГДА ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
| ИНАЧЕ ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
| КОНЕЦ КАК ВидДвижения
|ИЗ
| Документ.Выписка.Взаиморасчеты КАК ВыпискаВзаиморасчеты
|ГДЕ
| ВыпискаВзаиморасчеты.Ссылка = &Ссылка”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Движения.ВзаиморасчетыСКонтрагентами.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
</cod>
Задание с наборами. Я бы конечно создал лучше еще один документ Комплектация и там бы списывал одно, а на приход ставил набор, но делал как по ТЗ. Для этого я создал таб. часть у справочника Номенклатура с полем Спецификация типа спр-к Номенклатура и полем Количество. при выборе номенклатуры в этой таб части я вызываю форму выбора номенклатуры след. образом:
<cod>
&НаКлиенте
Процедура СпецификацииСпецификацияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ПараметрыФормы = Новый Структура(“Отбор”, ПолучитьУсловиеОтбора());
Элементы.Спецификации.ТекущиеДанные.Спецификация = ОткрытьФормуМодально(“Справочник.Номенклатура.ФормаВыбора”, ПараметрыФормы);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьУсловиеОтбора()
Возврат Новый Структура(“ВидНоменклатуры”, Перечисления.ВидыНоменклатуры.Товар);
КонецФункции // ()
</cod>
И получаю в выборе только номенклатуру с видом Товар.
Соответственно при выборе видов номенклатуры кроме набора, я эту таб. часть делал недоступной.
Создал таб часть спецификации у документов поступления и расход. У этой таблицы будут колонки Набор типа ссылка на Номенклатуру, Спецификация типа Номенлатура, количество и коэффициент.
Спецификации я заполняю автоматически при интерактивной записи из формы документа:
<cod>
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
ОбщийМодульНаСервере.ЗаполнитьСпецификации(ТекущийОбъект);
КонецПроцедуры
</cod>
а процедура в общем модуле след.:
<cod>
Процедура ЗаполнитьСпецификации(ТекущийОбъект) Экспорт
ТекущийОбъект.Спецификации.Очистить();
Для каждого ТекСтрока Из ТекущийОбъект.Товары Цикл
Если ТекСтрока.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Набор Тогда
Отбор = Новый Структура(“Набор, Качество”, ТекСтрока.Номенклатура, ТекСтрока.Качество);
МассивСтрок = ТекущийОбъект.Спецификации.НайтиСтроки(Отбор);
Если МассивСтрок.Количество() = 0 Тогда
Для каждого СтрокаНабора Из ТекСтрока.Номенклатура.Спецификации Цикл
НоваяСтрока = ТекущийОбъект.Спецификации.Добавить();
НоваяСтрока.Набор = ТекСтрока.Номенклатура;
НоваяСтрока.Спецификация = СтрокаНабора.Спецификация;
НоваяСтрока.Качество = ТекСтрока.Качество;
НоваяСтрока.Количество = СтрокаНабора.Количество;
НоваяСтрока.К = ТекСтрока.Коэффициент*ТекСтрока.Количество;
КонецЦикла;
Иначе
Для каждого СтрокаСпецификация Из МассивСтрок Цикл
СтрокаСпецификация.К = СтрокаСпецификация.К + ТекСтрока.Коэффициент*ТекСтрока.Количество;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры // ()
</cod>
В итоге приведу еще коды обработки проведения Прихода :
<cod>
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиТоваров.Записывать = Истина;
Движения.Закупки.Записывать = Истина;
Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Если ТекСтрокаТовары.ЕдиницаИзмерения.ЕдиницаПоКлассификатору <> ТекСтрокаТовары.Номенклатура.БазоваяЕдиницаИзмерения Тогда
Колво = ТекСтрокаТовары.Количество * ТекСтрокаТовары.Коэффициент;
Иначе
Колво = ТекСтрокаТовары.Количество;
КонецЕсли;
Движение = Движения.Закупки.Добавить();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Количество = Колво;
Движение.Стоимость = ТекСтрокаТовары.Сумма;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.Текст = “ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| ПоступлениеТоваров.Контрагент,
| ПоступлениеТоваров.СуммаДокумента КАК Сумма,
| ПоступлениеТоваров.Дата КАК Период
|ИЗ
| Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
|ГДЕ
| ПоступлениеТоваров.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| ПоступлениеТоваровТовары.Ссылка.Дата КАК Период,
| ПоступлениеТоваровТовары.Номенклатура,
| СУММА(ПоступлениеТоваровТовары.Количество * ПоступлениеТоваровТовары.Коэффициент) КАК Количество,
| ПоступлениеТоваровТовары.Качество
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &Ссылка
| И ПоступлениеТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Качество,
| ПоступлениеТоваровТовары.Ссылка.Дата
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход),
| ПоступлениеТоваровСпецификации.Ссылка.Дата,
| ПоступлениеТоваровСпецификации.Спецификация,
| СУММА(ПоступлениеТоваровСпецификации.Количество * ПоступлениеТоваровСпецификации.К),
| ПоступлениеТоваровСпецификации.Качество
|ИЗ
| Документ.ПоступлениеТоваров.Спецификации КАК ПоступлениеТоваровСпецификации
|ГДЕ
| ПоступлениеТоваровСпецификации.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровСпецификации.Качество,
| ПоступлениеТоваровСпецификации.Ссылка.Дата,
| ПоступлениеТоваровСпецификации.Спецификация”;
Результат = Запрос.ВыполнитьПакет();
Движения.ВзаиморасчетыСКонтрагентами.Загрузить(Результат[0].Выгрузить());
Движения.ОстаткиТоваров.Загрузить(Результат[1].Выгрузить());
КонецПроцедуры
</cod>
и расхода
<cod>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОстаткиТоваров.Записывать = Истина;
Движения.Продажи.Записывать = Истина;
Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
Движения.ОстаткиТоваров.БлокироватьДляИзменения = Истина;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| РеализацияТоваровТовары.Ссылка.Дата КАК Период,
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент) КАК Количество,
| РеализацияТоваровТовары.Качество
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Качество,
| РеализацияТоваровТовары.Ссылка.Дата
|
|ОБЪЕДИНИТЬ
|
|ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход),
| РеализацияТоваровСпецификации.Ссылка.Дата,
| РеализацияТоваровСпецификации.Спецификация,
| СУММА(РеализацияТоваровСпецификации.Количество * РеализацияТоваровСпецификации.К),
| РеализацияТоваровСпецификации.Качество
|ИЗ
| Документ.РеализацияТоваров.Спецификации КАК РеализацияТоваровСпецификации
|ГДЕ
| РеализацияТоваровСпецификации.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровСпецификации.Качество,
| РеализацияТоваровСпецификации.Ссылка.Дата,
| РеализацияТоваровСпецификации.Спецификация
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РеализацияТоваровТовары.Ссылка.Дата КАК Период,
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент) КАК Количество,
| РеализацияТоваровТовары.Ссылка.Контрагент,
| РеализацияТоваровТовары.Ссылка.Менеджер,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Ссылка.Дата,
| РеализацияТоваровТовары.Ссылка.Контрагент,
| РеализацияТоваровТовары.Ссылка.Менеджер
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| РеализацияТоваров.Дата КАК Период,
| РеализацияТоваров.Контрагент,
| РеализацияТоваров.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваров КАК РеализацияТоваров”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.ВыполнитьПакет();
Движения.ОстаткиТоваров.Загрузить(Результат[0].Выгрузить());
Движения.Продажи.Загрузить(Результат[1].Выгрузить());
Движения.ВзаиморасчетыСКонтрагентами.Загрузить(Результат[2].Выгрузить());
Движения.Записать();
// Выполняем контроль остатков
Запрос1 = Новый Запрос;
Запрос1.Текст =
“ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура,
| ОстаткиТоваровОстатки.Качество,
| ОстаткиТоваровОстатки.КоличествоОстаток,
| Док.НомерСтроки
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| &Момент,
| (Номенклатура, Качество) В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Качество
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Качество,
| РеализацияТоваровТовары.Номенклатура
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровСпецификации.Спецификация,
| РеализацияТоваровСпецификации.Качество
| ИЗ
| Документ.РеализацияТоваров.Спецификации КАК РеализацияТоваровСпецификации
| ГДЕ
| РеализацияТоваровСпецификации.Ссылка = &Ссылка)) КАК ОстаткиТоваровОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| РеализацияТоваровТовары.Качество КАК Качество,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Качество,
| РеализацияТоваровТовары.Номенклатура) КАК Док
| ПО ОстаткиТоваровОстатки.Номенклатура = Док.Номенклатура
| И ОстаткиТоваровОстатки.Качество = Док.Качество
|ГДЕ
| ОстаткиТоваровОстатки.КоличествоОстаток < 0”;
Запрос1.УстановитьПараметр(“Ссылка”, Ссылка);
Момент = Новый Граница(МоментВремени(), ВидГраницы.Включая);
Запрос1.УстановитьПараметр(“Момент”, Момент);
Результат = Запрос1.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если Не ПараметрыСеанса.ТекущийПользователь.РазрешитьМинусовыеОстатки Тогда
Отказ = Истина;
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нехватка товара в количестве ” + (-ВыборкаДетальныеЗаписи.КоличествоОстаток)+” штук”;
Сообщение.Поле = “Товары[“+(ВыборкаДетальныеЗаписи.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
КонецПроцедуры
</cod>
Отчеты создал в СКД приведу только запросы по ним:
<cod>
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОстатки.Контрагент,
ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток,
МенеджерыКлиентовСрезПоследних.Менеджер
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(, ) КАК ВзаиморасчетыСКонтрагентамиОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МенеджерыКлиентов.СрезПоследних КАК МенеджерыКлиентовСрезПоследних
ПО ВзаиморасчетыСКонтрагентамиОстатки.Контрагент = МенеджерыКлиентовСрезПоследних.Контрагент
</cod>
<cod>
ВЫБРАТЬ
ОстаткиТоваровОстатки.Номенклатура,
(ЦеныПродажные.Цена – ЦеныЗакупочные.Цена) * ОстаткиТоваровОстатки.КоличествоОстаток КАК Прибыль
ИЗ
РегистрНакопления.ОстаткиТоваров.Остатки(, Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)) КАК ОстаткиТоваровОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, {(ТипЦены = &ЗакупочнаяЦена)}) КАК ЦеныЗакупочные
ПО ОстаткиТоваровОстатки.Номенклатура = ЦеныЗакупочные.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(, {(ТипЦены = &ПродажнаяЦена)}) КАК ЦеныПродажные
ПО ОстаткиТоваровОстатки.Номенклатура = ЦеныПродажные.Номенклатура
</cod>
<cod>
ВЫБРАТЬ
ПродажиОбороты.Контрагент,
ПродажиОбороты.Менеджер,
СУММА(ПродажиОбороты.СуммаОборот) КАК ОбъемПродаж,
СУММА(ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток) КАК Долг,
СУММА(ПродажиОбороты.СуммаОборот – ВзаиморасчетыСКонтрагентамиОстатки.СуммаОстаток) КАК ДопПоле
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки КАК ВзаиморасчетыСКонтрагентамиОстатки
ПО ПродажиОбороты.Контрагент = ВзаиморасчетыСКонтрагентамиОстатки.Контрагент
СГРУППИРОВАТЬ ПО
ПродажиОбороты.Контрагент,
ПродажиОбороты.Менеджер
УПОРЯДОЧИТЬ ПО
ДопПоле УБЫВ
</cod>
Итог.
1. Много нового узнал о нюансах проведения документов. О некоторых возможностях СКД. тема представлена понятно.
2. Хотелось бы больше внимания уделить теме проведения документов. А именно хотелось бы еще и с партионным учетом, также подробно ознакомиться с ФИФО, ЛИФО и как в проведении описать проверки и организовать списания.
Подробнее о проведении документов мы говорим в продвинутом курсе.
Хотел высказать наболевшие вопросы по курсу и выполнении заданий , но прочитал пожелания Ilia
Подписываюсь под каждым словом.
В запросе контроля остатков по реализации добавляем колонку качества. В справочник “Пользователи” добавляем реквизит “ПроводитьБезКонтроляОстатков”, при проведении учитываем значение реквизита для текущего пользователя при выставлении флага отказа от проведения. Запись движений по регистрам выделяем в отдельную процедуру ЗаписатьДвижения(). Используем ее в команде “ПровестиБезКонтроля” в списке реализаций. Количество пересчитываем в базовые единицы с помощью коэффициента единицы измерения.
По регистру “Продажи” сложностей не было.
При проведении документа “Выписка” устанавливаем вид движения накопления в зависимости от заполненной колонки. В форме документа при заполнении одной колонки прихода или расхода обеспечиваем обнуление второй колонки.
Состав наборов сохраняем в независимом регистре сведений КомплектующиеНаборов, измерения Набор, Комплектующая, ресурс Количество (по базовой единице измерения). Контроль правильности заполнения выполняем в процедуре ПередЗаписью() модуля набора записей. Для обеспечения корректного перепроведения документов реализации добавим в документ табличную часть”Комплектующие набора”, где сохраняем состав наборов.
При заполнении движений по регистру остатков проверяем вид номенклатуры, услуги не списываются и не приходуются, товары списываются напрямую, для набора получаем комплектующие из табличной части документа реализации и списываем в соответствующем количестве.
По отчетам вопросов не возникло.
1. Что нового я узнал во втором блоке или в чем поменялись взгляды после изучения
материала?
Углубила знания по объектам конфигурации в целом, новое – особенности платформы 8.2, в частности методика проведения документов.
2. В какой теме были наибольшие затруднения, и что помогло их преодолеть?
Особых затруднений не было, но сложно находить нужный фрагмент в видео.
Задание выполнено.
При проведении документа реализации товаров использовал технологию контроля остатков после записи движений. Если образуется отрицательный остаток, то выдается сообщение с привязкой к строке табличной части. Исключение – если не хватает товара из набора и такого товара нет в самом документе, в этом случае сообщение не привязвается к строке. Для проведения без контроля из формы списка завел в модуле объекта экспортную переменную, при обработке команды в форме списка создаю объект, соответствующий текущей строке, устанавливаю значение переменной, и выполняю запись в режиме проведения. В обработке проведения анализируется эта переменная, если установлена то контроль остатков после записи движений не выполняется.
Создал оборотный регистр Продажи с нужными параметрами, а также регистр остатков Взаиморасчеты (измерения – Контрагент, Менеджер, ресурс – Сумма). Смысл ресурса – сумма долга контрагента нашей организации, может быть и отрицательным). Исходя из этого строятся все движения по регистру. В док-т поступления также добавлен реквизит Менеджер.
Документ Выписка имеет только табл. часть с реквизитами Клиент, Документ, Приход, Расход. Документ – ссылка на док-т поступления (в случае расхода) или документ реализации (в случае прихода), из него определяется Менеджер в движении по рег. Взаиморасчеты.
Хранение состава набора организовал в табл. части справочника Номенклатура, если элемент имеет вид Набор, то эта табл. часть является обязательной для заполнения.
В документах поступления и продажи формируется запрос к табл. части документа, выгружается в таблицу значений. После этого из таблицы удаляются строки с услугами, наборами и добавляются строки с товарами из наборов, далее таблица загружается в набор записей. Копия той же самой таблицы (в первоначальном виде после запроса) используется и для загрузки движений по регистарам Закупки/Продажи и Взаиморасчеты (предварительно таблица свертывается, исключая ненужное дублирование).
Отчеты все реализованы, каких-то сложностей не возникло, СКД действительно очень мощный и удобный инструмент, осталось научиться использовать все возможности :)
Во втором блоке было еще больше новой информации, узнал множество полезных приемов, а так же возможных “граблей” при работе с документами и регистрами. Познакомился с такой штукой как СКД, до этого сталкиваться не приходилось.
Самой сложной и интересной темой была опять-таки глава про запросы. Очень важный механизм, хотелось бы освоить его в совершенстве.
Так же, возможно, не до конца понял всю прелесть плана видов характеристик, понятно что в связке с СКД дает много возможностей, но как еще можно использовать, вне отчетов, пока не усвоил. Вот про ПВХ можно было бы рассказать дополнительно.
Задание выполнено частично – до наборов. Честно говоря, про наборы смутно представляю решение с учетом устойчивости базы, разве что запретить изменение наборов после их использования. По вопросам по курсу:
1. Систематизировал и значительно углубил свое понимание работы регистров и их применения для прикладных задач. Вообще все материалы блока очень качественно изложены, интересно было слушать даже глубокой ночью :)
2. Основные затруднения – нехватка времени, по темам особых не было. Для экономии времени задания выполняю в выкладываемых базах с решениями прошлых заданий.
3. Из затронутого в блоке хотелось поподробнее про оформление отчетов в СКД, но это будет в продвинутом курсе, насколько я понимаю.
Задание выполнено. Больше всего потратил времени на обработку наборов.
При изменении значения номенклатуры в строке табличной части документа реализации, производится анализ по виду номенклатуры. Если это набор, то после строки, содержащей набор, в табличную часть добавляются строки с комплектующими из набора. При этом в качестве параметров в процедуры обработки передаются объекты целиком (ДокументОбъект) и хранятся и обрабатываются старый и новый объекты. Дальше получилось, как в анекдоте:”Французы думают в постели, немцы на работе, а русские – опосля.” Когда все вымучил, пришла в голову мысль использовать временное хранилище, и передавать туда только табличную часть. Уважаемый Евгений Михайлович, если будет возможность, рассмотрите в Вашем решении или в МГ алгоритмы передачи и обработки табличных частей с клиента на сервер и обратно с использованием временного хранилища.
Контроль остатков и проведение реализации осуществляется в следующей процедуре.
<code>
Процедура ОбработкаПроведения(Отказ, Режим)
Для Каждого ТекСтрокаТовары Из Товары Цикл
Если НЕ (ТекСтрокаТовары.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга) Тогда
Если НЕ (ТекСтрокаТовары.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Набор) Тогда
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Качество = ТекСтрокаТовары.Качество;
Движение.Количество = ТекСтрокаТовары.Количество*ТекСтрокаТовары.ЕдиницаИзмерения.КоэффициентПересчета;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Движения.ОстаткиТоваров.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура,
| ОстаткиТоваровОстатки.Качество,
| ОстаткиТоваровОстатки.КоличествоОстаток КАК Нехватка,
| Док.НомерСтроки
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| &Момент,
| (Номенклатура, Качество) В
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Качество
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК ОстаткиТоваровОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки,
| РеализацияТоваровТовары.Качество КАК Качество
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Качество) КАК Док
| ПО ОстаткиТоваровОстатки.Номенклатура = Док.Номенклатура
| И ОстаткиТоваровОстатки.Качество = Док.Качество
|ГДЕ
| ОстаткиТоваровОстатки.КоличествоОстаток < 0”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Граница = Новый Граница(МоментВремени(), ВидГраницы.Включая);
Запрос.УстановитьПараметр(“Момент”, Граница);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Отказ = Истина;
Админ = ПользователиИнформационнойБазы.ТекущийПользователь().ПолноеИмя = “Администратор”;
Если Админ Тогда
Отказ = Ложь;
КонецЕсли;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нехватка товара в количестве “+(-Выборка.Нехватка);
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
Движения.Продажи.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Менеджер = Менеджер;
Движение.Количество = ТекСтрокаТовары.Количество*ТекСтрокаТовары.ЕдиницаИзмерения.КоэффициентПересчета;
Движение.Стоимость = ТекСтрокаТовары.Сумма;
КонецЦикла;
Движения.Взаиморасчеты.Записывать=Истина;
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Приход = СуммаДокумента;
Движение.ДатаРегистратора = Дата;
Движение.ДатаПлатежа = Дата;
КонецПроцедуры
</code>
При нехватке товаров по нескольким позициям привязка сообщения осуществляется к строке с максимальным номером. Отчеты созданы на СКД.
Ответы на вопросы.
1) Каждый язык (неважно, естественный или алгоритмический) имеет трудно формализуемую внутреннюю парадигму, и она постигается только тогда, когда человек говорит постоянно на этом языке с использованием самых различных конструкций и оборотов. В результате обучения я постепенно перехожу от мычания и языка жестов к более внятному изложению мыслей на языке 1С. Спасибо, Евгений Михайлович!
2)В последнем домашнем задании – работа с наборами, передача табличных частей с клиента на сервер и обратно. Затруднения были преодолены, к моему глубокому сожалению, победой труда над разумом.
3)Как я просил выше, алгоритмы передачи и обработки табличных частей с клиента на сервер и обратно с использованием временного хранилища.
Об использовании временного хранилища мы говорим в продвинутом курсе.
Однако, текущая задача решается и без применения временного хранилища. Один из вариантов будет представлен в решении.
Задание выполнено.
Контроль остатков реализован запросом, аналогично примеру в уроках, с добавлением еще одного измерения. Процессы записи регистров и контроля остатков разделены на отдельные процедуры, что позволяет в процедуре проведения делать контроль остатков, и выполнять отдельное проведение без контроля.
Регистр продаж и взаиморасчетов проблем не вызвали.
Услуги – создал отдельные табличные части у документов и в них указываю поступление и реализацию услуг.
Наборы номенклатуры – вот тут было самое сложное. Создал справочник наборов номенклатуры и указываю состав там. При проведении документов делаю обход по каждой строке табличной части товаров и анализирую тип номенклатуры. Если это набор, то запросом получаю состав и записываю дополнительные движения в регистр по набору. Хотелось для простоты оставить запись движений указывая значения реквизитов в наборах записей, но, уже сомневаюсь, что такое решение действительно простое, не говоря уже о производительности. Скорее всего буду переделывать на запросы и выгрузку в таблицу значений. С последующей загрузкой в набор записей, как показано в вашем решении.
С отчетами проблем не возникло.
Задание выполнено. За исключением отчета по прогнозу финансового результата. Тут что-то пока глухо… как в танке.
С остальными заданиями особых затруднений не возникло. Для учета наборов идеально было бы использовать регистр сведений и вторую табличную часть СоставНабора в соответствующих документах, записи по составу комплекта во второй ТЧ гарантируют устойчивость решения. Однако этот способ мне показался слишком трудоемким (Для меня это задание показалось более объемным, чем предыдущее, а времени на его выполнение, как ни странно, запланировано меньше). Поэтому решил организовать через подчиненный Номенклатуре справочник. Вариант с регистром сведений не очень понравился, т.к. натолкнулся на следующую проблему. Если заблокировать изменение в записях регистра по номенклатуре, имеющей движения, возможно. То вот каким образом заблокировать удаление записи из регистра сведений понять не смог.
Практически вся выдаваемая информация является для меня новой. Конечно наиболее сложной темой являются Запросы. Во всех их проявлениях.
Повторные просмотры уроков конечно же немного помогают, но в меньшей степени, чем само выполнение домашних заданий и последующий просмотр эталонных решений. Только в этой связке у меня появляются проблески ;) в понимании изучаемого предмета.
Дополнительно хотелось бы рассмотреть вопрос Проектирования регистров. Хотя-бы основные моменты учета. Например, взаиморасчеты с контрагентами. Достаточно ли одного регистра для этого или по каким-то причинам лучше разделить их на две части (поставщиков отделить от покупателей)? Не хотелось бы наступать на все возможные грабли при проектировании информационной системы.
Задание выполнено полностью. Для отчета с прогнозом воспользовался таблицей среза последних для цен дважды. Для каждой из этих таблиц используется свое условие по выбираемому параметру с типом цен. А дальше уже все было просто. Хотя могу предположить, что это не идеальное решение…
При удалении записи из регистра сведений вызываются два события модуля набора записей: при записи и перед записью.
Задание выполнено частично
Не удалось выполнить:
1) Для проведения документа Реализация товара создал кнопку «Провести без контроля», для чего создал в модуле документа отдельную экспортную процедуру ,вызов из формы но при вызове процедуры выполняется сначала процедура ПриПроведении при использовании метода Записать(), а в той процедуре идут все проверки. Не смог это победить.
2) Не удалось сделать отчет Финансовый результат. Включил в параметры типы цен закупки и продажи. В запросе использую 3 таблицы: Регистр ОстаткиТоваров и 2 таблицы по регистру ЦеныНоменклатуры одна для цены покупки одна для цены продажи, связал все таблицы, то почему-то не показываются к заполнению параметры типы цен закупки и продажи.
3) Не удалось сделать отчет «рейтинг менеджеров» примерно по такой же причине, не смог добиться показа периода в параметрах связав 3 таблицы.
Ответы на вопросы
1) Для меня 80% информации было новой, с платформой почти не работал, сейчас понял, что психологический барьер исчез, могу что-то простое делать и разбирать код. Методикой преподавания и качеством занятий очень доволен.
2) Наибольшие затруднения не в конкретной теме, а в том, что пока не сложилась в голове система добычи знания, как решать ту или иную задачу, в каком модуле и процедуре решать , т.к. часто возможны варианты, а сравнить их мне пока трудно, не всегда понятно написанное в синтакс помощнике. При затруднениях пытаюсь найти решение в интернете или в литературе, но часто того что ищу нет. Естественно из за плотности графика изучение больше похоже на прослушивание материала. Думаю в дальнейшем ко многим темам буду возвращаться.
3) Пожелания по работе в мастер группе.
Мне бы хотелось несколько иной методики работы с домашними заданиями.
Хотелось бы иметь возможность выполнить задание, даже если я не могу сообразить, как преодолеть ту или иную трудность в задании. Конечно, я пытаюсь сделать как-нибудь, но хочется сделать хорошо. Застревая на одном этапе задания, под угрозу ставится выполнение всего задания, т.к. задания взаимосвязаны, может быть потрачено слишком много времени, кто-то просто откажется от решения задания.
Какой вижу выход. Задания могут быть основные, для решения которых достаточно выданного материала и продвинутые, где надо несколько больше. Основные задания должны быть максимально конкретны, вплоть до ссылок на уроки где был изложен тот или иной материал. В свою очередь к продвинутым заданиям можно тоже давать некоторые подсказки и ссылки (если есть) на дополнительный материал. Разбором ДЗ вполне удовлетворен, но понимаю, что до некоторых вещей в решениях иногда даже шанса догадаться не было. Я стараюсь решать ДЗ в базе, в которой сделан разбор предыдущего задания, т.к. в своей базе обнаруживаю много ошибок и программных и методических. Но для решения заданий базы должны быть соответствующим образом подготовлены, заполнены справочники, документы и т.п. Видимо я слабоватый программист, для сильных, возможно, все это неактуально.
Пожелание понятно, будем анализировать и принимать решение по реализации. Спасибо!
Не знаю, можно ли отчитываться по ДЗ, когда уже будет выложено решение (а оно наверно сегодня-завтра будет выложено), но пока отчитаюсь по тому что успел сделать (ДЗ выполнил частично – пока без отчетов, постараюсь сегодня-завтра отчитаться по отчетам).
Для хранения состава наборов в справочнике Номенклатуры создал ТабЧасть, в которой указываются Комплектующие и их количество.В документе Реализация сделал ТабЧасть, в которой хранятся комплектующие всех наборов, указанных в документе. Реализовал автоматическое заполнение этой таб. части – обхожу в цикле все строки, если в данная номенклатура – набор, то заполняю ее комплектующие – “копирую” информацию из справочника (наверно так не совсем эффективно – обход в цикле. Думал как сделать запросом… Но ведь товары в документе могут быть заполнены, в т.ч. наборы, а документ не записан… тем не менее все равно нужно дать возможность пользователю дать возможность автоматически заполнить состав наборов в таб.часть комплектующих документа).В модуле документа Реализация сделал экспортную процедуру ДвиженияПоРегиструОстаткиНоменклатуры() для вызова ее из формы списка и безусловного проведения. Эта процедура формирует движения по Номенклатуре с видом Товар из таб. части Товары (в этой таб части могут быть еще услуги и наборы, но по ним двежения не формируются) + по таб.части Комплектующие. Из обработки проведения вызываю сначала процедуру ДвиженияПоРегиструОстаткиНоменклатуры(), в самой обработке проведения записываю сформированные движения и в запросе проверяю отрицательные остатки.
У пользователя (справочник Пользователи) сделал флаг НеПроверятьОстатки, при проведении документа Реализация анализирую значение этого флага и выставляю параметр Отказ.
В форме списка сделал кнопку ПровестиБезКонтроля, получаю ДокументОбъект из текущей строки списка, вызываю функцию ДвиженияПоРегиструОстаткиНоменклатуры() модуля объекта.
Не понял, правда, зачем нужно оперативное проведение Реализации, если остатки должны контролироваться при любом проведении… И еще хотел уточнить, остатки нужно проверять на момент документа (включая сам документ после его проведения) или на какой-то другой момент времени?
С первым отчетом небольшая заминка…
Идея вроде понятна, сделал в Компоновке запрос:
ВЫБРАТЬ
МенеджерыКонтагентовСрезПоследних.Менеджер,
ВзаиморасчетыОстатки.Контрагент,
ВзаиморасчетыОстатки.СуммаОстаток
ИЗ
РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МенеджерыКонтагентов.СрезПоследних КАК МенеджерыКонтагентовСрезПоследних
ПО ВзаиморасчетыОстатки.Контрагент = МенеджерыКонтагентовСрезПоследних.Контрагент
С помощью Мастера указал настройки отчета (вывод в список, все поля, группировка: Менеджер – Дет. записи). Ресурс отчета – Сумма остаток.
Но почему-то менеджеры не подхватываются в отчете – у всех контрагентов указан пустой менеджер, хотя менеджеры заданы… Уже три часа бьюсь, пока не знаю в чем причина.
Кстати, по идее, если я щелкаю на ячейке с контрагентом, то в расшифровке должен быть пункт “Открыть” (элемент справочника), а у меня он недоступен… такое ощущение, что не ссылки контрагентов, а наименования вывелись в отчет…
Разобрался!
Тип измерения Контрагент регистра Взаиморасчетов был Строка – торопился, когда делал, и забыл исправить на СправочникСсылка.Контрагенты)
Ок!
Но здесь на самом деле интересен такой момент.
СКД создает для обеих виртуальных таблиц (среза последних и остатков) общий параметр Период.
Остатки получаем на начало следующего дня:
ДобавитьКДате(КонецПериода(&Период, “ДЕНЬ”), “СЕКУНДА”, 1)
Но если на следующий день у контрагента изменился менеджер, то в отчет будет выведен именно этот новый менеджер, что неправильно…
Попробовал в отчете изменить запрос: (добавил период для среза последних)
ВЫБРАТЬ
МенеджерыКонтагентовСрезПоследних.Менеджер,
ВзаиморасчетыОстатки.Контрагент,
ВзаиморасчетыОстатки.СуммаОстаток
ИЗ
РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МенеджерыКонтагентов.СрезПоследних(&ДатаСреза, ) КАК МенеджерыКонтагентовСрезПоследних
ПО ВзаиморасчетыОстатки.Контрагент = МенеджерыКонтагентовСрезПоследних.Контрагент
В параметрах заполняю Выражение для ДатаСреза = &Период, но почему-то ДатаСреза не заполняется, и срез берется именно на параметр Период…
———
Подумал, что отчет можно сделать интереснее –
например, сегодня 01 марта.
Есть некий контрагент “ООО База”. Его долг нам на 31 января – 7000 руб.
01 февраля у этого контрагента сменился менеджер – например, раньше был менеджер Иванов, с 01 февраля – менеджер Петров.
Долг контрагента нам на 01 марта – 10000 руб.
Если отчет формируется на 01 марта, то в отчете интересно видеть информацию в виде:
Менеджер – Контрагент – Долг
Иванов – “ООО База” – 7000 руб.
Петров – “ООО База” – 3000 руб.
ИТОГО (на 01.03) – “ООО База” – 10000руб.
Правда, не знаю, как такое сделать…
И еще интереснее, если на 01 марта не контрагент нам должен, а мы должны контрагенту…
На эту тему была одна из последних серий “Осторожно, 1С”. Ознакомьтесь с ней.
Второй отчет.
Использую две таблицы среза последних – для получения закупочной и продажной цены плюс соеднение с таблицей остатков Номенклатуры.
Но здесь тоже самое – Период общий для всех трех таблиц.
Например, строю отчет на 15фев.
Остатки при этом получаем на 16фев 00:00:00. Но и цены тоже берутся на 16фев 00:00:00, а хотелось бы, чтобы цены брались на 15фев! Как это сделать – пока не знаю…
>можно ли отчитываться по ДЗ, когда уже будет выложено решение
Да, можно.
> остатки нужно проверять на момент документа (включая сам документ после его проведения)
Верно, при проведении по новой технологии на момент времени, включая документ.
последний, 3-й отчет сделал
так что вроде теперь ДЗ выполнено полностью.
раз уж все пишут свои пожелания, напишу тоже.
Такие сложные и объемные ДЗ нужны, т.к. это заставляет подумать самому и лучше разобраться во всех темах, но хотелось бы, чтобы на выполнение таких заданий отводилось побольше времени, например у меня на это, самое сложное на данный момент задание ушло более 4-х дней. Даже некогда было уроки слушать – делал только ДЗ… боюсь как бы не отстать теперь от группы…
Задание выполнено.
Добавил регистр сведений “Наборы” с измерениями “Набор”, “Комплектующая”, оборотный регистр “Продажи”, регистр остатков “Взаиморасчеты”.
Наибольшие затруднения вызвала реализация движений по наборам:
1. Для записи движений использовал объединение 2 запросов к табличной части “Товары” с условиями ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор) и ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
2. При проверке отрицательных остатков использовал запрос к таблице “ОстаткиНоменклатуры” – Номенклатура, Качество в временную таблицу – соединение с ОстаткиНоменклатуры.Остатки.
3. ВОПРОС? Не удалось задать параметр виртуальной таблицы ОстаткиНоменклатуры.Остатки в виде
“Номенклатура в (Выбрать Различные Номенклатура из втТовары) – нельзя использовать временные таблицы?
4. Разобрался с реализацией проверки остатков после записи движений – БлокироватьДляИзменения, Записать() набора записей до проверки остатков и. т. д.
>нельзя использовать временные таблицы
Можно использовать.
Возможно вы не определили временную таблицу, либо в ней нет поля Номенклатура.
Приведите текст запроса и сообщение об ошибке.
Текст запроса:
ВЫБРАТЬ
ОстаткиНоменклатуры.Номенклатура,
ОстаткиНоменклатуры.Качество
ПОМЕСТИТЬ втТовары
ИЗ
РегистрНакопления.ОстаткиНоменклатуры КАК ОстаткиНоменклатуры
ГДЕ
ОстаткиНоменклатуры.Регистратор = &Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
втТовары.Номенклатура,
втТовары.Качество,
ОстаткиНоменклатурыОстатки.КоличествоОстаток
ИЗ
втТовары КАК втТовары
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(&Период, Номенклатура В (&маТовары)) КАК ОстаткиНоменклатурыОстатки
ПО втТовары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
И втТовары.Качество = ОстаткиНоменклатурыОстатки.Качество
ГДЕ
ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0
При попытке заменить “Номенклатура В (&маТовары)” на “Номенклатура В (Выбрать Различные Номенклатура из втТовары)” – ошибка “Поле не найдено “Номенклатура” – ошибка выдается по кнопке “ОК” в окне “Параметры виртуальной таблицы”.
Странная ошибка, ее быть не должно. Возможно виноват язык ввода какой-либо буквы.
Сделаем вот что:
Попробуйте с помощью конструктора описать этот вложенный запрос. Временная таблица будет доступна для выбора (самая последняя группа таблиц).
Спасибо, с помощью конструктора понял в чем дело.
Надо не “Выбрать Различные Номенклатура…”, а “Выбрать Различные втТовары.Номенклатура..
Отлично!
Задание выполнено.
Созданы регистр сведений “Наборы” и регистры оборотов “Взаиморасчеты” и “Продажи”.
С документом “Выписка” проблем не возникло вообще. Услуги теперь не хранятся на складах, но проходят по финансовым регистрам. Самое сложное – наборы. Я бы реализововал закупку наборов, а если мы их собираем сами из комплектующих – контроль производства.
В итоге сделал через вторую ТЧ документа. При записи разворачиваем основную ТЧ документа в буферную по номенклатуре,а при проведении делаем движения по регистру, как в примере курса – сверяя номенклатуру по второй ТЧ.
Решение получилось, мягко говоря, неидеальным, очень хочется посмотреть другие реализации.
У пользователя есть возможность проводить документы без контроля остатков.В качестве эксперимента для всех пользователь сделал закрытой запись “задним числом” но с возможностью проведения при вводе “инвайта” уникального для каждого документа. Реализовано через обработку, которая забирает данные из формы и возвращает результат сравнения.
По СКД отчеты получились, а вот их внешний вид не особо нравится.
2. В какой теме были наибольшие затруднения, и что помогло их преодолеть?
3. Какую тему вы бы хотели подробнее раскрыть в мастер-группе?
Запросы и СКД. Темы , на мой взгляд, сложные и их хотелось бы их рассмотреть подробнее.
Из замечаний – очень плотная программа.
За 9 дней у нас три ДЗ, с огромным количеством материала для изучения. Материалы Мастер групп просто физически невозможно отсмотреть…
Из предложений – возможно ли добавить форум к сайту? Наше групповое обучение лишено одного важного момента – мы не общаемся внутри группы.
Такое пожелание у нас записано.
Думаем над его реализацией.
Задание готово.
В справочнике «пользователи» , добавил реквизит НеКонтролироватьОстатки с типом булево , в свойствах движения Документа «Расходная» разрешил оперативное проведение. В обработке проведения документа «Раходная» запросом получаю данные табличной части документа , запрос получается за счет объединения 2-ух запросов , в 1-м получаю только товары во 2-м получаю только наборы и соединяю с Рег. Сведений «Набор» и выгружаю в регистр накопления «ОстаткиТовара» без «Услуг» с видом движения накопления «расход» в регистр «Продажи» записываю все данные , данные записываю движения , далее запросом получаю остатки по номенклатуре. В запросе использую Врем.таб. для получения сгруппированной по номенклатуре и качеству таблицы, далее из виртуальной таблицы «Остатки» с переданными в параметры «МоментВремени» и вложенный запрос из врем. Таблицы для отбора уже на этапе построения вирт. Таблицы по номенклатуре и качеству, устанавливаю условие на количество < 0, и обрабатываю результат запроса. Если есть записи и у текущего пользователя проверка остатков установлена тогда отказ=истина; В любом случае есть контроль или нет, циклом проходим по выборке результата запроса и сообщаем какого товара не хватает. В Списке реализаций добавил команду «проводить без контроля», а в модуле объекта документа «Реализация» добавил экспортную процедуру ПровестиБезКонтроля;
Для «набора» создал регистр сведений с измерением с-но набор, комплектующее с типом «Справочник.Номенклатура» и реквизитом «Количество». При записи в событии формы Рег.Свед. обработкаПроверкиЗаполненияНаСервере проверяю вид номенклатуры на то что бы в качестве комплектующего не был выбран набор.
Создан регистр «Взаиморасчеты» вид «остатки». Изм. Контрагент , ресурс «Сумма». Добавил документ «Выписка» , обеспечил запись данных по регистру «взаиморасчеты» для док-ов «Поступление», «Реализация» и «Выписка».
Все отчеты готовы.
Задание практически выполнено.
Контроль остатков действует (с учетом качества). Для возможности отключения проверки создан план видов характеристик и РС “НастройкиПользователей”. Заведен предопределенный элемент в плане “ОтключитьКонтрольОстатков” типа булево. Если у пользователя будет установлен этот флаг, то проведение будет происходить с выдачей сообщений об ошибках. Если нет – проведение будет невозможно, кроме как через кнопку “ПровестиБезКонтроля” в форме списка реализаций.
При проведении по регистру остатка количество хранится в базовой единице измерения (если в документе указана другая, то учитывается коэффициент)
Регистр продаж создан. Исправлена проверка на изменение базовой единицы измерения (добавлена проверка для регистра продаж)
Регистр взаиморасчетов создан. Через документ “Выписка” фиксируются приходы и расходы ДС (учтено, что в одной строке могут быть заполнены и приход, и расход)
Для документов поступления и реализации сделано движение по регистру взаиморасчетов.
Услуги не фиксируются в регистре остатков.
Для наборов создан РС “Комплектующие”, где хранятся данные по комплектующим и их количество. Комплектующие возможно выбирать только с видом номенклатуры “Товар” и только для номенклатуры-набора. Если это не набор – добавление комплектующих невозможно.
При проведении по регистрам закупки и продажи фиксируется номенклатура-набор. По регистру остатков – комплектующие этого набора.
Все три отчета созданы.
P.S. Задание выполнено на 95%, так как я не могу понять как контролировать остатки в случае проведения набора. Если точнее, не могу врубиться, как определить номер строки табличной части в случае возникновения отрицательного остатка. Ведь должно выдаваться сообщение, что не хватает количества по набору в такой-то строке.
Интересно, а почему было принята именно такая постановка задачи, что наборы не хранятся в регистре остатков? Ведь так намного проще и как мне кажется, логичнее. Был бы документ “Комплектация” с контролем остатков (и возможно “Разукомплектация”). Набор хранится на складе физически. Т.е. он собран и его осталось только отгрузить. При проведении контроль остатков идет именно по набору. А как быть, если нам пришел уже готовый набор. Его надо разобрать на части? :) Ведь при проведении поступления в регистр остатков пишутся комплектующие. А товар затем можно продать и по отдельности. Получается, купили мы фару у поставщика, но не факт, что ее же и продадим. :)
>Если точнее, не могу врубиться, как определить номер строки табличной части
Контроль остатков можно выполнять и без привязки сообщения к строкам табличной части.
В общем случае не понятно к какой строке нужно привязывать сообщение, ведь комплектующая, которой не хватает, может встречаться в нескольких наборах.
Можно принять решение, что сообщение нужно привязывать к тому набору, который встречается первым или последним в данном документе, и содержит указанную комплектующую.
>а почему было принята именно такая постановка задачи, что наборы не хранятся в регистре остатков
Часто комплектация проводится “на лету”.
При большом документообороте лишние документы могут тормозить бизнес-процессы.
Однако, решение с документом Комплектация тоже имеет право на существование.
>А как быть, если нам пришел уже готовый набор.
В этой задаче мы предполагаем, что закупаются только комплектующие.
>Контроль остатков можно выполнять и без привязки сообщения к строкам табличной части.
Аааа…. ну вот это тогда нормально.
>В общем случае не понятно к какой строке нужно привязывать сообщение, ведь комплектующая, которой не хватает, может встречаться в нескольких наборах.
Вот это и завело меня в тупик.
>Можно принять решение, что сообщение нужно привязывать к тому набору, который встречается первым или последним в данном документе, и содержит указанную комплектующую.
Опять же…. мы ведь не только наборами торгуем? Комплектующие мы можем продавать по-отдельности? В реализации присутствует набор и комплектуюущая. Остатка не хватило. А где не хватило? В наборе или только по позиции комплектующей? А может быть, вообще этого товара нет. Тогда сообщение должно выводится для обоих строк.
Возможно и для обоих строк, возможно и для какой-либо одной.
Здесь однозначно сказать нельзя.