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