Почему при открытии формы группы справочника создается элемент и как это исправить

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке в среде 1С:Предприятие 8 часто возникает ситуация, когда нам необходимо программно открыть форму для создания новой группы справочника. Казалось бы, достаточно указать путь к конкретной форме в методе ОткрытьФорму, например, Справочник.plmКарточкиУчета.ФормаГруппы. Однако на практике разработчики сталкиваются с тем, что в открывшейся форме свойство ЭтоГруппа объекта принимает значение Ложь, и в итоге записывается обычный элемент, а не папка. Давайте подробно разберем, почему так происходит и как правильно решить эту задачу.

Анализируем поведение платформы 1С

Рассмотрим стандартную ситуацию. Разработчик пытается вызвать форму группы следующим кодом:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Изделие", Элементы.ДеревоСостава.ТекущиеДанные.Элемент);
ОткрытьФорму("Справочник.plmКарточкиУчета.ФормаГруппы", ПараметрыФормы, , Истина);

Проблема здесь заключается в фундаментальном принципе работы платформы: имя формы не определяет тип создаваемого объекта. Когда мы указываем путь к форме группы, 1С воспринимает это только как указание на визуальный шаблон (интерфейс), который нужно отрисовать. Сам же объект, который инициализируется в этой форме (реквизит Объект), создается системой «по умолчанию». По правилам платформы, любой новый объект справочника по умолчанию создается как элемент (ЭтоГруппа = Ложь), если явно не указано иное.

Проанализируем ситуацию: если мы не передаем признак того, что нам нужна именно группа, система вызывает внутренний механизм, аналогичный методу СоздатьЭлемент(), и просто «натягивает» на полученные данные интерфейс формы группы. В итоге мы видим форму группы, но работаем с данными элемента.

Решение №1: Прямая передача параметра ЭтоГруппа

Самый быстрый и эффективный способ исправить ситуацию — это добавить в структуру параметров ключ ЭтоГруппа со значением Истина. Платформа распознает этот параметр при инициализации данных формы и установит соответствующий признак у создаваемого объекта.

Посмотрим на исправленный пример кода:


ПараметрыФормы = Новый Структура;
// Передаем признак группы - это критически важно
ПараметрыФормы.Вставить("ЭтоГруппа", Истина); 
// Передаем дополнительные данные для заполнения
ПараметрыФормы.Вставить("Изделие", Элементы.ДеревоСостава.ТекущиеДанные.Элемент);

ОткрытьФорму("Справочник.plmКарточкиУчета.ФормаГруппы", ПараметрыФормы, , Истина);

После такого изменения в обработчике ПриСозданииНаСервере в модуле формы группы мы увидим, что Объект.ЭтоГруппа теперь равно Истина. При записи такого объекта в базе данных будет создана именно папка (узел иерархии).

Решение №2: Использование параметра ЗначениеЗаполнения

Несмотря на то, что первый способ отлично работает, в среде 1С существует более «правильный» (согласно стандартам разработки) метод передачи начальных данных. Это использование системного параметра ЗначениеЗаполнения. Рассмотрим этот подход подробнее.

Метод ЗначениеЗаполнения позволяет передать структуру данных, которая будет автоматически обработана в процедуре ОбработкаЗаполнения модуля объекта. Это гарантирует, что все механизмы инициализации, заложенные в логику справочника, отработают корректно.

Разберем по шагам, как это реализовать:

  1. Создадим структуру, содержащую значения, которыми мы хотим заполнить новую группу.
  2. Поместим эту структуру в параметры формы под специальным ключом ЗначениеЗаполнения.

СтруктураЗаполнения = Новый Структура;
СтруктураЗаполнения.Вставить("ЭтоГруппа", Истина);
СтруктураЗаполнения.Вставить("Изделие", Элементы.ДеревоСостава.ТекущиеДанные.Элемент);

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗначениеЗаполнения", СтруктураЗаполнения);

ОткрытьФорму("Справочник.plmКарточкиУчета.ФормаГруппы", ПараметрыФормы, , Истина);

Этот способ предпочтительнее, если в справочнике сложная логика создания объектов, так как он задействует стандартный жизненный цикл объекта 1С.

Важные нюансы иерархии в метаданных

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

Также важно помнить о параметре Родитель. Если вы хотите, чтобы новая группа создавалась не в корне справочника, а внутри другой группы, его необходимо передать вместе с признаком ЭтоГруппа:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЭтоГруппа", Истина);
ПараметрыФормы.Вставить("Родитель", СсылкаНаПапкуРодителя);
ОткрытьФорму("Справочник.plmКарточкиУчета.ФормаГруппы", ПараметрыФормы);

Проверка состояния объекта в форме

Если вы хотите программно управлять логикой формы в зависимости от того, создается группа или элемент, всегда делайте проверку в процедуре ПриСозданииНаСервере. Однако будьте внимательны: проверка только Объект.ЭтоГруппа для нового объекта может быть недостаточной, если данные еще не успели инициализироваться (хотя при правильной передаче параметров они уже будут там).

Рекомендуется также анализировать коллекцию Параметры самой формы. Если в коде открытия вы передали дополнительные свойства, они будут доступны в Параметры.ЭтоГруппа.

Подведем итог: Для успешного открытия формы новой группы недостаточно просто вызвать ФормуГруппы. Платформа требует явного указания намерения создать группу через передачу параметра ЭтоГруппа со значением Истина или через структуру ЗначениеЗаполнения. Использование этих простых правил избавит вас от ошибок, когда вместо структурированного дерева справочника в базе создаются плоские списки элементов.

← На главную