Как обнулить количество в документе для новой номенклатуры при конвертации данных 1С

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

Рассмотрим распространенную задачу при организации переноса документов между информационными базами 1С с помощью правил конвертации данных. В ситуациях, когда переносимая позиция справочника Номенклатура отсутствует в базе-приемнике и создается "с нуля", может потребоваться обнулить значение в колонке Количество табличной части загружаемого документа. При этом для уже существовавшей в базе номенклатуры количество из источника должно остаться неизменным.

Анализ проблемы и логика решения

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

Чтобы избежать ошибок, алгоритм разделяют на два ключевых шага:

  1. Фиксация создания нового объекта: В правилах конвертации объектов (ПКО) справочника Номенклатура при обработке элемента проверяем, существовал ли он в базе до начала загрузки. Если нет, запоминаем его идентификатор или ссылку в специальной глобальной коллекции параметров сеанса обмена.
  2. Корректировка табличной части документа: В обработчике документа после загрузки всех его свойств обходим табличную часть и проверяем номенклатуру каждой строки по подготовленной коллекции. Если элемент признан созданным в данном сеансе, устанавливаем реквизит Количество равным 0.

Решение в Конвертации данных 2.1 (КД 2.1)

Разберем по шагам настройку правил обмена в конфигурации "Конвертация данных 2.1".

Шаг 1. Инициализация хранилища параметров

В правилах обмена (в обработчике ПередЗагрузкойДанных) инициализируем коллекцию для хранения списка созданных объектов:

Параметры.Вставить("СозданныеНоменклатуры", Новый Соответствие);

Шаг 2. Фиксация нового элемента в ПКО Номенклатуры

В ПКО справочника Номенклатура переходим в обработчик ПриЗагрузке. В этом обработчике платформой предусмотрена встроенная переменная ОбъектНайден (тип Булево). Если она равна Ложь, значит, элемент не найден ни по УИД, ни по полям поиска, и будет создан в процессе загрузки.

Заполняем созданное ранее соответствие:


Если Не ОбъектНайден Тогда
    Параметры.СозданныеНоменклатуры.Вставить(СсылкаНаОбъект, Истина);
КонецЕсли;

Также можно использовать механизм передачи внутренних параметров объекта с помощью коллекции ПараметрыОбъекта:


Если Не ОбъектНайден Тогда
    ПараметрыОбъекта.Вставить("ЭтоНовыйЭлемент", Истина);
КонецЕсли;

Шаг 3. Обработка табличной части документа

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


Для Каждого СтрокаТЧ Из Объект.Товары Цикл
    Если Параметры.СозданныеНоменклатуры.Получить(СтрокаТЧ.Номенклатура) <> Неопределено Тогда
        СтрокаТЧ.Количество = 0;
    КонецЕсли;
КонецЦикл;

Решение в Конвертации данных 3.0 (EnterpriseData)

Рассмотрим особенности реализации этой логики при использовании технологии EnterpriseData в КД 3.0. В этом случае обмен выполняется через модуль менеджера обмена.

Сопоставление элементов выполняется в рамках правил конвертации данных. Результат сопоставления доступен через контекст обмена (свойство НайденОбъектИБ). В обработчике ПослеЗагрузкиОбъекта для документа выполняем аналогичную проверку элементов табличной части и при необходимости присваиваем реквизиту Количество значение 0.

Ограничения и технические нюансы

Выясним критически важные нюансы, которые следует брать во внимание при проектировании логики переноса:

  1. Повторный сеанс загрузки: Если один и тот же файл обмена будет загружен повторно, созданная ранее номенклатура уже будет физически присутствовать в базе-приемнике. Алгоритм определит её как "существующую" и не обнулит количество. Если требуется занулять количество даже при повторной загрузке файла, логика признака первичной выгрузки должна формироваться еще на стороне базы-источника.
  2. Производительность: Выполнение прямых запросов к СУБД для каждой строки документа при загрузке существенно снижает скорость обмена. Использование кэширования в памяти через объект Соответствие в коллекциях Параметры позволяет избежать лишних обращений к базе данных и ускоряет загрузку больших документов.
← На главную