Рассмотрим распространенную задачу при организации переноса документов между информационными базами 1С с помощью правил конвертации данных. В ситуациях, когда переносимая позиция справочника Номенклатура отсутствует в базе-приемнике и создается "с нуля", может потребоваться обнулить значение в колонке Количество табличной части загружаемого документа. При этом для уже существовавшей в базе номенклатуры количество из источника должно остаться неизменным.
Проанализируем, с какими особенностями платформы можно столкнуться при решении этой задачи. Простая проверка физического наличия элемента в базе данных напрямую из строки документа может работать некорректно. Например, если новая номенклатура встречается в одном файле загрузки несколько раз (в разных строках или в разных документах), при обработке первой же строки объект запишется в базу данных приемника. В результате при обработке последующих строк проверка существования покажет, что объект уже есть в СУБД, и его количество не обнулится.
Чтобы избежать ошибок, алгоритм разделяют на два ключевых шага:
Номенклатура при обработке элемента проверяем, существовал ли он в базе до начала загрузки. Если нет, запоминаем его идентификатор или ссылку в специальной глобальной коллекции параметров сеанса обмена.Количество равным 0.Разберем по шагам настройку правил обмена в конфигурации "Конвертация данных 2.1".
Шаг 1. Инициализация хранилища параметров
В правилах обмена (в обработчике ПередЗагрузкойДанных) инициализируем коллекцию для хранения списка созданных объектов:
Параметры.Вставить("СозданныеНоменклатуры", Новый Соответствие);
Шаг 2. Фиксация нового элемента в ПКО Номенклатуры
В ПКО справочника Номенклатура переходим в обработчик ПриЗагрузке. В этом обработчике платформой предусмотрена встроенная переменная ОбъектНайден (тип Булево). Если она равна Ложь, значит, элемент не найден ни по УИД, ни по полям поиска, и будет создан в процессе загрузки.
Заполняем созданное ранее соответствие:
Если Не ОбъектНайден Тогда
Параметры.СозданныеНоменклатуры.Вставить(СсылкаНаОбъект, Истина);
КонецЕсли;
Также можно использовать механизм передачи внутренних параметров объекта с помощью коллекции ПараметрыОбъекта:
Если Не ОбъектНайден Тогда
ПараметрыОбъекта.Вставить("ЭтоНовыйЭлемент", Истина);
КонецЕсли;
Шаг 3. Обработка табличной части документа
В ПКО переносимого документа переходим в обработчик ПослеЗагрузки и обходим табличную часть, проверяя наличие позиций в нашем хранилище:
Для Каждого СтрокаТЧ Из Объект.Товары Цикл
Если Параметры.СозданныеНоменклатуры.Получить(СтрокаТЧ.Номенклатура) <> Неопределено Тогда
СтрокаТЧ.Количество = 0;
КонецЕсли;
КонецЦикл;
Рассмотрим особенности реализации этой логики при использовании технологии EnterpriseData в КД 3.0. В этом случае обмен выполняется через модуль менеджера обмена.
Сопоставление элементов выполняется в рамках правил конвертации данных. Результат сопоставления доступен через контекст обмена (свойство НайденОбъектИБ). В обработчике ПослеЗагрузкиОбъекта для документа выполняем аналогичную проверку элементов табличной части и при необходимости присваиваем реквизиту Количество значение 0.
Выясним критически важные нюансы, которые следует брать во внимание при проектировании логики переноса:
Соответствие в коллекциях Параметры позволяет избежать лишних обращений к базе данных и ускоряет загрузку больших документов.