Как правильно загрузить номенклатуру и индивидуальные упаковки при переходе с УТ 10 на УТ 11?

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

Переход с «1С:Управление торговлей 10.3» на редакцию 11.5 — это всегда сложный процесс, связанный с кардинальным изменением архитектуры данных. Зачастую штатных средств недостаточно, и требуется комплексный перенос остатков и справочников. Одной из самых частых проблем становится перенос справочника Номенклатура, особенно если используются упаковки и единицы измерения. В УТ 11 логика хранения этих данных существенно отличается от «десятки».

Рассмотрим реальный кейс загрузки номенклатуры через COM или файлы (Excel/XML), разберем рабочий код создания элементов и выясним, почему созданные товары могут быть не видны в списке, а индивидуальные наборы упаковок — не привязываться. Если ваша задача шире, и требуется также выгрузка остатков и документов из УТ 10.3 в УТ 11.5, приведенные ниже принципы программного заполнения реквизитов останутся актуальными.

Постановка задачи

У нас есть выгрузка из УТ 10. Нам необходимо программно создать в УТ 11:

  1. Элементы справочника Номенклатура с сохранением иерархии номенклатуры и GUID.
  2. Включить для товаров использование упаковок.
  3. Установить режим «Индивидуальный набор упаковок» для каждой номенклатуры.
  4. Создать сами упаковки (единицы измерения) с привязкой к этой номенклатуре.

Часто после выполнения кода возникают две проблемы:

Давайте разберем решение этих проблем по шагам.

Шаг 1. Программное создание номенклатуры

При создании номенклатуры в УТ 11 критически важно заполнить обязательные реквизиты, диктуемые Видом номенклатуры. Рассмотрим корректный алгоритм создания элемента, который часто применяется, когда выполняется выгрузка остатков и цен номенклатуры из УТ 10.3 в УТ 11.5 по СОМ соединению.

Обратите внимание на блок установки упаковок. В УТ 11, если мы хотим использовать индивидуальные упаковки (собственные для каждого товара), мы должны установить флаг ИспользоватьУпаковки и указать специальную ссылку в реквизите НаборУпаковок.

Пример кода процедуры загрузки:


&НаСервере
Процедура ЗагрузитьНоменклатуруНаСервере(МассНом)
    СпрНоменклатура = Справочники.Номенклатура;	
    
    Для каждого ЭлМасс из МассНом Цикл
        
        // 1. Создание группы или элемента
        Если ЭлМасс.флагГруппы = 1 Тогда
            НомНовый = СпрНоменклатура.СоздатьГруппу();
        Иначе
            НомНовый = СпрНоменклатура.СоздатьЭлемент();
        КонецЕсли;
        
        // 2. Установка УИД для синхронизации
        УИД = Новый УникальныйИдентификатор(ЭлМасс.УИд);
        НоваяСсылка = СпрНоменклатура.ПолучитьСсылку(УИД);
        НомНовый.УстановитьСсылкуНового(НоваяСсылка);
        
        // 3. Заполнение родителя
        Если СокрЛП(ЭлМасс.КодРодителя) = "" Тогда
            НомНовый.Родитель = СпрНоменклатура.ПустаяСсылка();
        Иначе
            // В идеале родителя тоже лучше искать по УИД, если он известен
            НомНовый.Родитель = СпрНоменклатура.НайтиПоКоду(ЭлМасс.КодРодителя).Ссылка;
        КонецЕсли;
        
        НомНовый.Код = СокрЛП(ЭлМасс.Код);
        НомНовый.Наименование = СокрЛП(ЭлМасс.Наименование);
        НомНовый.Артикул = СокрЛП(ЭлМасс.Артикул);
        
        // 4. Заполнение реквизитов элемента (если это не группа)
        Если ЭлМасс.флагГруппы = 0 Тогда
            // Важно: Вид номенклатуры определяет поведение товара
            НомНовый.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(ЭлМасс.ВидНоменклатуры).Ссылка;
            
            // Базовая единица хранения
            НомНовый.ЕдиницаИзмерения = ПолучитьЕдиницуИзмерения(ЭлМасс.ЕдИзм); 
            
            // Настройка УПАКОВОК
            НомНовый.ИспользоватьУпаковки = Истина;
            // Для индивидуального набора используем предопределенный элемент справочника НаборыУпаковок
            НомНовый.НаборУпаковок = Справочники.НаборыУпаковок.ИндивидуальныйДляНоменклатуры;
            
            // Обязательные поля для УТ 11
            НомНовый.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар;
            НомНовый.ВариантОформленияПродажи = Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг;
            
            // Не забываем про Качество, иначе могут быть проблемы в документах
            НомНовый.Качество = Перечисления.ГрадацииКачества.Новый; 
        КонецЕсли;
        
        НомНовый.Записать();
        
    КонецЦикла;
КонецПроцедуры

Шаг 2. Загрузка индивидуальных упаковок

