Как заполнить реквизиты формы и статусы документа при обмене данными в 1С

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

При реализации обмена данными между конфигурациями 1С программисты часто сталкиваются с ситуацией, когда данные в объект загружаются, но визуально в форме документа (например, в «Платежном поручении») важные статусы остаются незаполненными. Основная сложность заключается в том, что при обмене устанавливается режим ОбменДанными.Загрузка = Истина, который отключает стандартные проверки и логику в модулях объекта. В этой статье мы подробно разберем, как вмешаться в процесс записи, передать дополнительные признаки и обеспечить корректное отображение данных на форме.

Разберем проблему: почему код в модуле объекта не срабатывает

Когда данные приходят через механизм синхронизации или универсальный обмен, платформа 1С устанавливает свойство ОбменДанными.Загрузка в значение Истина. Это делается для того, чтобы загрузка больших объемов данных не блокировалась проверками остатков, сложными расчетами или контролем заполнения, которые актуальны только при ручном вводе пользователем. Рассмотрим типовую структуру начала процедуры ПередЗаписью в модуле документа:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    // Дальнейшая логика, которая игнорируется при обмене
КонецПроцедуры

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

Способ 1. Использование «Дополнительных свойств» объекта

Зачастую нам нужно передать из базы-источника некий признак (например, что платежка пришла из системы аренды), которого нет в структуре метаданных документа базы-приемника. В таких случаях удобно использовать коллекцию ДополнительныеСвойства. Это структура, которая существует в памяти объекта, но не записывается в таблицу базы данных. Мы можем заполнить её в базе-источнике (в правилах выгрузки) и прочитать в базе-приемнике.

Рассмотрим пример кода в модуле объекта базы-приемника:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    // Код выполняется ВСЕГДА, даже при обмене
    Если ДополнительныеСвойства.Свойство("СтатусИзАренды") Тогда
        ПризнакАренды = ДополнительныеСвойства.СтатусИзАренды;
        // Здесь можно заполнить какой-либо реквизит объекта
        // или подготовить данные для записи в регистр
    КонецЕсли;

    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
КонецПроцедуры

Способ 2. Работа с реквизитами формы через регистры сведений

В современных конфигурациях, таких как «1С:Бухгалтерия 8.3», многие реквизиты (например, Состояние в платежном поручении) на самом деле не являются реквизитами самого объекта ДокументОбъект.ПлатежноеПоручение. Это динамически вычисляемые данные или реквизиты формы, которые при открытии считываются из специальных регистров. Для быстрого анализа реального состава реквизитов объекта при подготовке интеграции подойдёт генератор структуры метаданных объекта.

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

Проанализируем пример записи в регистр при загрузке документа:


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

Способ 3. Подписки на события — «чистый» подход

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

Разберем по шагам создание такой подписки:

  1. Создайте в дереве метаданных новый объект ОбщийМодуль (если нет подходящего), установите свойства «Сервер» и «Внешнее соединение».
  2. Создайте объект ПодпискаНаСобытие.
  3. В поле «Источник» выберите тип вашего документа (например, ДокументОбъект.ПлатежноеПоручение).
  4. В поле «Событие» выберите ПередЗаписью.
  5. В обработчике подписки напишите логику заполнения.

Пример кода в общем модуле для подписки:


Процедура ОбработкаЗаписиПлатежкиПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    // Источник — это сам ДокументОбъект
    Если Источник.ОбменДанными.Загрузка Тогда
        // Реализуем логику заполнения данных, специфичных для обмена
        Источник.Комментарий = "Загружено из системы аренды: " + ТекущаяДата();
    КонецЕсли;
КонецПроцедуры

Как отладить процесс обмена, если он запускается в фоне

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

  1. Фоновые задания: Обмен данными обычно выполняется в фоновом режиме. Чтобы отладка сработала, в конфигураторе в меню «Сервис — Параметры — Отладка» должен быть включен флаг «Отладка фоновых заданий».
  2. Режим сервера: Убедитесь, что сервер 1С запущен с ключом -debug. Без этого отладка на сервере (где и происходит запись документов при обмене) невозможна.
  3. Остановка в коде: Вместо обычных точек останова иногда удобно использовать метод ЗаписьЖурналаРегистрации, чтобы проверить, какие значения принимают переменные в момент загрузки, если отладчик все же не подключается.

Особенности работы с формой: ПриЧтенииНаСервере

Если ваша задача — просто визуально изменить что-то в форме документа, когда он открывается (и эти данные не нужно хранить в базе), то следует использовать обработчик модуля формы ПриЧтенииНаСервере. Это событие вызывается после того, как данные объекта уже прочитаны из базы, но еще не отображены пользователю.

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


&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    // Проверяем наличие признака в доп. свойствах или по специфическому комментарию
    Если Найти(ТекущийОбъект.Комментарий, "из системы аренды") > 0 Тогда
        Элементы.ГруппаИнформационнаяНадпись.Видимость = Истина;
        Объект.СостояниеНаФорме = "Проверено";
    КонецЕсли;
КонецПроцедуры

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

Заключение

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

← На главную