Как добавить иерархию в заимствованный справочник через расширение конфигурации 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← К списку

Часто при доработке типовых конфигураций 1С возникает задача — сделать иерархическим тот справочник, который изначально таковым не является. Использование механизма расширений кажется логичным решением, чтобы не снимать конфигурацию с поддержки. Однако при попытке изменить свойство иерархии у заимствованного в расширение справочника разработчики сталкиваются с тем, что в режиме «Предприятие» ничего не меняется. Давайте вместе разберемся, почему так происходит и какие есть пути решения этой задачи.

Почему не получается? Выясним причину

На первый взгляд, все просто: мы заимствуем справочник в расширение, устанавливаем ему свойство «Иерархический» и ожидаем, что теперь сможем создавать группы и элементы. Но реальность оказывается сложнее. Проанализируем ситуацию по шагам, чтобы понять корень проблемы.

  1. Ограничения механизма расширений. Расширения — мощный инструмент, но он имеет свои ограничения. Главное из них заключается в том, что расширение не может изменять физическую структуру таблиц базы данных для заимствованных объектов.
  2. Структура неиерархического справочника. В базе данных таблица неиерархического справочника имеет простую структуру. В ней отсутствуют ключевые поля, необходимые для поддержки иерархии, а именно поля для хранения ссылки на родителя (Родитель) и признака, является ли элемент группой (ЭтоГруппа).
  3. Что происходит на самом деле. Когда мы в конфигураторе устанавливаем флаг иерархии для заимствованного справочника, платформа фиксирует это изменение в метаданных расширения. Однако она не добавляет необходимые поля в уже существующую таблицу основной конфигурации в базе данных. В результате, в режиме «Предприятие» справочник по-прежнему работает как неиерархический, так как у него просто нет технической возможности хранить информацию о вложенности элементов.

Более того, платформа может вводить в заблуждение, позволяя в расширении создавать предопределенные элементы-группы для такого справочника. Это известная ошибка платформы. В режиме «Предприятие» такие «группы» будут отображаться как обычные элементы, так как сам справочник не поддерживает иерархию.

Таким образом, прямой ответ на вопрос: на данный момент добавить полноценную иерархию в заимствованный неиерархический справочник с помощью механизма расширений технически невозможно из-за ограничений платформы.

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

Решение 1: Эмуляция иерархии с помощью дополнительного реквизита

Этот способ не делает справочник иерархическим в стандартном понимании 1С, но позволяет имитировать древовидную структуру для пользователей. Он требует больше программирования, но сохраняет конфигурацию на поддержке. Разберем по шагам, как это реализовать.

  1. Создаем новый реквизит. В расширении добавим в заимствованный справочник новый реквизит, например, с именем ГруппаРодитель. Тип у этого реквизита должен быть СправочникСсылка на этот же самый справочник. Этот реквизит и будет играть роль поля Родитель.

  2. Создаем собственные формы. Поскольку стандартные формы не будут отображать нашу «псевдо-иерархию», нам нужно создать и назначить в качестве основных собственные формы списка и выбора для нашего справочника в расширении.

  3. Программируем отображение дерева. В созданной форме списка разместим элемент управления ТаблицаФормы. У этой таблицы установим свойство Отображение в значение Дерево. Далее, в коде формы (например, в обработчике ПриСозданииНаСервере) нам нужно будет программно получить все элементы справочника и построить из них дерево, используя наш реквизит ГруппаРодитель для определения вложенности.

Преимущества этого метода:

Недостатки:

Решение 2: Создание нового связанного справочника

Этот подход заключается в создании полностью нового, но уже иерархического справочника в расширении, который будет служить в качестве структуры групп, и связывании его с элементами исходного справочника.

  1. Создаем новый иерархический справочник. В нашем расширении создадим абсолютно новый справочник, назовем его, например, ГруппыНоменклатуры (если мы дорабатываем справочник Номенклатура). Установим ему свойство «Иерархический».

  2. Связываем справочники. В исходном (заимствованном) справочнике создадим новый реквизит, например, Группа, с типом СправочникСсылка.ГруппыНоменклатуры. Этот реквизит будет указывать, к какой группе из нашего нового иерархического справочника относится данный элемент.

  3. Дорабатываем интерфейс. Для удобной работы пользователей можно доработать форму списка исходного справочника, добавив в нее дерево групп из нового справочника, которое будет фильтровать основной список элементов.

Преимущества этого метода:

Недостатки:

Подведем итог: хотя прямое превращение неиерархического справочника в иерархический через расширение невозможно, у нас есть рабочие альтернативы. Выбор конкретного способа зависит от сложности задачи, требований к пользовательскому интерфейсу и готовности к усложнению архитектуры системы.

← К списку