Почему в обычной форме документа задваиваются пункты в меню «Перейти» («Связанные регистры сведений»)?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Механизм автоматического формирования меню перехода

Проанализируем, как платформа 1С строит подменю «Перейти» при включенном свойстве «Автозаполнение» у командной панели обычной формы. Платформа сканирует структуру метаданных конфигурации и автоматически связывает форму объекта со связанными таблицами по нескольким независимым критериям:

  1. Подчинение регистратору: регистры сведений, у которых установлен режим записи ПодчинениеРегистратору, а текущий документ включен в состав регистраторов.
  2. Ведущие измерения: регистры сведений, у которых тип одного из измерений включает данный документ и для этого измерения установлен флаг Ведущее.
  3. Критерии отбора: если тип текущего документа входит в состав объектов критерия отбора, для которого задан переход к регистру.

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

Основная причина проблемы и ее исправление в метаданных

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

Рассмотрим, как правильно спроектировать свойства метаданных:

  1. Откроем дерево метаданных конфигуратора и перейдем к проблемному регистру сведений.
  2. Проверим режим записи регистра. Если установлен режим ПодчинениеРегистратору, то каскадное удаление записей при удалении документа-регистратора и контроль ссылочной целостности уже полностью обеспечиваются платформой автоматически через стандартный реквизит Регистратор.
  3. Перейдем к измерениям регистра. Если среди измерений есть поле с типом ссылки на текущий документ, снимем флаг Ведущее в его свойствах (или исключим избыточное измерение-ссылку, если данные уже зафиксированы в реквизите Регистратор).
  4. Сохраним и обновим конфигурацию базы данных. После снятия флага Ведущее платформа перестанет дублировать команду перехода, оставив единственную штатную связь по регистратору.

Альтернативные способы устранения задвоения

Если изменить структуру метаданных регистра невозможно (например, конфигурация находится на стандартной поддержке или флаг Ведущее необходим для других бизнес-сценариев), рассмотрим обходные пути исправления интерфейса формы.

Способ 1. Ручная настройка командной панели формы:

  1. Откроем обычную форму документа в конфигураторе и перейдем в свойства командной панели формы.
  2. Снимем флаг Автозаполнение.
  3. Нажмем правой кнопкой мыши по командной панели, выберем команду «Заполнить автоматически», после чего вручную удалим дублирующуюся кнопку в подменю «Перейти».

Способ 2. Программное открытие списка регистра:

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


Процедура КоманднаяПанельДействияОткрытьРегистр(Кнопка)
    ФормаСписка = РегистрыСведений.НашРегистрСведений.ПолучитьФормуСписка();
    
    // Устанавливаем отбор по текущему документу-регистратору
    ФормаСписка.Отбор.Регистратор.Значение = ЭтотОбъект.Ссылка;
    ФормаСписка.Отбор.Регистратор.ВидСравнения = ВидСравнения.Равно;
    ФормаСписка.Отбор.Регистратор.Использование = Истина;
    
    ФормаСписка.Открыть();
КонецПроцедуры

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

← На главную