Как в правилах обмена МОД заполнить реквизит регистра текущим документом?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Разберем подробно все возможные способы решения этой задачи — от штатной макроподстановки в таблице правил до гибкого программного переопределения в обработчиках событий МОД.

Способ 1. Использование макроподстановки в правилах конвертации реквизитов

Самый простой и быстрый способ, не требующий написания объемного кода — указание специального макроса непосредственно в настройках правила конвертации реквизита (ПКР) движения регистра.

Рассмотрим по шагам, как это настраивается:

  1. Открываем обработку настройки правил обмена МОД.
  2. Находим правило переноса движений нужного регистра.
  3. В таблице соответствия реквизитов для целевого поля (например, ПрихДокумент) в колонке выражения/значения по умолчанию указываем макрос: #ТекущийДокумент.
  4. Сохраняем правила обмена и выполняем выгрузку/загрузку данных.

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

Способ 2. Программное заполнение в обработчике ПриЗаписиДвиженийРегистра

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

Проанализируем работу процедуры ПриЗаписиДвиженийРегистра. В момент ее выполнения контекст документа уже существует, а набор движений подготовлен к фиксации в базе данных. Посмотрим на пример программной установки реквизита:


// В обработчике ПриЗаписиДвиженийРегистра правил МОД
Если Регистр.Вид() = "ОстаткиТМЦ" Тогда
    // Заполняем реквизит регистра ссылкой на загружаемый документ
    Регистр.ПрихДокумент = ТекущийДокумент;
КонецЕсли;

Если в конфигурации используется прямое обращение к методам формирования движений, заполнение поля выполняется непосредственно перед вызовом фиксации записи:


// Установка значения реквизита перед фиксацией прихода
Регистр.ОстаткиТМЦ.ПрихДокумент = ДокументПриемник.ТекущийДокумент();
Регистр.ОстаткиТМЦ.ДвижениеПриходВыполнить();

Особенности платформы 1С 7.7 при загрузке движений регистров

Выясним важные технические нюансы, которые необходимо учитывать при настройке обмена движениями регистров в 1С 7.7:

  1. Последовательность записи: Движение регистра в 1С 7.7 физически не может существовать без записанного документа-регистратора. Если попытка заполнить реквизит происходит до фактической записи шапки документа в базу-приемник, реквизит получит пустую ссылку.
  2. Пропуск бизнес-логики модулей документов: Прямой перенос движений через МОД загружает строки регистров в обход предопределенной процедуры ОбработкаПроведения. В этом случае не отрабатывают встроенные проверки остатков и контроль последовательностей партий.
  3. Статус проведения документа: При прямой загрузке движений важно убедиться, что у документа-приемника выставлен признак проведенности с помощью метода СделатьПроведенным(), иначе возникнет рассинхронизация: движения в регистрах присутствуют, но в журнале документ отображается как непроведенный.

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

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

← На главную