При разработке правил обмена в Конвертации данных 2.1 (КД 2.1) часто возникает необходимость заполнить реквизиты объекта-приемника, которые в обычной пользовательской работе подставляются автоматически при выборе других полей в форме. Начинающие разработчики пытаются вызвать экспортные процедуры формы (например, обработчик перевыбора вида операции) непосредственно при загрузке документа. Рассмотрим, почему такой подход не работает и как правильно решить задачу автозаполнения счетов учета и других реквизитов.
Проанализируем особенности работы платформы 1С:Предприятие при выполнении обмена данными. Процесс загрузки объектов в КД 2.1 происходит в сервисном неинтерактивном режиме на стороне сервера. В этот момент существуют следующие ограничения:
Форма и интерактивные события (такие как ПриИзменении или ПриОткрытии) физически отсутствуют. Попытка вызвать ПолучитьФорму() или обратиться к процедурам модуля формы вызовет ошибку времени выполнения.Объект.ОбменДанными.Загрузка = Истина. Этот флаг отключает большинство стандартных проверок и алгоритмов автозаполнения, предусмотренных в модуле объекта и подписках на события.Таким образом, логика, зашитая в форму документа (например, обработчики типа ВидОперацииПриИзмененииСервер(Форма)), при автоматическом переносе данных выполняться не будет.
Рассмотрим проверенные практические варианты решения задачи, когда в источнике отсутствуют нужные счета учета (60.01, 60.02, 51) или иные реквизиты, но их необходимо подставить в приемнике по виду операции.
В обработчике правил конвертации объектов (ПКО) «После загрузки» доступна переменная Объект. Вместо обращения к форме мы можем вызвать процедуры из общих модулей конфигурации-приемника, передав в них объект документа.
Пример вызова серверного метода перерасчета счетов учета в обработчике «После загрузки»:
// Вызываем серверную процедуру общего модуля приемника для подстановки счетов
ЗаполнениеДокументовСервер.ЗаполнитьСчетаУчетаУправленческий(Объект);
В большинстве типовых конфигураций счета учета расчетов с контрагентами подтягиваются из специальных регистров (например, СчетаУчетаРасчетовСКонтрагентами). В обработчике «После загрузки» можно напрямую запросить нужные значения из регистра и присвоить их реквизитам документа:
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Организация", Объект.Организация);
ПараметрыОтбора.Вставить("Контрагент", Объект.Контрагент);
СчетаУчета = РегистрыСведений.СчетаУчетаРасчетовСКонтрагентами.ПолучитьПоследнее(Объект.Дата, ПараметрыОтбора);
Объект.СчетУчетаРасчетовСПоставщиком = СчетаУчета.СчетУчетаРасчетовСПоставщиком;
Объект.СчетУчетаРасчетовПоАвансам = СчетаУчетаРасчетовПоАвансам;
Если вся необходимая логика заполнения написана в событии ОбработкаЗаполнения или в модуле объекта, можно временно отключить режим загрузки, вызвать заполнение и затем записать документ:
// Временно сбрасываем режим загрузки
Объект.ОбменДанными.Загрузка = Ложь;
// Вызываем стандартный механизм заполнения объекта
Объект.Заполнить(Объект.ВидОперации);
// Возвращаем режим загрузки перед записью (если требуется)
Объект.ОбменДанными.Загрузка = Истина;
Если правила выбора счетов фиксированы и просты, их можно вычислить прямо в правилах конвертации свойств (ПКС) для конкретного реквизита счета. В выражении ПКС пишется код, возвращающий нужную ссылку на счет учета в зависимости от реквизитов источника или приемника.
Использовать контекст формы в правилах обмена Конвертации данных 2.1 нельзя. Любые махинации с реквизитами необходимо выполнять исключительно на уровне сервера через обращение к реквизитам объекта Объект в обработчиках ПКО или алгоритмах КД.