При переходе с конфигурации «Управление торговлей 10.3» на «Управление производственным предприятием 1.3» часто возникает методологическая задача: изменить структуру хранения данных. В УТ 10 номенклатура часто ведется в разрезе характеристик, но специфика производственного учета в УПП или личные предпочтения заказчика могут требовать превращения каждой связки «Номенклатура + Характеристика» в отдельный, независимый элемент справочника Номенклатура. Рассмотрим подробнее, как реализовать этот механизм с помощью конфигурации «Конвертация данных 2.0».
Стандартный механизм работы 1С:Конвертации данных настроен на принцип: «один объект источника — один объект приемника». Если мы просто укажем правило конвертации для справочника Номенклатура, система выгрузит один элемент. Характеристики являются подчиненным справочником, и попытка «размножить» родительскую номенклатуру по количеству её характеристик внутри одного ПКО (Правила конвертации объекта) наталкивается на механизмы кэширования выгруженных объектов. Система видит, что ссылка на номенклатуру уже была обработана, и пропускает остальные варианты.
Проанализируем ситуацию, с которой сталкиваются разработчики: при попытке передать данные через ВходящиеДанные часто возникают ошибки типа Значение не является значением объектного типа (УИДНоменклатура) или выгружается только одна характеристика из списка.
Для начала создадим правило конвертации свойств (ПКС) внутри ПКО Номенклатура. Нам необходимо создать два искусственных свойства (без источника), которые мы назовем, например, УИДНоменклатура и УИДХарактеристика. Для этих свойств крайне важно установить флаг «Получать из входящих данных». Это позволит нам передавать значения напрямую в ПКО при программном вызове выгрузки.
Разберем, как избежать ошибки дампа и корректно инициализировать выгрузку. В обработчике «Перед выгрузкой» ПКО Номенклатура необходимо добавить проверку на наличие входящих данных. Если выгрузка запускается стандартно (без параметров), а наше правило ожидает параметры, произойдет ошибка.
Если ВходящиеДанные = Неопределено Тогда
// Если данные не переданы (например, интерактивная выгрузка без параметров),
// отменяем выгрузку этого узла, чтобы не плодить пустые объекты
Отказ = Истина;
Возврат;
КонецЕсли;
Это самый важный этап. Чтобы конвертация «поверила», что перед ней разные объекты, хотя ссылка на Источник (номенклатуру) одна и та же, нам нужно программно сформировать КлючВыгружаемыхДанных. Этот ключ определяет уникальность объекта в рамках одной сессии выгрузки.
В том же обработчике «Перед выгрузкой» ПКО Номенклатура пропишем код:
// Формируем уникальный ключ на основе связки УИД номенклатуры и характеристики
КлючВыгружаемыхДанных = Строка(ВходящиеДанные.УИДНоменклатура) + "_" + Строка(ВходящиеДанные.УИДХарактеристика);
Теперь при выгрузке десяти характеристик одной номенклатуры система создаст десять разных записей в файле выгрузки, так как ключи будут отличаться.
Поскольку мы не можем использовать стандартную выгрузку объектов, нам необходимо создать Правило выгрузки данных с типом «Произвольный алгоритм». Выясним причину: именно здесь мы опишем логику обхода характеристик.
В обработчике «Перед обработкой» ПВД напишем следующий алгоритм:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Номенклатура,
| ХарактеристикиНоменклатуры.Ссылка КАК Характеристика
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
| ПО ХарактеристикиНоменклатуры.Владелец = Номенклатура.Ссылка
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Подготавливаем структуру входящих данных для ПКО
СтруктураВходящихДанных = Новый Структура;
СтруктураВходящихДанных.Вставить("УИДНоменклатура", Выборка.Номенклатура.УникальныйИдентификатор());
Если ЗначениеЗаполнено(Выборка.Характеристика) Тогда
СтруктураВходящихДанных.Вставить("УИДХарактеристика", Выборка.Характеристика.УникальныйИдентификатор());
// Формируем новое наименование для приемника
НовоеНаименование = СокрЛП(Выборка.Номенклатура.Наименование) + " (" + СокрЛП(Выборка.Характеристика.Наименование) + ")";
Иначе
СтруктураВходящихДанных.Вставить("УИДХарактеристика", "00000000-0000-0000-0000-000000000000");
НовоеНаименование = Выборка.Номенклатура.Наименование;
КонецЕсли;
// Передаем параметры в ПКО
ВыгрузитьПоПравилу(Выборка.Номенклатура, , СтруктураВходящихДанных, , "Номенклатура");
КонецЦикла;
Разберем ситуацию с подчиненными справочниками. В УПП и УТ справочник ЕдиницыИзмерения подчинен номенклатуре. Если мы создали 10 новых элементов номенклатуры в приемнике, у каждого из них должны быть свои записи в справочнике единиц. Если просто перенести ссылку на старую единицу, владельцем которой был «родитель», в базе приемнике возникнет логическая ошибка (ссылка на владельца будет указывать на другой товар).
Для решения этой проблемы рекомендуем:
Номенклатура для свойств ЕдиницаХраненияОстатков и ЕдиницаДляОтчетов настроить поиск по наименованию и владельцу.ЕдиницыИзмерения (если оно используется) передавать владельца также через ВходящиеДанные, чтобы система понимала, к какому «новому» товару привязывать единицу.Аналогично обстоит дело со штрихкодами. В УТ 10 штрихкоды хранятся в разрезе характеристик. При переносе в УПП, где характеристик больше нет, вам нужно перенастроить ПКО регистра сведений Штрихкоды так, чтобы измерение Номенклатура в приемнике заполнялось на основании той же логики формирования КлючВыгружаемыхДанных, что и основной справочник.
Чтобы пользователи не запутались в списке из десяти одинаковых названий, в ПКО Номенклатура в обработчике «При загрузке» можно применить следующий код:
// Пример кода для загрузки (в базе УПП)
Если ВходящиеДанные <> Неопределено Тогда
Объект.Наименование = ВходящиеДанные.НовоеНаименование;
Объект.НаименованиеПолное = ВходящиеДанные.НовоеНаименование;
КонецЕсли;
Важный момент: Если вы планируете не разовый, а регулярный обмен, такая схема будет крайне сложной в поддержке, так как любое изменение характеристики в источнике должно корректно транслироваться в изменение соответствующей номенклатуры в приемнике. Однако для разового перехода с УТ 10 на УПП 1.3 данный метод является наиболее эффективным и проверенным способом «расщепления» данных.
Таким образом, мы проанализировали основные этапы трансформации данных. Использование КлючВыгружаемыхДанных в сочетании с ВходящиеДанные — это мощный инструмент Конвертации данных, позволяющий обходить стандартные ограничения платформы и гибко управлять структурой объектов при переезде между конфигурациями.