Как перенести номенклатуру с характеристиками в отдельные позиции при обмене между УТ 10 и УПП 1.3?

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

При переходе с конфигурации «Управление торговлей 10.3» на «Управление производственным предприятием 1.3» часто возникает методологическая задача: изменить структуру хранения данных. В УТ 10 номенклатура часто ведется в разрезе характеристик, но специфика производственного учета в УПП или личные предпочтения заказчика могут требовать превращения каждой связки «Номенклатура + Характеристика» в отдельный, независимый элемент справочника Номенклатура. Рассмотрим подробнее, как реализовать этот механизм с помощью конфигурации «Конвертация данных 2.0».

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

Стандартный механизм работы 1С:Конвертации данных настроен на принцип: «один объект источника — один объект приемника». Если мы просто укажем правило конвертации для справочника Номенклатура, система выгрузит один элемент. Характеристики являются подчиненным справочником, и попытка «размножить» родительскую номенклатуру по количеству её характеристик внутри одного ПКО (Правила конвертации объекта) наталкивается на механизмы кэширования выгруженных объектов. Система видит, что ссылка на номенклатуру уже была обработана, и пропускает остальные варианты.

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

Шаг 1: Подготовка ПКО Номенклатура

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

Разберем, как избежать ошибки дампа и корректно инициализировать выгрузку. В обработчике «Перед выгрузкой» ПКО Номенклатура необходимо добавить проверку на наличие входящих данных. Если выгрузка запускается стандартно (без параметров), а наше правило ожидает параметры, произойдет ошибка.


Если ВходящиеДанные = Неопределено Тогда
    // Если данные не переданы (например, интерактивная выгрузка без параметров),
    // отменяем выгрузку этого узла, чтобы не плодить пустые объекты
    Отказ = Истина;
    Возврат;
КонецЕсли;

Шаг 2: Управление уникальностью через КлючВыгружаемыхДанных

Это самый важный этап. Чтобы конвертация «поверила», что перед ней разные объекты, хотя ссылка на Источник (номенклатуру) одна и та же, нам нужно программно сформировать КлючВыгружаемыхДанных. Этот ключ определяет уникальность объекта в рамках одной сессии выгрузки.

В том же обработчике «Перед выгрузкой» ПКО Номенклатура пропишем код:


// Формируем уникальный ключ на основе связки УИД номенклатуры и характеристики
КлючВыгружаемыхДанных = Строка(ВходящиеДанные.УИДНоменклатура) + "_" + Строка(ВходящиеДанные.УИДХарактеристика);

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

Шаг 3: Настройка ПВД (Правила выгрузки данных)

Поскольку мы не можем использовать стандартную выгрузку объектов, нам необходимо создать Правило выгрузки данных с типом «Произвольный алгоритм». Выясним причину: именно здесь мы опишем логику обхода характеристик.

В обработчике «Перед обработкой» ПВД напишем следующий алгоритм:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Номенклатура.Ссылка КАК Номенклатура,
    |   ХарактеристикиНоменклатуры.Ссылка КАК Характеристика
    |ИЗ
    |   Справочник.Номенклатура КАК Номенклатура
    |       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
    |       ПО ХарактеристикиНоменклатуры.Владелец = Номенклатура.Ссылка
    |ГДЕ
    |   Номенклатура.ЭтоГруппа = ЛОЖЬ";

Выборка = Запрос.Выполнить().Выбрать();

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

Шаг 4: Обработка единиц измерения и штрихкодов

Разберем ситуацию с подчиненными справочниками. В УПП и УТ справочник ЕдиницыИзмерения подчинен номенклатуре. Если мы создали 10 новых элементов номенклатуры в приемнике, у каждого из них должны быть свои записи в справочнике единиц. Если просто перенести ссылку на старую единицу, владельцем которой был «родитель», в базе приемнике возникнет логическая ошибка (ссылка на владельца будет указывать на другой товар).

Для решения этой проблемы рекомендуем:

  1. В ПКО Номенклатура для свойств ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов настроить поиск по наименованию и владельцу.
  2. В ПКО ЕдиницыИзмерения (если оно используется) передавать владельца также через ВходящиеДанные, чтобы система понимала, к какому «новому» товару привязывать единицу.

Аналогично обстоит дело со штрихкодами. В УТ 10 штрихкоды хранятся в разрезе характеристик. При переносе в УПП, где характеристик больше нет, вам нужно перенастроить ПКО регистра сведений Штрихкоды так, чтобы измерение Номенклатура в приемнике заполнялось на основании той же логики формирования КлючВыгружаемыхДанных, что и основной справочник.

Шаг 5: Итоговая доработка наименований в приемнике

Чтобы пользователи не запутались в списке из десяти одинаковых названий, в ПКО Номенклатура в обработчике «При загрузке» можно применить следующий код:


// Пример кода для загрузки (в базе УПП)
Если ВходящиеДанные <> Неопределено Тогда
    Объект.Наименование = ВходящиеДанные.НовоеНаименование;
    Объект.НаименованиеПолное = ВходящиеДанные.НовоеНаименование;
КонецЕсли;

Важный момент: Если вы планируете не разовый, а регулярный обмен, такая схема будет крайне сложной в поддержке, так как любое изменение характеристики в источнике должно корректно транслироваться в изменение соответствующей номенклатуры в приемнике. Однако для разового перехода с УТ 10 на УПП 1.3 данный метод является наиболее эффективным и проверенным способом «расщепления» данных.

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

← На главную