При сопровождении и доработке нетиповых правил обмена в конфигурации «Конвертация данных 2.0» разработчики часто сталкиваются с ситуацией, когда в обработчиках Правил конвертации объектов (ПКО) фигурируют поля, которых нет в реальных метаданных исходной конфигурации. Разберем по шагам, откуда берутся такие поля, где искать формирующие их запросы, а также проанализируем тонкости работы интерфейса и подводные камни механизмов КД 2.0.
Рассмотрим типовой сценарий: в обработчике Перед выгрузкой для документа ОтражениеЗарплатыВРеглУчете анализируется коллекция строк:
Соответствие = Новый Соответствие;
Для каждого Строка ИЗ Источник.ОтражениеВУчете Цикл
Для Сч = 1 по 3 Цикл
ИмяКолонки = "СубконтоДт" + Сч + "Физлицо";
Если ТипЗнч(Строка[ИмяКолонки]) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
Соответствие.Вставить(Строка[ИмяКолонки]);
Конецесли;
ИмяКолонки = "СубконтоКт" + Сч + "Физлицо";
Если ТипЗнч(Строка[ИмяКолонки]) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
Соответствие.Вставить(Строка[ИмяКолонки]);
Конецесли;
КонецЦикла;
КонецЦикла;
В типовой структуре метаданных документа аналитика субконто хранится в универсальных реквизитах составного типа СубконтоДт1, СубконтоДт2, а колонок с постфиксом Физлицо физически не существует. Выясним причину их появления:
Источник формируется вручную через программный запрос или заполнение промежуточной таблицы значений.ВЫРАЗИТЬ(ТЧ.СубконтоДт1 КАК Справочник.ФизическиеЛица) КАК СубконтоДт1Физлицо, создавая виртуальные колонки в результирующей таблице.Запросы.ОтражениеЗарплатыВРеглУчете).При работе с таблицей значений, сформированной запросом, обращение по индексу Строка[ИмяКолонки] приведет к аварийному падению выгрузки с ошибкой «Поле объекта не обнаружено», если колонка не была добавлена (например, на счете задано менее трех субконто). Доработаем код проверки структуры перед обращением к данным:
Если Источник.ОтражениеВУчете.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда
Если ТипЗнч(Строка[ИмяКолонки]) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
Соответствие.Вставить(Строка[ИмяКолонки]);
КонецЕсли;
КонецЕсли;
Обратим внимание на работу коллекции Соответствие: метод Вставить(Ключ) допустим синтаксически и сохраняет ключ со значением Неопределено, выступая аналогом множества уникальных ссылок. Однако если полученный объект далее не передается в Параметры, ИсходящиеДанные или не обрабатывается функцией ВыгрузитьПоПравилу(), сбор данных выполняется вхолостую.
Проанализируем фрагмент выборки данных в ПВД:
ВыборкаДанных = Запросы.ОтражениеЗарплатыВРеглУчете.Выполнить().Выгрузить();
Вызов метода Выгрузить() полностью загружает результат запроса в оперативную память. Для документов отражения зарплаты за длительный период таблица может содержать десятки тысяч строк сложной аналитики. Это часто приводит к критическому переполнению памяти платформы и аварийному завершению сеанса. Рекомендуется использовать последовательный обход через Выборка = Запрос.Выполнить().Выбрать() с порционной передачей данных в обработчик.
Рассмотрим другие важные параметры, используемые в обработчике:
РежимЗаписи = "Проведение" указывает базе-приемнику провести документ после загрузки. Это сработает только в том случае, если в ПКО документа на стороне приемника не заблокировано принудительное проведение и заполнены все обязательные реквизиты.КлючВыгружаемыхДанных = Источник.Ссылка; предотвращает повторную выгрузку одного и того же объекта. Но если в алгоритме ПВД один исходный документ разделяется на несколько виртуальных (например, по подразделениям), фиксированный ключ приведет к потере данных — выгрузится только первая порция. В таких случаях формируем составной ключ, объединяя идентификатор ссылки и разделитель.При настройке ПКО и Правил конвертации свойств (ПКС) интерфейс конфигуратора правил использует цветовую индикацию и специальные значки:
При импорте XML-файла правил обмена в чистую информационную базу КД 2.0 без предварительной загрузки метаданных конфигураций создаются упрощенные фиктивные описания объектов. При последующей обратной выгрузке правил в новый XML могут возникнуть критические расхождения:
Поэтому перед загрузкой XML-правил всегда следует выгружать актуальные структуры метаданных из рабочих конфигураций источника и приемника с помощью штатной обработки MD82Exp.epf (или MD83Exp.epf) и загружать их в КД в первую очередь.