Как узнать, какие команды объектов конфигурации задействованы в командных интерфейсах 1С

· 10 мин

Содержание

Быстрее всего узнать, где задействована команда объекта конфигурации, в Конфигураторе: щёлкните правой кнопкой по команде (или по самому объекту) в дереве метаданных и выберите Найти ссылки на объект. В списке результатов будут подсистемы, в командных интерфейсах которых она выведена, и формы, где она стоит в командной панели. Полную картину видимости по ролям даёт редактор командного интерфейса подсистемы, а массовый анализ — выгрузка конфигурации в XML и поиск по файлам CommandInterface.xml.

Задача обычно возникает в двух случаях. Пользователь не видит команду, которая «точно есть». Или разработчик хочет удалить команду и боится, что она где-то ещё нужна. Ниже — способы от самого простого к массовому, с примерами кода и командами пакетного запуска.

Как устроен командный интерфейс и откуда в нём берутся команды

В управляемом приложении 1С 8.3 пользователь видит не объекты, а команды. Их источников три:

  • 📦 Стандартные команды объекта. Платформа создаёт их сама: открыть список справочника, создать документ , открыть журнал. Выводятся, если объект входит в подсистему и у него включено свойство Использовать стандартные команды.
  • 🧩 Собственные команды объекта — ветка Команды внутри справочника, документа, обработки. Где команда появится, решает её свойство Группа: панель навигации , панель действий или командная панель формы.
  • 🌐 Общие команды — ветка Общие → Общие команды. Работают так же, но не принадлежат конкретному объекту.

Попадание команды в конкретный раздел определяется составом подсистем. Объект или общая команда, включённые в подсистему, дают свои команды в её командный интерфейс. Дальше разработчик настраивает в редакторе порядок, видимость по ролям и размещение.

Отдельная история — параметризуемые команды. У них задан тип параметра (например, ссылка на контрагента). Такие команды не попадают в разделы, а появляются в формах объектов этого типа: в панели навигации формы или в её командной панели.

Отсюда главный вывод для поиска. Чтобы понять, где показывается команда, нужно проверить три вещи: состав подсистем, свойство Группа самой команды и тип её параметра.

Какой способ поиска выбрать

СпособЧто показываетКогда подходит
Найти ссылки на объектПодсистемы, формы, модули, где упомянута командаОдна команда, быстрый ответ
Редактор командного интерфейса подсистемыВидимость, порядок, группы, ролиРазбор одного раздела
Окно «Все подсистемы»Какие объекты в каких подсистемахПроверка состава разделов
Командный интерфейс формыКоманды в навигации и панели формыПараметризуемые команды
Выгрузка в XML + поискВсе вхождения по всей конфигурацииАудит, удаление, сравнение версий
Код на метаданныхСостав подсистем и команды объектовОтчёт для команды разработки

Поиск команд объектов конфигурации штатными средствами Конфигуратора

Найти ссылки на объект

  1. Откройте Конфигуратор и дерево конфигурации.
  2. Раскройте объект, например справочник Номенклатура, затем ветку Команды.
  3. Щёлкните правой кнопкой по нужной команде → Найти ссылки на объект.
  4. Внизу откроется окно результатов. Двойной щелчок по строке переводит к месту использования.

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

Редактор командного интерфейса подсистемы

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

Что в нём видно:

  • ✅ флажок «Видимость» — общая видимость команды в разделе;
  • 👥 колонки по ролям — видимость для конкретной роли, если она отличается от общей;
  • ↕️ порядок команд и группы: Важное, Обычное, См. также, Создать, Отчеты, Сервис.

Команда, у которой сняты все флажки, в конфигурации есть, но пользователь её не увидит. Это частая причина обращений «пропал пункт меню».

Для корня конфигурации есть свои редакторы: в контекстном меню корневого узла Открыть командный интерфейс конфигурации (порядок и видимость разделов) и редактор рабочей области начальной страницы.

Окно «Все подсистемы»

Его вызывают из контекстного меню ветки Подсистемы. Слева — дерево подсистем, справа — объекты. Можно выбрать объект и увидеть все подсистемы, в которые он входит. Удобно, когда нужно понять, в каких разделах окажутся стандартные команды справочника.

