Как добавить заимствованный объект конфигурации в подсистему через расширение, если он не отображается в интерфейсе?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

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

Проанализируем причину проблемы

Выясним, почему стандартный механизм «галочек» не срабатывает. В системе 1С:Предприятие 8.3 отображение объекта в командном интерфейсе подсистемы напрямую зависит от наличия команд, связанных с этим объектом. У любого справочника или документа в метаданных есть свойство Использовать стандартные команды. Если этот флаг установлен, платформа автоматически генерирует команды для открытия списка, создания нового элемента и так далее.

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

Способ 1. Создание собственной команды внутри заимствованного объекта

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

  1. Заимствуем необходимый справочник в расширение (нажимаем правой кнопкой мыши на объект в основной конфигурации — Добавить в расширение).
  2. В дереве объектов расширения разворачиваем ветку нашего справочника, находим раздел Команды и нажимаем Добавить.
  3. В свойствах новой команды (например, с именем ОткрытьСписок) в поле Группа выбираем Панель навигации.Обычное или Панель навигации.См. также. Это критически важный шаг, так как именно он определяет, где появится ссылка.
  4. Создаем обработчик команды. Для этого нажимаем на лупу в поле Модуль команды и пишем код для открытия формы списка:

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    ОткрытьФорму("Справочник.НоменклатураКонтрагентов.ФормаСписка");
КонецПроцедуры

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

Способ 2. Использование общих команд расширения

Если вам нужно вывести в одну подсистему сразу несколько ссылок или вы не хотите «засорять» структуру справочника, можно воспользоваться Общими командами. Разберем, как это настроить:

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

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    // Указываем полное имя объекта, форму которого хотим открыть
    ОткрытьФорму("Справочник.НоменклатураКонтрагентов.ФормаСписка");
КонецПроцедуры

Проанализируем ситуацию с отображением: теперь, когда у команды указана группа, мы можем зайти в редактор командного интерфейса подсистемы (правой кнопкой на подсистему — Открыть командный интерфейс) и увидеть нашу общую команду в списке. Убедитесь, что напротив нее стоит флаг видимости.

Способ 3. Использование вспомогательной обработки (не рекомендуемый)

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ОткрытьФорму("Справочник.НоменклатураКонтрагентов.ФормаСписка");
    ЭтаФорма.Закрыть();
КонецПроцедуры

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

Важные нюансы: Роли и Права доступа

Даже если вы правильно настроили команды и подсистемы, объект может не появиться в интерфейсе из-за ограничений прав доступа. Платформа 1С автоматически скрывает элементы интерфейса, на которые у текущего пользователя нет прав Просмотр. Для быстрого анализа прав конкретного пользователя на объекты метаданных можно использовать готовые решения — для этого подойдёт обработка детального анализа и сравнения прав доступа и ролей.

Посмотрим, что нужно проверить в расширении:

  1. Создайте в расширении новую Роль.
  2. Найдите в этой роли заимствованный справочник и установите права Чтение и Просмотр.
  3. Найдите вашу новую команду (общую или в справочнике) и также дайте право на Просмотр.
  4. Не забудьте назначить эту роль пользователю в режиме «Предприятие» через профили групп доступа. Если сложно определить, в какой именно профиль нужно включить пользователя, на помощь придет инструмент для анализа ролей и поиска подходящего профиля — в этом поможет отчет по анализу прав доступа, ролей и профилей пользователей. Без этого расширение может просто «молчать», скрывая ваши доработки.

Проверка функциональных опций

Если справочник в основной конфигурации связан с какой-либо Функциональной опцией (ФО), и эта опция в базе выключена, то объект не появится в интерфейсе даже через расширение. Платформа приоритетно проверяет состояние ФО. В таком случае вам придется либо включить соответствующую настройку в программе, либо заимствовать саму функциональную опцию в расширение и изменять ее логику (что является более сложной задачей и требует осторожности).

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

← На главную