При настройке обмена данными между конфигурациями 1С с помощью «Конвертации данных 2.1» (КД 2.1) специалисты часто сталкиваются с ситуацией, когда основной объект успешно переносится, но одно или несколько его свойств (например, ДокументОснование) остаются пустыми. Ситуация осложняется тем, что в базе-источнике данные заполнены, а в правилах конвертации свойств (ПКС) на первый взгляд всё настроено корректно. Рассмотрим подробно, почему так происходит и как провести глубокую диагностику этой проблемы.
Прежде чем искать ошибку в базе-приемнике или программном коде, мы должны выяснить, на каком этапе «теряются» данные. Для этого проанализируем файл обмена (XML), который формирует база-источник. Выгрузим один проблемный документ и откроем полученный файл любым текстовым редактором или браузером. Проверим наличие узла, соответствующего нашему реквизиту (в нашем случае ДокументОснование).
Возможны три варианта:
Отказ непосредственно в обработчике «Перед выгрузкой» самого ПКС.Если, как в нашем случае, данных нет уже в файле выгрузки, мы сужаем область поиска до базы-источника и настроек правил выгрузки.
Разберем механизм работы ПКС. Когда система обрабатывает правило конвертации свойства, она смотрит на указанное для этого свойства Правило Конвертации Объекта (ПКО). Если реквизит ДокументОснование (в источнике ВнутреннийЗаказ) имеет ссылочный тип, КД 2.1 инициирует выгрузку этого связанного объекта по соответствующему ПКО.
Проанализируем ПКО, которое назначено для выгрузки внутреннего заказа. В КД 2.1 существует критически важная особенность: если в ПКО объекта, на который ссылается реквизит, срабатывает условие Отказ = Истина, то не только сам этот объект не попадет в файл, но и ссылка на него в главном документе занулится. Система считает, что если объект не подлежит выгрузке, то и ссылаться на него нельзя.
Выясним причину, по которой может срабатывать отказ. Часто разработчики пишут в ПКО (обработчик «Перед выгрузкой») проверки на «нужность» объекта. Например, фильтрация по организации, дате или пометке на удаление. Рассмотрим типичный пример кода, который может привести к нашей проблеме:
// Обработчик "Перед выгрузкой" в ПКО документа, который является основанием
Если Источник.ПометкаУдаления Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Если Источник.Дата < '20230101000000' Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
Если наш ВнутреннийЗаказ помечен на удаление или не проходит по дате, ПКО возвращает Отказ. В итоге основной документ выгружается без основания. Чтобы проверить это, временно закомментируем подозрительные участки кода в ПКО и повторим выгрузку. Если реквизит заполнился — причина найдена.
Чтобы не гадать, какой именно алгоритм срабатывает, воспользуемся проверенным методом — вставкой отладочных сообщений. Мы можем добавить вывод информации в различных точках процесса. Рассмотрим, как это сделать правильно.
В обработчике ПКС «Перед выгрузкой» свойства ДокументОснование напишем:
Сообщить("Обработка ПКС ДокументОснование для объекта: " + Источник.Номер);
Сообщить("Значение источника: " + Источник.ВнутреннийЗаказ);
В обработчике ПКО «Перед выгрузкой» для того типа документа, который является основанием:
Сообщить("Попытка выгрузки объекта основания: " + Источник);
// Если здесь есть условия, выводим результат проверки
Если НужноеУсловие Тогда
Сообщить("Условие выполнено, выгружаем.");
Иначе
Сообщить("Отказ выгрузки основания по условию X!");
КонецЕсли;
Проанализируем лог сообщений при выгрузке. Если мы видим сообщение об отказе, значит, логика фильтрации в правилах настроена слишком жестко для текущей задачи.
Проанализируем ситуацию, если ДокументОснование имеет составной тип. Это классический случай для реквизитов типа «Основание». В ПКС для таких полей важно убедиться, что для каждого возможного типа документа в источнике настроено соответствующее ПКО. Если в реквизит попадет документ типа, для которого ПКО не определено (или не указано в списке ПКС), выгрузка этого значения не произойдет.
Также проверим настройку «Выгружать объект по ссылке, если ПКО не указано». Хотя эта настройка помогает избежать пустых ссылок, она может привести к выгрузке «мусорных» данных, поэтому лучше всегда явно указывать нужные ПКО в таблице настройки свойств.
Если простые сообщения не помогают, воспользуемся мощным инструментом КД 2.1 — генерацией модуля выгрузки. Для этого в обработке «Универсальный обмен данными XML» на вкладке «Выгрузка» установим режим отладки:
Это позволит пошагово пройти по всем условиям и увидеть, в какой момент переменной Значение присваивается Неопределено или где взводится флаг Отказ.
Подводя итог, можно сказать, что в 90% случаев отсутствие реквизита в КД 2.1 связано с программными фильтрами в сопутствующих правилах конвертации объектов. Главное правило: если не выгружается свойство-ссылка, проверяй не только ПКС этого свойства, но и ПКО того объекта, на который оно ссылается.
Для стабильной работы обмена рекомендуем:
Отказ = Истина во всех алгоритмах ПКО.