Конструктор создал обработчик события ОбработкаПроведения объекта конфигурации Документ ПриходнаяНакладная, поместил его в модуль объекта и открыл текст модуля.
Событие ОбработкаПроведения является одним из важнейших событий, связанных с документом. Это событие возникает при проведении документа. Основное назначение обработчика данного события - генерация движений по документу. Выполнение различных операций с данными в процедуре обработчика влияет на состояние учета. Таким образом, именно в эту процедуру разработчик должен поместить собственные алгоритмы преобразования данных, выполняемые в момент проведения документа.
Поясним текст процедуры обработчика:
Объект встроенного языка ДокументОбъект имеет свойство Движения. Оно возвращает объект КоллекцияДвижений, содержащий коллекцию наборов записей регистров, по которым этот документ может формировать движения.
К конкретному набору записей этой коллекции можно обратиться, указав через точку имя регистра, которому принадлежит этот набор записей. Например, Движения.ОстаткиМатериалов.
|
|
Затем через точку можно использовать различные методы набора записей регистра, например, Движения.ОстаткиМатериалов.Добавить (). Метод Добавить() добавляет новую запись в набор записей.
В первой строке процедуры мы устанавливаем свойство Записывать набора записей регистра в значение Истина. То есть в явном виде указываем, что после завершения обработки проведения платформа должна будет записать этот набор записей в базу данных.
Внутри обработчика расположен цикл Для Каждого... Из... Цикл. Он предназначен для перебора строк табличной части нашего документа.
В цикле обращение к табличной части документа происходит по имени (Материалы). Переменная ТекСтрокаМатериалы содержит объект с данными текущей строки табличной части документа. Эта переменная создается в начале цикла и меняется по мере его прохождения.
В первой строке тела цикла, используя метод Добавить(), мы добавляем к набору записей, который создает наш документ в регистре, новую запись. Тем самым мы создаем объект РегистрНакопленияЗапись и сохраняем его в переменной Движение.
Используя этот объект, мы можем обратиться к полям этой записи, указав имя поля через точку от этой переменной (например, Движение.Количество).
Причем Движение.Материал, Движение.Склад - это измерения регистра, Движение.Количество - это ресурс регистра, а Движение.ВидДвижения и Движение.Период - стандартные реквизиты регистра, которые создаются автоматически.
Чтобы присвоить полям новой записи регистра соответствующие значения полей документа, мы обращаемся к полям табличной части, указав имя поля через точку от переменной ТекСтрокаМатериалы (например, ТекСтрокаМатериалы.Материал).
|
|
Заметим, что Склад - это реквизит шапки документа, а Дата - стандартный реквизит документа, который создается автоматически. Причем в цикле меняются только значения полей табличной части документа - ТекСтрокаМатериалы.Материал и ТекСтрокаМатериалы.Количество. Остальные поля не меняются, так как относятся к документу в целом и не зависят от текущей строки табличной части документа.
ВидДвиженияНакопления.Приход - это значение системного перечисления, которое определяет вид движения регистра накопления как Приход.
Таким образом, мы присваиваем нужные значения всем полям новой записи. После перебора всех строк документа (после завершения цикла) в этом наборе записей (Движения.ОстаткиМатериалов) будет содержаться столько записей, сколько строк в табличной части проводимого документа.
Если мы теперь откроем окно редактирования объекта конфигурации Регистр накопления Остатки Материалов и перейдем на закладку Регистраторы, то в списке документов, созданных в конфигурации, мы увидим отмеченный документ ПриходнаяНакладная, так как мы задали в модуле этого документа формирование движений в регистре ОстаткиМатериалов (рисунок 3.4).
Рисунок 3.4 - Регистраторы регистра «ОстаткиМатериалов»
Отредактируем командный интерфейс, чтобы в подсистемах Бухгалтерия, Оказание услуг и Учет материалов была доступна ссылка для просмотра записей нашего регистра накопления.
Команды открытия регистров также добавляются в панель навигации подсистем, но по умолчанию они невидимы, в отличие от команд открытия справочников и документов.
В дереве объектов конфигурации выделим ветвь Подсистемы, вызовем ее контекстное меню и выберем пункт Все подсистемы.
В открывшемся окне слева в списке Подсистемы выделим подсистему УчетМатериалов.
Справа в списке Командный интерфейс отразятся все команды выбранной подсистемы.
В группе Панель навигации.Обычное включим видимость у команды Остатки материалов и мышью перетащим ее в группу Панель навигации. См.также (рисунок 3.5).
Рисунок 3.5 – Настройка командного интерфейса подсистем
Действительно, команды открытия регистров накопления не так часто используются, и поэтому лучше их перенести в группу См.также панели навигации разделов интерфейса.
Аналогично, выделив подсистемы ОказаниеУслуг и Бухгалтерия, в панели навигации в группе Обычное включим видимость у команды Остатки материалов и перенесем ее в группу См.также.
Запустим 1С:Предприятие в режиме отладки и протестируем внесенные нами изменения.
В открывшемся окне 1С:Предприятия видим, что в панели навигации в группе См.также разделов Бухгалтерия, Оказание услуг и Учет материалов появилась команда для открытия списка регистра Остатки материалов (рисунок 3.6).
Рисунок 3.6 – Список регистра накопления «ОстаткиMатериалов»
Чтобы проследить связь между проведением документа и накоплением информации в регистре, откроем список приходных накладных, выполнив команду Приходные накладные разделе Бухгалтерия.
Откроем Приходную накладную № 1 и нажмем Провести и закрыть, то есть перепроведем ее. То же самое сделаем для Приходной накладной № 2.
Перепровести документы можно и не открывая документов. Для этого нужно выделить нужный документ в списке (или выделить мышью группу документов, удерживая клавишу Ctrl), нажать кнопку Все действия в командной панели формы списка и выбрать пункт Провести (рисунок 3.7).
Рисунок 3.7 – Проведение документа
Далее выполним команду Остатки материалов и откроем список нашего регистра накопления (рисунок 3.8).
|
|
Рисунок 3.8 – Список регистра накопления «ОстаткиМатериалов»
При проведении приходных накладных появляются соответствующие записи в регистре накопления Остатки материалов. Добавилось пять записей - первые три после проведения первого документа, что соответствует количеству строк в его табличной части, и последние две после проведения второго документа.
Все поля регистра заполнились данными документов так, как задали в обработчике проведения документа ПриходнаяНакладная. Пиктограмма со знаком + слева от каждой записи указывает на тип движения - Приход.
Заголовок формы списка записей регистра соответствует заданному нами в свойстве Расширенное представление списка для этого регистра.
Команда перехода к движениям в форме документа
При реальной работе записей в регистре ОстаткиМатериалов будет много, и будет трудно понять, какие записи относятся к определенному документу.
Поэтому наряду с общим списком регистра хотелось бы иметь возможность вызывать из формы документа список регистра, в котором показаны движения, произведенные только этим документом. Для этого:
1. В конфигураторе откроем форму документа ПриходнаяНакладная.
2. В левом верхнем окне перейдем на закладку Командный интерфейс.
3. В разделе Панель навигации раскроем группу Перейти и увидим команду для открытия списка регистра накопления Остатки материалов. Эта команда была автоматически помещена в панель навигации формы документа, так как он является регистратором, то есть создает движения в нашем регистре.
4. Установим свойство Видимость для этой команды (рисунок 3.9).
Рисунок 3.9 – Настройка командного интерфейса формы документа
Запустим 1С:Предприятие в режиме отладки и откроем Приходную накладную № 2 (рисунок 3.10).
Рисунок 3.10 – Панель навигации документа «Приходная накладная»
В форме документа появилась панель навигации, в которой мы можем переходить к списку записей регистра Остатки Материалов, связанному с документом (рисунок 3.11), и обратно к содержимому документа.
Рисунок 3.11 – Переход к регистру накопления из формы документа
|
|
Обратите внимание, что до этого панель навигации в форме приходной накладной была не видна, так как в ней не было отображено ни одной команды.
Движения документа «ОказаниеУслуги»
Аналогичным образом создадим движения документа ОказаниеУслуги. Для этого потребуется выполнить уже знакомые нам действия:
1. В режиме Конфигуратор откроем окно редактирования объекта конфигурации Документ ОказаниеУслуги.
2. Перейдем на закладку Движения и в списке регистров конфигурации отметим регистр накопления ОстаткиМатериалов.
3. Нажмем кнопку Конструктор движений.
4. В открывшемся окне конструктора изменим тип движения регистра на Расход, так как документ ОказаниеУслуги должен расходовать материалы. Пиктограмма слева от названия регистра изменится на знак -.
5. В поле выбора Табличная часть выберем табличную часть нашего документа - ПереченьНоменклатуры. Список реквизитов документа, который уже заполнен реквизитами шапки документа, автоматически дополнится реквизитами нашей табличной части.
6. Нажмем кнопку Заполнить выражения. В нижнем окне сформируется соответствие полей (измерений и ресурсов) регистра и выражений для их расчета. Однако при автоматическом заполнении поле Материал не заполнится.
Так происходит потому, что имя поля табличной части - Номенклатура не совпадает с именем измерения регистра - Материал. Если оставим это так, как есть, то в регистре накопления в строках с типом Движение регистра - расход номенклатура фиксироваться не будет.
7. Чтобы избежать этого, надо выделить поле регистра Материал и в окне Реквизиты документа дважды щелкнуть по строке ТекСтрокаПереченьНомеклатуры.Номенклатура.
Т.о., номенклатура для движений регистра накопления будет выбираться из табличной части документа (рисунок 3.12).
Рисунок 3.12 – Выбор табличной части документа и заполнение выражений для расчета движений регистра
8. Нажмем кнопку ОК. Конструктор создал обработчик события ОбработкаПроведения объекта конфигурации Документ ОказаниеУслуги и поместил его в модуль объекта.
Процедура ОбработкаПроведения(Отказ, Режим)
//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
// регистр ОстаткиМатериалов Расход
Движения.ОстаткиМатериалов.Записывать = Истина;
Для Каждого ТекСтрокаПереченьНоменклатуры Из ПереченьНоменклатуры Цикл
Движение = Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Материал=ТекСтрокаПереченьНоменклатуры.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = ТекСтрокаПереченьНоменклатуры.Количество;
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