При переносе справочника номенклатуры из конфигураций платформы 1С 7.7 в современные версии 1С:Управление торговлей (УТ 11 / УТ 3) через конфигурацию Конвертация данных 2.1 разработчики часто сталкиваются с необходимостью унифицировать данные: установить всем позициям единый вид номенклатуры (например, «Товар») и базовую единицу измерения («шт»).
Разберем по шагам, как правильно настроить правила конвертации объектов (ПКО), правила конвертации свойств (ПКС) и написать обработчики событий для решения этой задачи.
Рассмотрим ситуацию, когда в источнике (1С 7.7) виды номенклатуры отсутствуют либо их требуется свести к единому значению «Товар» в приемнике (1С 8).
Для реализации такой схемы настроим отдельное ПКО:
Строка -> Справочник.ВидыНоменклатуры. В качестве источника оставляем пустое значение или строковый тип.Наименование. Источник оставляем пустым, приемник — Наименование. В обработчике ПередВыгрузкой укажем:
Значение = "Товар";
ВидыНоменклатуры конфигурации 1С:Управление торговлей обязательным является реквизит ТипНоменклатуры. Создадим для него ПКС и в обработчике ПередВыгрузкой зададим соответствующее значение перечисления:
Значение = "Товар";
Номенклатура для свойства ВидНоменклатуры указываем созданное ПКО вида номенклатуры.Важно для выгрузки из 1С 7.7: При изменении обработчиков выгрузки для конфигураций 1С 7.7 не забывайте нажимать кнопку выгрузки модуля выгрузки и обновлять код в обработке выгрузки (V77Exp.ert), так как алгоритмы для семерки компилируются непосредственно в текст модуля.
Выясним причину популярной ошибки, возникающей при попытке заполнить единицу измерения в обработчике ПослеЗагрузки ПКО Номенклатура.
Посмотрим на пример некорректного кода:
// ОШИБКА: реквизиту ссылочного типа присваивается строка
Объект.ЕдиницаИзмерения = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию("шт", Истина).Наименование;
В этом примере допущены две критические ошибки:
ЕдиницаИзмерения и ЕдиницаДляОтчетов являются ссылочными полями (тип СправочникСсылка.КлассификаторЕдиницИзмерения или СправочникСсылка.УпаковкиЕдиницыИзмерения). Попытка записать в них строку через .Наименование приводит либо к ошибке приведения типов, либо к очистке реквизита.Проанализируем правильный вариант заполнения ссылки на классификатор единиц измерения. В Общероссийском классификаторе единиц измерения (ОКЕИ) штука имеет фиксированный код 796. Поиск по коду гарантирует точное сопоставление.
В обработчике ПослеЗагрузки ПКО Номенклатура пропишем следующий код:
СсылкаШт = Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796");
Если Не ЗначениеЗаполнено(СсылкаШт) Тогда
СсылкаШт = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию("шт", Истина);
КонецЕсли;
Если ЗначениеЗаполнено(СсылкаШт) Тогда
Объект.ЕдиницаИзмерения = СсылкаШт;
// Если в структуре приемника используется ЕдиницаДляОтчетов
Если ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, "ЕдиницаДляОтчетов") Тогда
Объект.ЕдиницаДляОтчетов = СсылкаШт;
КонецЕсли;
КонецЕсли;
Если в базе-источнике (1С 7.7) используются различные единицы (метры, килограммы, пачки), разберем правильную архитектуру их переноса:
БазоваяЕдиница (справочник ОКЕИ). В Конвертации данных настраиваем ПКО ОКЕИ -> КлассификаторЕдиницИзмерения с синхронизацией по полям Код и Наименование. В ПКО Номенклатура привязываем ПКС ЕдиницаИзмерения к этому правилу.Единицы. В УТ 11/3 для них предназначен справочник УпаковкиЕдиницыИзмерения (или Упаковки). Для их переноса создается отдельное ПКО, где реквизит Владелец сопоставляется с номенклатурой, а Коэффициент и ЕдиницаИзмерения (ОКЕИ) переносятся напрямую.Обратите внимание: чтобы индивидуальные упаковки отображались и применялись в документах базы 1С:Управление торговлей, в соответствующем ВидеНоменклатуры должна быть включена опция использования упаковок.