Как заполнить дополнительный реквизит в регистре сведений при проведении документа в 1С:ERP 2.5?

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

При разработке в среде 1С:ERP Управление предприятием 2.5 (или Комплексная автоматизация 2.5) программисты часто сталкиваются с ситуацией, когда добавление одноименных реквизитов в документ и связанный с ним регистр сведений не приводит к их автоматическому заполнению. В отличие от простых конфигураций, где движения могут формироваться простым перебором строк, механизмы ERP построены на сложной многослойной архитектуре. В этой статье мы подробно разберем, как правильно «пробросить» данные из документа в регистр, соблюдая стандарты разработки типовых решений.

Анализируем причину: почему автоматическое заполнение не работает

В типовых решениях на базе ERP 2.5 процесс проведения документа — это не просто вызов метода Записать() для набора записей регистра. Система использует универсальный механизм формирования движений. Проанализируем ситуацию: когда вы вызываете проведение, документ подготавливает временные таблицы с данными, которые затем передаются в общие модули проведения. Если вашего нового реквизита нет в тексте запроса, который формирует эту таблицу, то система «не увидит» данные, даже если имена полей в метаданных полностью совпадают.

Рассмотрим конкретный пример с документом УстановкаЦенНоменклатуры и регистром сведений ЦеныНоменклатуры25. Основная логика здесь скрыта не в модуле объекта, а в модуле менеджера. Именно там описываются запросы, собирающие данные из табличных частей документа для последующей записи в регистр.

Шаг 1. Поиск точки входа в модуле менеджера

Для начала выясним, где именно формируются данные. В модуле менеджера документа УстановкаЦенНоменклатуры нас интересуют функции, возвращающие текст запроса. Разберем наиболее важные из них:

Проанализируем структуру этих методов. Обычно они возвращают строку кода SQL-подобного языка запросов 1С. Чтобы наш Реквизит1 попал в регистр, он должен быть выбран в основном блоке ВЫБРАТЬ этого запроса.

Шаг 2. Модификация логики через расширение

Поскольку мы работаем с типовой конфигурацией, крайне не рекомендуется вносить изменения напрямую. Мы будем использовать расширение конфигурации. Рассмотрим, как применить аннотацию &Вместо или &После для изменения текста запроса. Наиболее гибкий способ — перехватить возвращаемую строку запроса и внедрить в неё свое поле.

Посмотрим на пример кода в расширении для модуля менеджера:


&Вместо("ТекстЗапросаТаблицаЦеныНоменклатуры2_5")
Функция рез_ТекстЗапросаТаблицаЦеныНоменклатуры2_5(Параметры)
    ТекстЗапроса = ПродолжитьВызов(Параметры);
    
    // Внедряем выборку нашего реквизита из табличной части документа
    // Предположим, реквизит добавлен в ТЧ "Товары" документа
    СтарыйТекст = "ВЫБРАТЬ
                  |	ТаблицаТовары.Номенклатура КАК Номенклатура,";
    
    НовыйТекст = "ВЫБРАТЬ
                 |	ТаблицаТовары.Номенклатура КАК Номенклатура,
                 |	ТаблицаТовары.Реквизит1 КАК Реквизит1,";
    
    ТекстЗапроса = СтрЗаменить(ТекстЗапроса, СтарыйТекст, НовыйТекст);
    
    Возврат ТекстЗапроса;
КонецФункции

Важный нюанс: при использовании СтрЗаменить нужно быть очень внимательным к пробелам и символам переноса строк. Если структура запроса в обновлении ERP изменится, замена может не сработать. Проанализируем альтернативу: можно полностью скопировать текст запроса в расширение, но тогда при обновлении конфигурации вам придется вручную сверять изменения в типовом коде.

Шаг 3. Обеспечение передачи данных через временные таблицы

Процесс проведения в ERP часто состоит из нескольких этапов формирования временных таблиц. Выясним, проходит ли ваш реквизит через все «фильтры». После того как вы добавили поле в основной запрос в модуле менеджера, система помещает результат во временную таблицу (например, ВТЦеныНоменклатуры).

Если регистр сведений содержит Реквизит1 как ресурс или дополнительное сведение, убедитесь, что в итоговом запросе, который формирует набор записей, это поле также присутствует. В большинстве случаев в ERP 2.5 механизмы построены так, что если поле есть во временной таблице с нужным именем, оно автоматически попадет в Движения.

Шаг 4. Отладка процесса проведения

Рассмотрим, как проверить правильность наших действий. Выполним следующие шаги:

  1. Установите точку останова в общем модуле ПроведениеДокументов в процедуре ОбработкаПроведенияДокумента.
  2. Запустите проведение документа Установка цен номенклатуры.
  3. Когда выполнение остановится, найдите переменную, содержащую структуру таблиц для движений (обычно это ТаблицыДляДвижений).
  4. Посмотрите состав колонок в таблице, соответствующей регистру ЦеныНоменклатуры25. Если ваша колонка Реквизит1 там появилась и заполнена данными — поздравляем, вы все сделали верно!

Особенности работы с регистром «Цены номенклатуры 2.5»

Этот регистр является «вытесняющим» и имеет сложную структуру ключей. Если вы добавили реквизит как измерение, система начнет разделять записи по этому полю (например, для одной номенклатуры может быть две цены с разными значениями реквизита). Если же это ресурс, он просто будет храниться вместе с ценой.

Посмотрим на типичную ошибку: типы данных. Если в документе Реквизит1 имеет тип Строка, а в регистре — СправочникСсылка.ЗначенияСвойствОбъектов, система выдаст ошибку при записи движений. Всегда проверяйте строгое соответствие типов в метаданных.

Альтернативный способ: подписка на событие

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


Процедура ПриПроведенииДокумента(Источник, Отказ, РежимПроведения) Экспорт
    // Дозаполняем движения напрямую
    Для Каждого Движение Из Источник.Движения.ЦеныНоменклатуры25 Цикл
        // Поиск данных в ТЧ документа и заполнение
        // Однако этот метод крайне медленный на больших объемах данных
    КонецЦикла;
КонецПроцедуры

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

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

← На главную