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