Как в Конвертации данных 2.0 перенести номенклатуру с характеристиками из УТ 11 в отдельные позиции номенклатуры БП 3.0?

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

При настройке обмена данными между 1С:Управление торговлей 11 и 1С:Бухгалтерия предприятия 3.0 часто возникает типовая архитектурная задача: в базе-источнике учет ведется в разрезе номенклатуры и характеристик, а в базе-приемнике характеристики отключены, и каждой комбинации «Номенклатура + Характеристика» соответствует отдельная позиция справочника Номенклатура.

Рассмотрим, как правильно настроить правила конвертации данных (КД 2.0) для табличных частей документов, чтобы не допустить ошибок кеширования ссылок и корректно сопоставить объекты.

В чем заключается сложность переноса

Проанализируем две основные проблемы, с которыми сталкивается разработчик при стандартной настройке правил:

  1. Кеширование объектов по ссылке источника в КД 2.0. Если в правиле конвертации свойств (ПКС) источником выступает ссылка на номенклатуру из УТ, механизм конвертации при первой выгрузке помещает ее во внутренний кеш. Если во второй строке документа встретится та же номенклатура, но с другой характеристикой, КД 2.0 возьмет уже выгруженную ранее ссылку из кеша, проигнорировав новую характеристику.
  2. Идентификация по внутреннему идентификатору (ГУИД). Для одной ссылки номенклатуры источника в приемнике должно быть создано несколько разных элементов. Поэтому стандартный поиск по ГУИД в ПКО необходимо отключить.

Способ 1. Передача данных через ИсходящиеДанные и формирование составного ключа

Разберем по шагам базовый и наиболее надежный способ настройки через правило конвертации группы свойств (ПКГС) табличной части и правило конвертации объекта (ПКО) справочника Номенклатура.

Шаг 1. Настройка ПКС в табличной части документа

В правиле конвертации группы свойств табличной части (например, Товары) для свойства Номенклатура оставляем поле Источник пустым. В обработчике события ПередВыгрузкой формируем структуру ИсходящиеДанные и определяем уникальный КлючВыгружаемыхДанных:


// Формируем структуру с данными для создания/поиска номенклатуры в БП
ИсходящиеДанные = Новый Структура;

// Собираем результирующее наименование
Если ЗначениеЗаполнено(ОбъектКоллекции.Характеристика) Тогда
    НаименованиеДляБП = СокрЛП(ОбъектКоллекции.Номенклатура.Наименование) + " (" + СокрЛП(ОбъектКоллекции.Характеристика.Наименование) + ")";
Иначе
    НаименованиеДляБП = СокрЛП(ОбъектКоллекции.Номенклатура.Наименование);
КонецЕсли;

ИсходящиеДанные.Вставить("Наименование", НаименованиеДляБП);
ИсходящиеДанные.Вставить("НаименованиеПолное", НаименованиеДляБП);
ИсходящиеДанные.Вставить("СтавкаНДС", ОбъектКоллекции.Номенклатура.СтавкаНДС);
ИсходящиеДанные.Вставить("ЕдиницаИзмерения", ОбъектКоллекции.Номенклатура.ЕдиницаИзмерения);

// Передаем уникальный составной ключ, чтобы исключить ошибочное кеширование
ГУИД_Номенклатуры = Строка(ОбъектКоллекции.Номенклатура.УникальныйИдентификатор());
ГУИД_Характеристики = ?(ЗначениеЗаполнено(ОбъектКоллекции.Характеристика), 
    Строка(ОбъектКоллекции.Характеристика.УникальныйИдентификатор()), 
    "00000000-0000-0000-0000-000000000000");

КлючВыгружаемыхДанных = ГУИД_Номенклатуры + "_" + ГУИД_Характеристики;

Шаг 2. Настройка ПКО для справочника «Номенклатура»

В правиле конвертации объекта Номенклатура выполняем следующие действия:

  1. Снимаем флаг Искать объект приемника по внутреннему идентификатору.
  2. В настройках свойств отмечаем флаг Поиск для свойства Наименование (или комбинации Артикул + Наименование).
  3. Для свойств Наименование, НаименованиеПолное, СтавкаНДС, ЕдиницаИзмерения источником указываем соответствующие поля структуры ВходящиеДанные.

В обработчике ПриЗагрузке правила конвертации номенклатуры подставим обязательные для БП 3.0 реквизиты, если создается новый объект:


Если ЭтоНовый Тогда
    // Заполняем реквизиты по умолчанию для корректного проведения документов в БП
    Если Не ЗначениеЗаполнено(Объект.ВидНоменклатуры) Тогда
        Объект.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товары");
    КонецЕсли;
КонецЕсли;

Способ 2. Программная выгрузка через функцию ВыгрузитьПоПравилу

Рассмотрим альтернативный вариант, когда формирование строк табличной части выполняется полностью программно в обработчике ПередОбработкойВыгрузки табличной части документа.

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


КоллекцияОбъектов = Новый ТаблицаЗначений;
КоллекцияОбъектов.Колонки.Добавить("Номенклатура");
КоллекцияОбъектов.Колонки.Добавить("Количество");
КоллекцияОбъектов.Колонки.Добавить("Цена");
КоллекцияОбъектов.Колонки.Добавить("Сумма");

Для Каждого СтрТЧ Из Источник.Товары Цикл
    НоваяСтрока = КоллекцияОбъектов.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрТЧ);
    
    // Подготавливаем параметры для выгрузки номенклатуры
    ДанныеНоменклатуры = Новый Структура;
    Если ЗначениеЗаполнено(СтрТЧ.Характеристика) Тогда
        ИмяПозиции = СокрЛП(СтрТЧ.Номенклатура.Наименование) + " " + СокрЛП(СтрТЧ.Характеристика.Наименование);
    Иначе
        ИмяПозиции = СокрЛП(СтрТЧ.Номенклатура.Наименование);
    КонецЕсли;
    
    ДанныеНоменклатуры.Вставить("Наименование", ИмяПозиции);
    
    КлючОбъекта = Строка(СтрТЧ.Номенклатура.УникальныйИдентификатор()) + "_" + 
                  Строка(?(ЗначениеЗаполнено(СтрТЧ.Характеристика), СтрТЧ.Характеристика.УникальныйИдентификатор(), "ПУСТО"));
    
    // Программный вызов правила конвертации
    НоваяСтрока.Номенклатура = ВыгрузитьПоПравилу(
        Неопределено,
        ,
        ДанныеНоменклатуры,
        КлючОбъекта,
        "Номенклатура"
    );
КонецЦикла;

Важные особенности переноса данных в БП 3.0

Обратим внимание на критические нюансы при переносе номенклатуры:

  1. Обработка пустых характеристик. Всегда проверяйте заполненность характеристики через ЗначениеЗаполнено(). Если просто складывать наименования, в названия товаров без характеристик могут попасть лишние пробелы или пустые скобки, что приведет к дублированию элементов в БП.
  2. Ограничение длины строк. В конфигурации 1С:Бухгалтерия предприятия длина реквизита Наименование справочника Номенклатура ограничена (обычно до 150 символов). При склейке длинных названий номенклатуры и характеристик используйте функцию Лев(), чтобы избежать ошибок обрезки или некорректного поиска при загрузке.
  3. Обязательные реквизиты. В БП 3.0 для проведения документов требуются заполненные реквизиты ВидНоменклатуры, СтавкаНДС и ЕдиницаИзмерения. Если они не будут заполнены при создании элемента, документы загрузятся непроведенными.
← На главную