Командный интерфейс формы

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

Программный анализ команд через метаданные

Встроенный язык даёт доступ к составу подсистем и командам объектов. А вот настройки видимости из редактора командного интерфейса (флажки по ролям, порядок) через Метаданные не читаются. Для них нужна выгрузка в XML, о ней ниже.

Пример серверной процедуры: обходит все подсистемы рекурсивно и выводит, какие объекты и общие команды в них входят и какие собственные команды есть у этих объектов.

&НаСервереБезКонтекста
Процедура ВывестиКомандыПодсистем()
	Для Каждого Подсистема Из Метаданные.Подсистемы Цикл
		ОбойтиПодсистему(Подсистема, "");
	КонецЦикла;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбойтиПодсистему(Подсистема, Отступ)
	Сообщить(Отступ + "Подсистема: " + Подсистема.ПолноеИмя());
	Для Каждого Объект Из Подсистема.Состав Цикл
		Если Метаданные.ОбщиеКоманды.Содержит(Объект) Тогда
			Сообщить(Отступ + "   общая команда: " + Объект.Имя);
			Продолжить;
		КонецЕсли;
		Сообщить(Отступ + "   объект: " + Объект.ПолноеИмя());
		Попытка
			КомандыОбъекта = Объект.Команды;
		Исключение
			КомандыОбъекта = Неопределено; // у объекта этого вида нет ветки «Команды»
		КонецПопытки;
		Если КомандыОбъекта <> Неопределено Тогда
			Для Каждого Команда Из КомандыОбъекта Цикл
				Сообщить(Отступ + "      команда: " + Команда.Имя);
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
	Для Каждого Вложенная Из Подсистема.Подсистемы Цикл
		ОбойтиПодсистему(Вложенная, Отступ + "   ");
	КонецЦикла;
КонецПроцедуры

Проверить обратное — входит ли объект хоть в одну подсистему — можно методом Подсистема.Состав.Содержит(Объект). Объект без подсистем не даёт стандартных команд ни в одном разделе: пользователь найдёт его только через «Все функции».

Если нужен результат в виде таблицы, замените Сообщить на запись в таблицу значений и выведите её в табличный документ. Для большой конфигурации вроде ERP вывод сообщениями займёт тысячи строк.

Как проверить срабатывание команды: отладчик и журнал регистрации

Метаданные показывают, где команда может появиться. Чтобы понять, вызывается ли она на самом деле, нужен запуск.

Отладчик

  1. Откройте модуль команды: в её свойствах — Модуль команды → Открыть.
  2. Поставьте точку останова в процедуре ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды).
  3. Запустите отладку и нажмите в пользовательском режиме ту кнопку, которую проверяете.
  4. Если остановка сработала — кнопка вызывает именно эту команду. В ПараметрыВыполненияКоманды.Источник видно, из какой формы её вызвали.

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

Журнал регистрации

По умолчанию платформа не пишет в журнал каждое нажатие команды. Если нужна статистика использования перед удалением, добавьте в ОбработкаКоманды запись:

ЗаписьЖурналаРегистрации("Аудит команд.Вызов",
	УровеньЖурналаРегистрации.Информация, , ,
	"Вызвана команда ВыгрузкаПрайса");

Через месяц откройте журнал (Администрирование → Обслуживание → Журнал регистрации в БП 3.0 и ЗУП 3.1 или Администрирование → Журнал регистрации в Конфигураторе) и отберите события по имени. Ни одного вызова за месяц — весомый довод, что команду можно убирать.

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

Команды из расширений конфигурации

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

Что учесть:

  • 🔌 В Конфигураторе откройте дерево расширения (Конфигурация → Расширения конфигурации → выбрать расширение → Конфигурация) и повторите поиск ссылок там.
  • 🧭 В коде пользовательского режима Метаданные уже включают объекты подключённых расширений. Отличить их помогает метод Объект.РасширениеКонфигурации(): для объектов основной конфигурации он возвращает Неопределено.
  • 📄 Выгружать в файлы расширение нужно отдельно: ключ -Extension с именем расширения у /DumpConfigToFiles.

Если пользователь видит команду, которой нет в основной конфигурации, почти всегда её принесло расширение или внешняя обработка, подключённая как дополнительная (в конфигурациях на БСП она выводится через раздел дополнительных обработок).

