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