При разработке в среде 1С:ERP 2.5 программисты часто сталкиваются с задачей создания собственных документов, которые должны вести себя аналогично типовым. Одной из таких задач является реализация движений по регистру накопления ТоварыКПоступлению. Этот регистр играет ключевую роль в подсистеме обеспечения потребностей, и простое написание кода в процедуре ОбработкаПроведения здесь зачастую недостаточно. Давайте подробно разберем, как реализовать эту задачу, соблюдая архитектурные принципы ERP.
Прежде чем приступать к кодингу, проанализируем, как работает этот регистр. Он является остаточным и предназначен для учета товаров, которые «ожидаются» на складе. В типовой логике:
ЗаказПоставщику, ЗаказНаПеремещение).ПриобретениеТоваровУслуг, ПоступлениеОтПереработчика).Важно понимать, что если мы просто добавим «Приход» нашим новым документом, типовой документ ПриобретениеТоваровУслуг «из коробки» не увидит наш документ как основание и не закроет остаток (не сделает расход). Это приведет к тому, что товар будет вечно «висеть» в ожидании.
Первым делом наш новый документ необходимо добавить в список регистраторов регистра накопления ТоварыКПоступлению. Без этого шага любая попытка записи в регистр вызовет ошибку прав доступа или платформенное исключение. Найдите регистр в дереве конфигурации, перейдите на вкладку «Регистраторы» и отметьте ваш документ.
В современных версиях ERP (начиная с 2.4/2.5) логика проведения вынесена из модуля документа в модуль менеджера. Это сделано для возможности проведения документов в фоновом режиме и оптимизации запросов. Рассмотрим алгоритм действий:
Найдем в модуле менеджера вашего документа процедуру ИнициализироватьДанныеДокумента. Именно здесь подготавливаются таблицы значений, которые позже станут движениями. Рассмотрим пример структуры кода:
Процедура ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ТЧ.Номенклатура КАК Номенклатура,
| ТЧ.Характеристика КАК Характеристика,
| ТЧ.Склад КАК Склад,
| ТЧ.Количество КАК Количество,
| &Ссылка КАК ДокументПоступления,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения
|ИЗ
| Документ.ВашНовыйДокумент.Товары КАК ТЧ
|ГДЕ
| ТЧ.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ТаблицаДвижений = РезультатЗапроса.Выгрузить();
// Добавляем таблицу в дополнительные свойства для передачи в универсальные механизмы
ДополнительныеСвойства.ТаблицыДляДвижений.Вставить("ТаблицаТоварыКПоступлению", ТаблицаДвижений);
КонецПроцедуры
Обратите внимание на поле ДокументПоступления. В данном регистре это измерение является ключевым. Если ваш документ — аналог заказа, то в это поле нужно передавать Ссылка самого документа.
Проанализируем состав измерений регистра. Помимо стандартных Номенклатура и Склад, там присутствует Назначение. Если в вашей базе включен обособленный учет товаров, крайне важно заполнять это поле. Если товар закупается под конкретный заказ клиента, Назначение должно соответствовать этому заказу. Если вы оставите его пустым, система может «не увидеть» этот приход в отчетах по обеспечению заказов.
В самом модуле документа в процедуре ОбработкаПроведения мы вызываем стандартный механизм проведения ERP. Проанализируем типичную структуру этой процедуры:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// 1. Инициализация дополнительных свойств
ПроведениеСервер.ПодготовитьДополнительныеСвойстваПроведения(Ссылка, ДополнительныеСвойства);
// 2. Подготовка данных (вызов процедуры из модуля менеджера)
Документы.ВашНовыйДокумент.ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства);
// 3. Формирование движений
ПроведениеСервер.СформироватьДвиженияДокумента(Отказ, ДополнительныеСвойства);
КонецПроцедуры
Использование ПроведениеСервер.СформироватьДвиженияДокумента позволяет системе автоматически обработать таблицы, которые мы подготовили в модуле менеджера, и записать их в соответствующие регистры.
Выясним причину, по которой простого прихода недостаточно. В ERP документ ПриобретениеТоваровУслуг при проведении ищет остатки в регистре ТоварыКПоступлению по измерению ДокументПоступления. Чтобы ваш новый документ «закрылся» фактическим поступлением, вам придется:
ПриобретениеТоваровУслуг выбирать ваш документ в качестве распоряжения (основания).ПриобретенияТоваровУслуг, чтобы он учитывал ваш тип документа при расчете остатков к получению.Если это кажется слишком сложным, рассмотрим совет из обсуждения: создать свой регистр накопления. Это оправдано, если ваш документ не должен участвовать в стандартных цепочках «Заказ — Поступление», а нужен только для специфической отчетности. Однако, если вы хотите использовать типовое рабочее место «Приемка товаров», придется интегрироваться в типовой регистр.
Проанализируем еще несколько нюансов, характерных для 1С:ERP:
ИнициализироватьДанныеДокумента.ЗапасыИПотребности.Таким образом, внедрение нового документа в контур оперативного учета ERP — это не просто добавление кода в ОбработкаПроведения, а интеграция в общую экосистему метаданных и серверных методов конфигурации.