Почему не создается номенклатура по ссылке из документа при онлайн-обмене в 1С (КД2)?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Часто разработчики сталкиваются с ситуацией, когда правила Конвертации Данных 2 (КД2) отлично работают при использовании обработки «Универсальный обмен данными в формате XML», но дают сбой при переходе на онлайн-обмен (через планы обмена БСП). В частности, при выгрузке документа в базу-приемник не создается новая номенклатура, которая передается в качестве реквизита или табличной части. Проанализируем ситуацию и разберем по шагам, почему это происходит и как правильно решить эту задачу.

В чем разница между оффлайн и онлайн-обменом ссылочных данных

Основная причина кроется в архитектуре Библиотеки стандартных подсистем (БСП). Выясним причину такого поведения:

  1. Оффлайн-обмен (Универсальный обмен): Правила читаются прямолинейно. Если в документе есть ссылка на объект (например, на справочник номенклатуры), обработка автоматически «тянет» весь этот объект и формирует полноценный узел XML со всеми его реквизитами. Приемник получает полную информацию и создает элемент.
  2. Онлайн-обмен (Планы обмена БСП): Инфраструктура проверяет регистрацию объекта на узле обмена. Если номенклатура явно не зарегистрирована к выгрузке, система в целях оптимизации может выгружать ее «облегченно» — передавать только GUID-ссылку без свойств (наименования, артикула и т.д.). При загрузке такого файла базе-приемнику банально не хватает реквизитов для создания нового элемента, из-за чего объект по ссылке не создается.

Рассмотрим подробнее несколько вариантов решения данной проблемы, от архитектурно правильных до простых программных заглушек.

Решение 1: Настройка правил регистрации (ПРО) и режима выгрузки

Это наиболее правильный и красивый архитектурный подход, предусмотренный механизмами БСП. Чтобы в базу-приемник попадала сама номенклатура, а не пустая ссылка, нам нужно управлять ее выгрузкой совместно с документом. Для быстрого включения нужных справочников в обмен без изменения метаданных конфигурации можно использовать инструмент для добавления объектов в состав плана обмена в Конвертации данных 2.

  1. Добавим справочник номенклатуры в План обмена для регистрации. Обязательно отключим для него авторегистрацию, чтобы изменения в карточке номенклатуры не ставили ее в очередь на отправку просто так.
  2. В Правилах регистрации объектов (ПРО) для номенклатуры настроим параметр ПереключательРежима, установив для него значение РежимВыгрузкиПриНеобходимости.

Как это работает: номенклатура будет выгружаться в базу-приемник только вместе с документом, в котором она участвует. Это полностью снимает проблему передачи лишних элементов справочника — в обмен попадет только то, что нужно конкретному документу. При настройке подобных правил для большого числа объектов пригодится обработка для группового создания правил регистрации в КД 2.

Решение 2: Использование штатных настроек ПКО в КД 2.1

Если наша задача — только создать номенклатуру (заполнить первоначальные данные: Код ТНВЭД, Страна мира, Единица измерения и т.д.) при первой выгрузке, но при этом мы не хотим, чтобы последующие выгрузки документов затирали изменения в базе-приемнике, мы можем воспользоваться визуальными настройками правил.

Посмотрим на настройки Правила Конвертации Объектов (ПКО) для справочника номенклатуры. На вкладке «Настройки» есть флаг «Не замещать существующие объекты в приемнике при загрузке». Установка этого флага гарантирует, что если объект с таким GUID или полями поиска уже есть в приемнике, он не будет перезаписан.

Также обязательно проверьте, не установлен ли флаг «При переносе объекта по ссылке НЕ создавать новый объект, а только переносить ссылку». Часто именно он является виновником того, что объекты из документов не создаются.

Решение 3: Программное решение через обработчики событий

Если по каким-то причинам нет возможности использовать штатные настройки галочками, аналогичного поведения можно добиться написанием кода.

В ПКО Номенклатуры в обработчике события ПриЗагрузке напишем следующий код:


Если ОбъектНайден Тогда
    НеЗамещатьОбъект = Истина;
КонецЕсли;

Этот код отменяет замещение объекта, если он уже был найден в базе-приемнике, тем самым защищая локальные изменения НСИ от перезаписи из базы-источника.

Альтернативно, если нужно выгружать объект только при определенных условиях, можно использовать обработчик ПередВыгрузкой в ПКС (Правиле Конвертации Свойств):


// Пример принудительной выгрузки объекта коллекции
Если ОбъектКоллекции.Номенклатура.дит_СозданаПослеНачалаВыгрузкиВУХ Тогда 
    ВыгрузитьОбъект = Истина; 
КонецЕсли;

Важное замечание: Использование параметров в фоновом обмене

Разберем еще один нюанс, с которым сталкиваются разработчики при переходе от обработки к фоновому онлайн-обмену. Часто логику обмена (например, флаг "Создавать/Не создавать") завязывают на глобальные Параметры.

В обработке «Универсальный обмен данными» параметры сеанса заполняются вручную пользователем на форме перед стартом. Но в регламентном (онлайн) обмене пользовательского интерфейса нет. Структура Параметры существует как глобальная переменная, но она будет пустой (иметь значение Неопределено или Ложь).

Чтобы условия, проверяющие параметры (например, Отказ = Не Создавать), отрабатывали корректно при онлайн-обмене, обязательно прописывайте алгоритм инициализации и заполнения этих параметров программно в глобальном обработчике событий «Перед выгрузкой данных» в самих правилах конвертации.

← На главную