Проведение приходной накладной по двум регистрам
страницаПроведение приходной накладной по двум регистрам
В режиме «Конфигуратор»
Изменение процедуры проведения
Откроем в конфигураторе окно редактирования объекта конфигурации Документ ПриходнаяНакладная и перейдем на закладку Движения.
В списке регистров отметим, что документ будет создавать теперь движения и по регистру СтоимостьМатериалов (рис. 11.3).

Рис. 11.3. Создание движений документа «ПриходнаяНакладная» в регистре «Стоимость материалов»
Нажмем кнопку Конструктор движений. На вопрос системы о замещении процедуры проведения документа на новую, сформированную конструктором, ответим утвердительно. Мы ничего не потеряем, так как конструктор в обработке проведения сформирует движения уже по двум регистрам, а в прежнюю процедуру проведения мы никаких изменений не вносили.
В открывшемся окне конструктора движений мы увидим, что для регистра ОстаткиМатериалов все поля конструктора уже содержат информацию, которую мы задавали ранее при формировании движений для этого регистра (см. раздел «Движения документа»). Над списком Регистры нажмем кнопку Добавить и добавим еще один регистр СтоимостьМатериалов (рис. 11.4).

Рис. 11.4. Конструктор движений регистров
Тип движения регистра СтоимостьМатериалов по умолчанию будет установлен как Приход (пиктограмма со знаком + слева от имени регистра).
В поле выбора Табличная часть выберем табличную часть нашего документа - Материалы.
Список реквизитов документа, который уже заполнен реквизитами шапки документа, автоматически дополнится реквизитами нашей табличной части.
Теперь нажмем кнопку Заполнить выражения. В нижнем окне сформируется соответствие полей (измерений и ресурсов) регистра и выражений для их расчета.
Чтобы задать нужное соответствие для поля регистра Стоимость, нужно его выделить и в окне Реквизиты документа дважды щелкнуть по строке ТекСтрокаМатериалы.Сумма (рис. 11.5).

Рис. 11.5. Конструктор движений регистров
Нажмем ОК. После этого откроется модуль объекта документа Приходная накладная. Откроем процедуру обработчика события ОбработкаПроведения.
Мы увидим, что конструктор сформировал новый текст обработчика, содержащий движения по двум регистрам (листинг 11.1).
Листинг 11.1. Движения документа «ПриходнаяНакладная»
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора внесенные вручную изменения будут утеряны!!!
// регистр ОстаткиМатериалов Приход
Движения.ОстаткиМатериалов.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаМатериалы.Количество;
КонецЦикла;
// регистр СтоимостьМатериалов Приход
Движения.СтоимостьМатериалов.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Мы видим, что фрагмент, добавленный конструктором в процедуру обработки проведения документа для регистра СтоимостьМатериалов, аналогичен фрагменту для формирования движений по регистру ОстаткиМатериалов.
Однако сразу бросается в глаза, что совершенно не нужно обходить два одинаковых цикла по элементам табличной части Материалы. Можно в одном цикле формировать движения сразу по двум регистрам.
Выполним эту небольшую оптимизацию. И еще удалим комментарии, внесенные конструктором.
В результате процедура ОбработкаПроведения будет выглядеть следующим образом (листинг 11.2).
Листинг 11.2. Движения документа «ПриходнаяНакладная»
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиМатериалов.Записывать = Истина;
Движения.СтоимостьМатериалов.Записывать = Истина;
Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
// Регистр ОстаткиМатериалов Приход
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаМатериалы.Количество;
// Регистр Стоимость Материалов Приход
Движение = Движения.СтоимостьМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Материал = ТекСтрокаМатериалы.Материал;
Движение.Стоимость = ТекСтрокаМатериалы.Сумма;
КонецЦикла;
КонецПроцедуры