Переход со старых версий платформ (например, «1С:Торговля и Склад 7.7») на современные конфигурации семейства 1С 8.3 (в частности, «1С:Управление торговлей 11») — это сложный процесс, требующий глубокого понимания разницы в архитектуре данных. Часто после успешного, на первый взгляд, переноса справочников пользователи сталкиваются с неприятной проблемой: в справочнике Номенклатура все позиции отображаются корректно, но при попытке заполнить документ (например, «Заказ клиента» или «Реализация товаров и услуг») через форму подбора список товаров оказывается абсолютно пустым.
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем архитектурные различия между версиями платформ, выясним значение системных пиктограмм и рассмотрим пошаговые методы исправления данных как интерактивными, так и программными средствами.
Для того чтобы понять суть неисправности, проанализируем структуру хранения данных в обеих конфигурациях. В устаревшей версии «1С:Торговля и Склад 7.7» классификация номенклатуры была устроена максимально просто. Понятие «Вид номенклатуры» там отсутствовало как самостоятельный объект метаданных, определяющий логику поведения системы. Карточка товара содержала лишь базовый набор реквизитов.
В современных конфигурациях на платформе 1С 8.3 (включая УТ 11, КА 2.5 и ERP) архитектура справочника номенклатуры претерпела кардинальные изменения:
ВидыНоменклатуры.Товар, Услуга, Работа, Тара или Набор.Когда вы переносите номенклатуру напрямую из версии 7.7, правила конвертации данных могут не содержать жесткой привязки к новым видам номенклатуры, либо этот реквизит переносится пустым (со значением Неопределено или ПустаяСсылка). Соответственно, у перенесенных позиций отсутствует системный тип номенклатуры.
Форма подбора товаров в документах УТ 11 работает через специализированный динамический список с жестко заданными отборами. При открытии подбора из документа «Заказ клиента» система автоматически накладывает невидимый для пользователя фильтр: показывать только те элементы, у которых тип номенклатуры соответствует продаваемым активам (то есть равен значению Товар, Услуга, Работа или МногооборотнаяТара). Так как у ваших импортированных позиций этот реквизит пуст, система подбора их просто игнорирует и показывает пустую таблицу.
Обратим внимание на важную деталь, которую часто замечают пользователи при сравнении созданных вручную товаров и перенесенных позиций. В списке справочника перед наименованием товара отображаются различные иконки:
Номенклатура, который готов к использованию в торговых операциях.Если при переносе данных из 7.7 в базу данных ошибочно записался признак ЭтоГруппа = Истина для обычных товаров, то выбрать их в табличную часть документов продажи будет физически невозможно. Платформа 1С блокирует выбор «папок» в качестве продаваемых позиций. Также треугольник может сигнализировать о нарушении иерархии или некорректном заполнении признака иерархического родителя объекта в базе данных.
Если товаров в базе много, ручное редактирование каждой карточки нецелесообразно. Нам поможет стандартная обработка «Групповое изменение реквизитов». Однако при попытке стандартного изменения реквизита Вид номенклатуры система может выдать ошибку или вовсе заблокировать это поле, так как оно относится к категории защищенных. Рассмотрим, как обойти это ограничение по шагам.
Это группа Равно НетВид номенклатуры Не заполненоПосле завершения обработки все выбранные позиции получат корректный вид номенклатуры, автоматически унаследуют правильный тип («Товар») и станут доступны для выбора во всех формах подбора документов.
Бывают ситуации, когда стандартная групповая обработка прерывается из-за внутренних ошибок платформы. Это происходит потому, что при интерактивной записи элемента система запускает процедуру ПередЗаписью модуля объекта, которая проверяет заполненность других обязательных реквизитов (например, ставок НДС, базовых единиц измерения, которых в базе 7.7 могло просто не быть). Если эти реквизиты пусты, система выдает ошибку и отменяет транзакцию записи.
Чтобы обойти эти проверки и принудительно записать в базу данных только нужные реквизиты, разработчику необходимо использовать свойство ОбменДанными.Загрузка = Истина. Рассмотрим пример программного кода внешней обработки, выполняющей данную задачу.
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
// Проверяем, что это элемент, а не группа справочника
Если Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
// Проверяем, заполнен ли вид номенклатуры
Если ЗначениеЗаполнено(Выборка.ВидНоменклатуры) Тогда
Продолжить;
КонецЕсли;
Попытка
ОбъектНоменклатуры = Выборка.ПолучитьОбъект();
// Назначаем заранее созданный вид номенклатуры (подставьте свой ссылку)
ОбъектНоменклатуры.ВидНоменклатуры = Справочники.ВидыНоменклатуры.НайтиПоНаименованию("Товары");
// Отключаем бизнес-логику проверок при записи объекта
ОбъектНоменклатуры.ОбменДанными.Загрузка = Истина;
ОбъектНоменклатуры.Записать();
Сообщить("Успешно обработан товар: " + ОбъектНоменклатуры.Наименование);
Исключение
Сообщить("Ошибка при обработке элемента " + Выборка.Наименование + ": " + ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
Использование этого кода гарантирует быструю и корректную установку связей справочников без прерывания процесса из-за незаполненных сопутствующих данных. После выполнения данного скрипта рекомендуется запустить встроенное тестирование и исправление базы данных для проверки логической целостности новых связей.