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