Проведение приходной накладной по двум регистрам
страницаПроведение приходной накладной по двум регистрам
В 1C:EDT
Изменение процедуры проведения
В список регистров, в которых документ ПриходнаяНакладная будет создавать движения, добавьте еще один регистр СтоимостьМатериалов.Для этого в редакторе документа на закладке Движениянажмите
над списком регистров установите флажок у регистра и нажмите ОК (рис. 12.11).

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