Массовый анализ: выгрузка в XML и внешняя обработка

Выгрузка конфигурации в файлы

Это самый полный способ. В Конфигураторе: Конфигурация → Выгрузить конфигурацию в файлы. Или пакетно:

"C:\Program Files\1cv8\8.3.24.1691\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh" /N "Администратор" /P "" /DumpConfigToFiles "D:\Dump\Buh" /Out "D:\Dump\log.txt"

Путь к 1cv8.exe подставьте свой, по установленной версии платформы. Выгрузка не требует монопольного доступа и базу не меняет.

Настройки командного интерфейса подсистемы лежат в файле Subsystems\ИмяПодсистемы\Ext\CommandInterface.xml. Команды записаны полным именем: CommonCommand.ИмяКоманды, Catalog.Номенклатура.Command.ИмяКоманды, Catalog.Номенклатура.StandardCommand.OpenList. Там же видны блоки видимости по ролям.

Найти все интерфейсы, где упомянута команда:

findstr /S /M /C:"CommonCommand.ЗагрузкаКурсовВалют" D:\Dump\Buh\*.xml

Или в PowerShell, с выводом строк:

Get-ChildItem D:\Dump\Buh -Recurse -Filter CommandInterface.xml |
  Select-String -Pattern "Catalog.Номенклатура" |
  Select-Object Path, LineNumber

💡 Выгрузку удобно положить в git: тогда видно, кто и когда снял видимость команды в разделе. Сравнение двух выгрузок показывает изменения командного интерфейса между релизами точнее, чем сравнение конфигураций в Конфигураторе.

Внешняя обработка для аудита

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

Для проверки прав добавьте цикл по Метаданные.Роли и метод ПравоДоступа("Просмотр", Объект, Роль). Команда объекта, на который у роли нет права просмотра, пользователю с этой ролью не покажется, даже если в редакторе интерфейса стоит флажок.

Почему команда есть в конфигурации, но не видна пользователю

Диагностика: выберите симптом

Не включайте видимость команды для всех ролей, чтобы «быстро починить» — так вы откроете раздел тем, кому он не положен. Сначала найдите, какое из ограничений сработало.

Как держать командные интерфейсы в порядке

Анализ обычно вскрывает лишнее. Несколько правил, которые упрощают жизнь и пользователям, и поддержке:

  1. Группа «Важное» — короткая. 5–7 команд на раздел. Остальное — в «Обычное» и «См. также».
  2. Одна команда — один основной раздел. Если справочник нужен в трёх разделах, в двух из них выводите его в «См. также».
  3. Права через роли, не через флажки. Скрывать команду флажком в колонке роли — временная мера. Надёжнее не давать роли права на объект.
  4. Свои команды — в расширении и в своей подсистеме или заимствованной. Типовая конфигурация остаётся на поддержке.
  5. Проверяйте под реальным пользователем. Конфигуратор показывает, как задумано; рабочий сеанс под пользователем с его ролями и опциями показывает, как есть.

Частые вопросы

Можно ли прочитать флажки видимости командного интерфейса из кода?
Нет. Через объект Метаданные доступны состав подсистем и команды объектов, а видимость по ролям и порядок команд хранятся только в описании командного интерфейса. Их читают из выгрузки в XML.
Почему «Найти ссылки на объект» ничего не нашёл, а кнопка в программе есть?
Чаще всего команду добавило расширение или подключённая дополнительная обработка. Повторите поиск в дереве расширения или проверьте список дополнительных обработок.
Как посмотреть все объекты, у которых нет ни одного раздела?
Обойдите объекты метаданных и для каждого проверьте Подсистема.Состав.Содержит() по всем подсистемам рекурсивно. Объекты без вхождений доступны только через «Все функции».
Где пользователь найдёт команду, которой нет в разделах?
В меню «Все функции». Его показ включается в параметрах программы флажком «Отображать команду «Все функции»». Права роли при этом всё равно действуют.
Влияет ли командный интерфейс на права доступа?
Нет. Он отвечает только за показ. Если у роли есть право на объект, пользователь откроет его через «Все функции» или навигационную ссылку, даже когда команда скрыта в разделе.