При настройке правил обмена данными (МОД) на платформе 1С:Предприятие 7.7 нередко возникает специфическая задача: при загрузке движений регистров накопления или остатков необходимо заполнить реквизит движения ссылкой на загружаемый в данный момент документ-регистратор. Например, если в базе-приемнике у регистра есть реквизит ПрихДокумент с типом Документ (или неопределенного типа), куда требуется записать ссылку на текущую позицию партии.
Разберем подробно все возможные способы решения этой задачи — от штатной макроподстановки в таблице правил до гибкого программного переопределения в обработчиках событий МОД.
Самый простой и быстрый способ, не требующий написания объемного кода — указание специального макроса непосредственно в настройках правила конвертации реквизита (ПКР) движения регистра.
Рассмотрим по шагам, как это настраивается:
ПрихДокумент) в колонке выражения/значения по умолчанию указываем макрос: #ТекущийДокумент.При обработке этого макроса подсистема МОД автоматически подставит ссылку на созданный и записанный в приемнике документ-регистратор. Однако важно учитывать, что если тип реквизита в регистре задан не конкретным видом документа, а имеет общий тип Документ или Неопределенный, нужно следить за корректной передачей контекста, чтобы значение не оказалось пустым.
Если макрос по каким-либо причинам не подходит (например, требуется дополнительная логика: заполнять реквизит только для определенных видов движения или конкретных типов документов), наиболее надежным решением выступает программное заполнение в обработчике событий МОД.
Проанализируем работу процедуры ПриЗаписиДвиженийРегистра. В момент ее выполнения контекст документа уже существует, а набор движений подготовлен к фиксации в базе данных. Посмотрим на пример программной установки реквизита:
// В обработчике ПриЗаписиДвиженийРегистра правил МОД
Если Регистр.Вид() = "ОстаткиТМЦ" Тогда
// Заполняем реквизит регистра ссылкой на загружаемый документ
Регистр.ПрихДокумент = ТекущийДокумент;
КонецЕсли;
Если в конфигурации используется прямое обращение к методам формирования движений, заполнение поля выполняется непосредственно перед вызовом фиксации записи:
// Установка значения реквизита перед фиксацией прихода
Регистр.ОстаткиТМЦ.ПрихДокумент = ДокументПриемник.ТекущийДокумент();
Регистр.ОстаткиТМЦ.ДвижениеПриходВыполнить();
Выясним важные технические нюансы, которые необходимо учитывать при настройке обмена движениями регистров в 1С 7.7:
ОбработкаПроведения. В этом случае не отрабатывают встроенные проверки остатков и контроль последовательностей партий.СделатьПроведенным(), иначе возникнет рассинхронизация: движения в регистрах присутствуют, но в журнале документ отображается как непроведенный.Во многих сценариях надежнее переносить только сами документы (шапку и строки табличной части) без выгрузки движений. Для этого в МОД включается флаг автоматического проведения документов после загрузки. В таком случае конфигурация-приемник выполнит штатную процедуру ОбработкаПроведения(), где реквизит ПрихДокумент заполнится стандартным выражением ТекущийДокумент() без риска возникновения логических ошибок учета.