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