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