Переход с «1С:Управление торговлей 10.3» на редакцию 11.5 — это всегда сложный процесс, связанный с кардинальным изменением архитектуры данных. Зачастую штатных средств недостаточно, и требуется комплексный перенос остатков и справочников. Одной из самых частых проблем становится перенос справочника Номенклатура, особенно если используются упаковки и единицы измерения. В УТ 11 логика хранения этих данных существенно отличается от «десятки».
Рассмотрим реальный кейс загрузки номенклатуры через COM или файлы (Excel/XML), разберем рабочий код создания элементов и выясним, почему созданные товары могут быть не видны в списке, а индивидуальные наборы упаковок — не привязываться. Если ваша задача шире, и требуется также выгрузка остатков и документов из УТ 10.3 в УТ 11.5, приведенные ниже принципы программного заполнения реквизитов останутся актуальными.
У нас есть выгрузка из УТ 10. Нам необходимо программно создать в УТ 11:
Часто после выполнения кода возникают две проблемы:
Давайте разберем решение этих проблем по шагам.
При создании номенклатуры в УТ 11 критически важно заполнить обязательные реквизиты, диктуемые Видом номенклатуры. Рассмотрим корректный алгоритм создания элемента, который часто применяется, когда выполняется выгрузка остатков и цен номенклатуры из УТ 10.3 в УТ 11.5 по СОМ соединению.
Обратите внимание на блок установки упаковок. В УТ 11, если мы хотим использовать индивидуальные упаковки (собственные для каждого товара), мы должны установить флаг ИспользоватьУпаковки и указать специальную ссылку в реквизите НаборУпаковок.
Пример кода процедуры загрузки:
&НаСервере
Процедура ЗагрузитьНоменклатуруНаСервере(МассНом)
СпрНоменклатура = Справочники.Номенклатура;
Для каждого ЭлМасс из МассНом Цикл
// 1. Создание группы или элемента
Если ЭлМасс.флагГруппы = 1 Тогда
НомНовый = СпрНоменклатура.СоздатьГруппу();
Иначе
НомНовый = СпрНоменклатура.СоздатьЭлемент();
КонецЕсли;
// 2. Установка УИД для синхронизации
УИД = Новый УникальныйИдентификатор(ЭлМасс.УИд);
НоваяСсылка = СпрНоменклатура.ПолучитьСсылку(УИД);
НомНовый.УстановитьСсылкуНового(НоваяСсылка);
// 3. Заполнение родителя
Если СокрЛП(ЭлМасс.КодРодителя) = "" Тогда
НомНовый.Родитель = СпрНоменклатура.ПустаяСсылка();
Иначе
// В идеале родителя тоже лучше искать по УИД, если он известен
НомНовый.Родитель = СпрНоменклатура.НайтиПоКоду(ЭлМасс.КодРодителя).Ссылка;
КонецЕсли;
НомНовый.Код = СокрЛП(ЭлМасс.Код);
НомНовый.Наименование = СокрЛП(ЭлМасс.Наименование);
НомНовый.Артикул = СокрЛП(ЭлМасс.Артикул);
// 4. Заполнение реквизитов элемента (если это не группа)
Если ЭлМасс.флагГруппы = 0 Тогда
// Важно: Вид номенклатуры определяет поведение товара
НомНовый.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию(ЭлМасс.ВидНоменклатуры).Ссылка;
// Базовая единица хранения
НомНовый.ЕдиницаИзмерения = ПолучитьЕдиницуИзмерения(ЭлМасс.ЕдИзм);
// Настройка УПАКОВОК
НомНовый.ИспользоватьУпаковки = Истина;
// Для индивидуального набора используем предопределенный элемент справочника НаборыУпаковок
НомНовый.НаборУпаковок = Справочники.НаборыУпаковок.ИндивидуальныйДляНоменклатуры;
// Обязательные поля для УТ 11
НомНовый.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар;
НомНовый.ВариантОформленияПродажи = Перечисления.ВариантыОформленияПродажи.РеализацияТоваровУслуг;
// Не забываем про Качество, иначе могут быть проблемы в документах
НомНовый.Качество = Перечисления.ГрадацииКачества.Новый;
КонецЕсли;
НомНовый.Записать();
КонецЦикла;
КонецПроцедуры
После того как номенклатура создана и записана с признаком НаборУпаковок = ИндивидуальныйДляНоменклатуры, нам нужно создать сами элементы справочника УпаковкиЕдиницыИзмерения.
Важный нюанс: При использовании индивидуального набора, Владельцем элемента справочника упаковки выступает сама Номенклатура, а не какой-либо набор упаковок.
Рассмотрим код создания упаковки:
&НаСервере
Процедура ЗагрузитьЕдИзмНаСервере(МассивЕИ)
ЕдиницаДлины = Константы.ЕдиницаИзмеренияДлины.Получить();
ЕдиницаВеса = Константы.ЕдиницаИзмеренияВеса.Получить();
ЕдиницаОбъема = Константы.ЕдиницаИзмеренияОбъема.Получить();
Для каждого ЭлМасс из МассивЕИ Цикл
// Ищем владельца-номенклатуру
НайдНом = Справочники.Номенклатура.НайтиПоКоду(СокрЛП(ЭлМасс.КодНоменклатуры));
Если НайдНом.Пустая() Тогда
Продолжить;
КонецЕсли;
Упаковка = Справочники.УпаковкиЕдиницыИзмерения.СоздатьЭлемент();
// ВАЖНО: Владелец - это ссылка на Номенклатуру
Упаковка.Владелец = НайдНом.Ссылка;
// Единица измерения, которая соответствует этой упаковке (из классификатора)
// Например, "шт" или "кор"
Упаковка.ЕдиницаИзмерения = НайдНом.ЕдиницаИзмерения; // Или поиск нужной единицы
Упаковка.Наименование = СокрЛП(ЭлМасс.ЕдИзмКлассификатор);
// Коэффициент пересчета (сколько базовых единиц в этой упаковке)
Упаковка.Числитель = ЭлМасс.Коэффициент; // Например, 10
Упаковка.Знаменатель = 1;
// Весогабаритные характеристики самой упаковки
Упаковка.ВесЕдиницаИзмерения = ЕдиницаВеса;
Упаковка.ОбъемЕдиницаИзмерения = ЕдиницаОбъема;
Упаковка.Вес = ЭлМасс.Вес;
Упаковка.Объем = ЭлМасс.Объем;
Упаковка.ТипУпаковки = Перечисления.ТипыУпаковокНоменклатуры.Конечная;
Упаковка.Записать();
КонецЦикла;
КонецПроцедуры
Это самая распространенная проблема при программном создании. Вы открываете справочник, а новых товаров нет. При этом через поиск или «Все функции» они находятся. Нередко это связано с тем, что не был выполнен корректный перенос истории цен номенклатуры или не заполнены статусы объектов.
Причина 1: Настройки формы списка (Фильтры)
В УТ 11 форма списка номенклатуры очень "умная". В ней может быть настроен отбор, который скрывает элементы.
Решение: В форме списка нажмите «Еще» — «Настроить список». Проверьте вкладку «Отбор». Часто помогает сброс настроек списка к стандартным (через «Еще» — «Установить стандартные настройки»).
Причина 2: Реквизит «Статус»
Если в вашей версии УТ 11 (или ERP/КА) включено использование статусов номенклатуры, то по умолчанию в списке могут отображаться только товары со статусом «Действует». При программном создании, если вы не заполнили этот реквизит, он может остаться пустым или принять значение «В разработке»/«Не используется».
Что добавить в код:
// Проверьте наличие реквизита Статус в вашей конфигурации
// Обычно это перечисление СтатусыНоменклатуры
НомНовый.Статус = Перечисления.СтатусыНоменклатуры.Действует;
Причина 3: Неполное заполнение обязательных полей
Как заметил автор темы, иногда платформа "прячет" элементы, у которых не заполнены критические поля, связанные с Видом номенклатуры (например, признак услуги или товара). Убедитесь, что ТипНоменклатуры заполнен корректно.
Если код кажется верным, но данные не создаются или создаются некорректно, используйте метод "сравнения с эталоном":
Выбрать *) для ручного элемента и для программно созданного.Это позволит увидеть неочевидные поля, такие как скрытые служебные реквизиты, ссылки на "Наборы упаковок" или незаполненные перечисления, которые влияют на поведение системы.
Для корректной загрузки упаковок в УТ 11 используйте связку: в номенклатуре НаборУпаковок = Справочники.НаборыУпаковок.ИндивидуальныйДляНоменклатуры, а при создании упаковки устанавливайте Владелец = СсылкаНаНоменклатуру. Если товары пропадают из видимости — проверяйте фильтры формы и реквизит «Статус».