Как правильно добавить приходные движения в регистр «Товары к поступлению» в 1С:ERP для нового документа

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет
← На главную

При разработке в среде 1С:ERP 2.5 программисты часто сталкиваются с задачей создания собственных документов, которые должны вести себя аналогично типовым. Одной из таких задач является реализация движений по регистру накопления ТоварыКПоступлению. Этот регистр играет ключевую роль в подсистеме обеспечения потребностей, и простое написание кода в процедуре ОбработкаПроведения здесь зачастую недостаточно. Давайте подробно разберем, как реализовать эту задачу, соблюдая архитектурные принципы ERP.

Понимание архитектуры регистра «Товары к поступлению»

Прежде чем приступать к кодингу, проанализируем, как работает этот регистр. Он является остаточным и предназначен для учета товаров, которые «ожидаются» на складе. В типовой логике:

  1. Приход делают документы-планы или документы-распоряжения (например, ЗаказПоставщику, ЗаказНаПеремещение).
  2. Расход делают документы фактического поступления (например, ПриобретениеТоваровУслуг, ПоступлениеОтПереработчика).

Важно понимать, что если мы просто добавим «Приход» нашим новым документом, типовой документ ПриобретениеТоваровУслуг «из коробки» не увидит наш документ как основание и не закроет остаток (не сделает расход). Это приведет к тому, что товар будет вечно «висеть» в ожидании.

Шаг 1. Настройка метаданных

Первым делом наш новый документ необходимо добавить в список регистраторов регистра накопления ТоварыКПоступлению. Без этого шага любая попытка записи в регистр вызовет ошибку прав доступа или платформенное исключение. Найдите регистр в дереве конфигурации, перейдите на вкладку «Регистраторы» и отметьте ваш документ.

Шаг 2. Использование механизмов проведения ERP (Модуль менеджера)

В современных версиях ERP (начиная с 2.4/2.5) логика проведения вынесена из модуля документа в модуль менеджера. Это сделано для возможности проведения документов в фоновом режиме и оптимизации запросов. Рассмотрим алгоритм действий:

Найдем в модуле менеджера вашего документа процедуру ИнициализироватьДанныеДокумента. Именно здесь подготавливаются таблицы значений, которые позже станут движениями. Рассмотрим пример структуры кода:


Процедура ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   ТЧ.Номенклатура КАК Номенклатура,
        |   ТЧ.Характеристика КАК Характеристика,
        |   ТЧ.Склад КАК Склад,
        |   ТЧ.Количество КАК Количество,
        |   &Ссылка КАК ДокументПоступления,
        |   ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения
        |ИЗ
        |   Документ.ВашНовыйДокумент.Товары КАК ТЧ
        |ГДЕ
        |   ТЧ.Ссылка = &Ссылка";
    
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    
    РезультатЗапроса = Запрос.Выполнить();
    ТаблицаДвижений = РезультатЗапроса.Выгрузить();
    
    // Добавляем таблицу в дополнительные свойства для передачи в универсальные механизмы
    ДополнительныеСвойства.ТаблицыДляДвижений.Вставить("ТаблицаТоварыКПоступлению", ТаблицаДвижений);

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

Обратите внимание на поле ДокументПоступления. В данном регистре это измерение является ключевым. Если ваш документ — аналог заказа, то в это поле нужно передавать Ссылка самого документа.

Шаг 3. Заполнение специфических аналитик

Проанализируем состав измерений регистра. Помимо стандартных Номенклатура и Склад, там присутствует Назначение. Если в вашей базе включен обособленный учет товаров, крайне важно заполнять это поле. Если товар закупается под конкретный заказ клиента, Назначение должно соответствовать этому заказу. Если вы оставите его пустым, система может «не увидеть» этот приход в отчетах по обеспечению заказов.

Шаг 4. Обработка проведения в модуле документа

В самом модуле документа в процедуре ОбработкаПроведения мы вызываем стандартный механизм проведения ERP. Проанализируем типичную структуру этой процедуры:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
    // 1. Инициализация дополнительных свойств
    ПроведениеСервер.ПодготовитьДополнительныеСвойстваПроведения(Ссылка, ДополнительныеСвойства);
    
    // 2. Подготовка данных (вызов процедуры из модуля менеджера)
    Документы.ВашНовыйДокумент.ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства);
    
    // 3. Формирование движений
    ПроведениеСервер.СформироватьДвиженияДокумента(Отказ, ДополнительныеСвойства);
    
КонецПроцедуры

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

Шаг 5. Проблема закрытия остатков (Расход)

Выясним причину, по которой простого прихода недостаточно. В ERP документ ПриобретениеТоваровУслуг при проведении ищет остатки в регистре ТоварыКПоступлению по измерению ДокументПоступления. Чтобы ваш новый документ «закрылся» фактическим поступлением, вам придется:

  1. Либо в документе ПриобретениеТоваровУслуг выбирать ваш документ в качестве распоряжения (основания).
  2. Либо расширять запрос в модуле проведения ПриобретенияТоваровУслуг, чтобы он учитывал ваш тип документа при расчете остатков к получению.

Если это кажется слишком сложным, рассмотрим совет из обсуждения: создать свой регистр накопления. Это оправдано, если ваш документ не должен участвовать в стандартных цепочках «Заказ — Поступление», а нужен только для специфической отчетности. Однако, если вы хотите использовать типовое рабочее место «Приемка товаров», придется интегрироваться в типовой регистр.

Важные рекомендации

Проанализируем еще несколько нюансов, характерных для 1С:ERP:

Таким образом, внедрение нового документа в контур оперативного учета ERP — это не просто добавление кода в ОбработкаПроведения, а интеграция в общую экосистему метаданных и серверных методов конфигурации.

← На главную