584 документа
← К списку

В 1C:EDT

страница

Проведение приходной накладной по двум регистрам

В 1C:EDT

Изменение процедуры проведения

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

Рис. 12.11. Регистры, в которых документ «Приходная накладная» производит движения

Поскольку вы уже знакомы со встроенным языком, теперь вы сможете разобраться с тем фрагментом, который вы сформировали с помощью конструктора движений в процедуре ОбработкаПроведения() документа ПриходнаяНакладная. И затем по аналогии самостоятельно сформировать движения по регистру СтоимостьМатериалов.

Откройте модуль документа ПриходнаяНакладная. Процедура ОбработкаПроведения(), находящаяся в этом модуле, сейчас выглядит следующим образом (листинг 12.13).

Листинг 12.13. Процедура «ОбработкаПроведения()»

Процедура ОбработкаПроведения(Отказ,Режим)

//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

//Данный фрагмент построен конструктором.

//При повторном использовании конструктора, внесенные вручную данные будут утеряны!

 

// регистр ОстаткиМатериалов

Движения.ОстаткиМатериалов.Записывать = Истина;

Для Каждого ТекСтрокаМатериалы из Материалы Цикл

Движение = Движения.ОстаткиМатериалов.Добавить();

Движение.Период = Дата;

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Материал = ТекСтрокаМатериалы.Материал;

Движение.Склад = Склад;

Движение.Количество = ТекСтрокаМатериалы.Количество;

КонецЦикла;

 

//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

КонецПроцедуры

Объект встроенного языка ДокументОбъект.ПриходнаяНакладная имеет свойство Движения. Оно возвращает объект КоллекцияДвижений, содержащий коллекцию наборов записей регистров, по которым этот документ может формировать движения.

К конкретному набору записей этой коллекции можно обратиться, указав через точку имя регистра, которому принадлежит этот набор записей. Например, Движения.ОстаткиМатериалов.

Затем через точку можно использовать различные методы набора записей регистра – например, Движения.ОстаткиМатериалов.Добавить(). Метод Добавить() добавляет новую запись в набор записей.

В первой строке процедуры свойство Записывать набора записей регистра устанавливается в значение Истина. То есть в явном виде указывается, что после завершения обработки проведения платформа должна будет записать этот набор записей в базу данных.

Внутри обработчика расположен цикл Для Каждого … Из … Цикл. Он предназначен для перебора строк табличной части документа.

В цикле обращение к табличной части документа происходит по имени (Материалы). Переменная ТекСтрокаМатериалы содержит объект с данными текущей строки табличной части документа. Эта переменная создается в начале цикла и меняется по мере его прохождения.

В первой строке тела цикла, используя метод Добавить(), к набору записей, который создает документ в регистре, добавляется новая запись. Тем самым создается объект РегистрНакопленияЗапись.ОстаткиМатериалов и сохраняется в переменной Движение.

Используя этот объект, вы можете обратиться к полям этой записи, указав имя поля через точку от этой переменной (например, Движение.Количество).

Причем Движение.Материал, Движение.Склад–это измерения регистра, Движение.Количество – это ресурс регистра, а Движение.ВидДвижения и Движение.Период – стандартные реквизиты регистра, которые создаются автоматически.

Чтобы присвоить полям новой записи регистра соответствующие значения полей документа, можно обратиться к полям табличной части, указав имя поля через точку от переменной ТекСтрокаМатериалы (например, ТекСтрокаМатериалы.Материал).

Заметьте, что Склад– это реквизит шапки документа, а Дата– стандартный реквизит документа, который создается автоматически. Причем в цикле меняются только значения полей табличной части документа: ТекСтрокаМатериалы.Материали ТекСтрокаМатериалы.Количество. Остальные поля не меняются, так как относятся к документу в целом и не зависят от текущей строки табличной части документа.

ВидДвиженияНакопления.Приход – это значение системного перечисления, которое определяет вид движения регистра накопления как Приход.

Таким образом, в цикле перебора всех строк документа присваиваются нужные значения всем полям новой записи. После завершения цикла в этом наборе записей (Движения.ОстаткиМатериалов) будет содержаться столько записей, сколько строк в табличной части проводимого документа.

Теперь по аналогии с разобранным выше фрагментом добавьте в цикл обхода строк табличной части приходной накладной фрагмент для формирования движений по регистру СтоимостьМатериалов. Движения будут очень похожи на движения по регистру ОстаткиМатериалов – с той лишь разницей, что значение измерения Стоимость вычисляется на основе значения колонки Сумма текущей строки табличной части документа.

Удалите комментарии конструктора движений, а в начало процедуры проведения добавьте строку, в которой свойство Записывать набора записей этого регистра устанавливается в значение Истина.

В результате процедура ОбработкаПроведения() должна выглядеть следующим образом (листинг 12.14).

Листинг 1****2.14. Движения документа «ПриходнаяНакладная»

Процедура ОбработкаПроведения(Отказ, Режим)

 

Движения.ОстаткиМатериалов.Записывать = Истина;

Движения.СтоимостьМатериалов.Записывать = Истина;

 

Для Каждого ТекСтрокаМатериалы Из Материалы Цикл

 

// Регистр ОстаткиМатериалов Приход

Движение = Движения.ОстаткиМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Материал = ТекСтрокаМатериалы.Материал;

Движение.Склад = Склад;

Движение.Количество = ТекСтрокаМатериалы.Количество;

 

// Регистр Стоимость Материалов Приход

Движение = Движения.СтоимостьМатериалов.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Материал = ТекСтрокаМатериалы.Материал;

Движение.Стоимость = ТекСтрокаМатериалы.Сумма;

 

КонецЦикла;

 

КонецПроцедуры