После того как номенклатура создана и записана с признаком НаборУпаковок = ИндивидуальныйДляНоменклатуры, нам нужно создать сами элементы справочника УпаковкиЕдиницыИзмерения.

Важный нюанс: При использовании индивидуального набора, Владельцем элемента справочника упаковки выступает сама Номенклатура, а не какой-либо набор упаковок.

Рассмотрим код создания упаковки:


&НаСервере
Процедура ЗагрузитьЕдИзмНаСервере(МассивЕИ)	
    
    ЕдиницаДлины = Константы.ЕдиницаИзмеренияДлины.Получить();
    ЕдиницаВеса  = Константы.ЕдиницаИзмеренияВеса.Получить();
    ЕдиницаОбъема = Константы.ЕдиницаИзмеренияОбъема.Получить();

    Для каждого ЭлМасс из МассивЕИ Цикл		
        
        // Ищем владельца-номенклатуру
        НайдНом = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(ЭлМасс.КодНоменклатуры));
        Если НайдНом.Пустая() Тогда
            Продолжить;
        КонецЕсли;
        
        Упаковка = Справочники.УпаковкиЕдиницыИзмерения.СоздатьЭлемент();
        
        // ВАЖНО: Владелец - это ссылка на Номенклатуру
        Упаковка.Владелец = НайдНом.Ссылка;
        
        // Единица измерения, которая соответствует этой упаковке (из классификатора)
        // Например, "шт" или "кор"
        Упаковка.ЕдиницаИзмерения = НайдНом.ЕдиницаИзмерения; // Или поиск нужной единицы
        
        Упаковка.Наименование = СокрЛП(ЭлМасс.ЕдИзмКлассификатор);
        
        // Коэффициент пересчета (сколько базовых единиц в этой упаковке)
        Упаковка.Числитель = ЭлМасс.Коэффициент; // Например, 10
        Упаковка.Знаменатель = 1; 
        
        // Весогабаритные характеристики самой упаковки
        Упаковка.ВесЕдиницаИзмерения   = ЕдиницаВеса;
        Упаковка.ОбъемЕдиницаИзмерения = ЕдиницаОбъема;
        Упаковка.Вес   = ЭлМасс.Вес;
        Упаковка.Объем = ЭлМасс.Объем;
        
        Упаковка.ТипУпаковки = Перечисления.ТипыУпаковокНоменклатуры.Конечная;	
        
        Упаковка.Записать();
        
    КонецЦикла;
КонецПроцедуры

Почему созданную номенклатуру не видно в списке?

Это самая распространенная проблема при программном создании. Вы открываете справочник, а новых товаров нет. При этом через поиск или «Все функции» они находятся. Нередко это связано с тем, что не был выполнен корректный перенос истории цен номенклатуры или не заполнены статусы объектов.

Причина 1: Настройки формы списка (Фильтры)
В УТ 11 форма списка номенклатуры очень "умная". В ней может быть настроен отбор, который скрывает элементы.
Решение: В форме списка нажмите «Еще» — «Настроить список». Проверьте вкладку «Отбор». Часто помогает сброс настроек списка к стандартным (через «Еще» — «Установить стандартные настройки»).

Причина 2: Реквизит «Статус»
Если в вашей версии УТ 11 (или ERP/КА) включено использование статусов номенклатуры, то по умолчанию в списке могут отображаться только товары со статусом «Действует». При программном создании, если вы не заполнили этот реквизит, он может остаться пустым или принять значение «В разработке»/«Не используется».

Что добавить в код:


// Проверьте наличие реквизита Статус в вашей конфигурации
// Обычно это перечисление СтатусыНоменклатуры
НомНовый.Статус = Перечисления.СтатусыНоменклатуры.Действует;

Причина 3: Неполное заполнение обязательных полей
Как заметил автор темы, иногда платформа "прячет" элементы, у которых не заполнены критические поля, связанные с Видом номенклатуры (например, признак услуги или товара). Убедитесь, что ТипНоменклатуры заполнен корректно.

Советы по отладке

Если код кажется верным, но данные не создаются или создаются некорректно, используйте метод "сравнения с эталоном":

  1. Создайте одну позицию номенклатуры с индивидуальной упаковкой вручную в режиме Предприятия так, как это должно выглядеть.
  2. Запустите Консоль запросов.
  3. Напишите запрос, который выбирает все поля (Выбрать *) для ручного элемента и для программно созданного.
  4. Сравните результаты построчно.

Это позволит увидеть неочевидные поля, такие как скрытые служебные реквизиты, ссылки на "Наборы упаковок" или незаполненные перечисления, которые влияют на поведение системы.

Заключение

Для корректной загрузки упаковок в УТ 11 используйте связку: в номенклатуре НаборУпаковок = Справочники.НаборыУпаковок.ИндивидуальныйДляНоменклатуры, а при создании упаковки устанавливайте Владелец = СсылкаНаНоменклатуру. Если товары пропадают из видимости — проверяйте фильтры формы и реквизит «Статус».

← На главную