Как заполнить свойство кнопки «ИмяКоманды» в управляемой форме 1С и почему его нельзя ввести вручную

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

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

Почему свойство «ИмяКоманды» нельзя отредактировать текстом

Проанализируем внутреннее устройство управляемого интерфейса платформы «1С:Предприятие 8.3». Кнопка формы (объект КнопкаФормы) сама по себе не содержит логики выполнения алгоритма — она является лишь элементом отображения, связанным с конкретным исполняемым объектом — командой.

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

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

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

Выясним причину: почему команды справочника не видны на общей форме

Рассмотрим типовую ситуацию: после объединения конфигураций на общей форме (например, в форме настройки криптографии) кнопка потеряла связь с командой добавления сертификата. В конфигурации существует справочник СертификатыЭЦП, и внутри него есть команды ЗагрузитьСертификатИзФайла и ЗагрузитьСертификатИзХранилищаСертификатов. Однако на общей форме эти команды в списке выбора отсутствуют.

Разберем, почему так происходит:

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

Вариант 1. Создание локальной команды формы (рекомендуемый подход)

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

  1. Открываем нужную форму в конфигураторе и переходим на вкладку Команды (раздел Команды формы).
  2. Добавляем новую команду, например ЗагрузитьСертификатИзФайла.
  3. В свойствах команды нажимаем кнопку открытия действия (лупа) и создаем клиентский обработчик события.
  4. Возвращаемся к элементам формы, выбираем проблемную кнопку и в свойстве ИмяКоманды выбираем созданную команду формы ЗагрузитьСертификатИзФайла.

Посмотрим на пример клиентского обработчика команды, вызывающего типовые методы подсистемы криптографии или экспортные методы менеджера справочника:


&НаКлиенте
Процедура ЗагрузитьСертификатИзФайла(Команда)
    
    // Вызываем экспортный метод общего модуля или открываем форму мастера добавления
    ПараметрыОткрытия = Новый Структура;
    ПараметрыОткрытия.Вставить("РежимВыбора", Ложь);
    
    ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ФормаЭлемента", ПараметрыОткрытия, ЭтаФорма);
    
КонецПроцедуры

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

Вариант 2. Вынос логики в объект «Общие команды»

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

Разберем алгоритм настройки:

  1. В дереве метаданных конфигурации переходим в ветку Общие -> Общие команды.
  2. Создаем новую общую команду (например, ЗагрузитьСертификатИзФайла).
  3. В модуле команды размещаем алгоритм открытия диалога или вызова прикладной подсистемы.
  4. В свойствах команды параметр Тип параметра команды оставляем пустым (если команда не требует передачи конкретного объекта).
  5. Возвращаемся в редактор формы, выделяем кнопку, открываем список выбора свойства ИмяКоманды и на вкладке Глобальные команды выбираем созданную общую команду.

Посмотрим на структуру модуля общей команды:


&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    
    // Логика вызова функционала загрузки сертификата
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайлаСертификата", ЭтотОбъект);
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Фильтр = "Файлы сертификатов (*.cer; *.crt)|*.cer;*.crt|Все файлы (*.*)|*.*";
    Диалог.Показать(Оповещение);
    
КонецПроцедуры

Программное назначение команды кнопке

В среде встроенного языка 1С свойство ИмяКоманды доступно для записи в виде строки. Однако важно понимать: назначить кнопке можно имя только той команды, которая уже зарегистрирована в коллекции ЭтаФорма.Команды.

Рассмотрим пример создания кнопки и привязки к ней команды программно в обработчике ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Создаем команду формы программно
    ИмяНовойКоманды = "КомандаЗагрузкиСертификата";
    НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяНовойКоманды);
    НоваяКоманда.Действие = "ЗагрузитьСертификатИзФайла";
    НоваяКоманда.Заголовок = "Загрузить из файла...";
    
    // 2. Создаем кнопку на форме и привязываем имя команды строкой
    ИмяКнопки = "КнопкаЗагрузитьСертификат";
    ЭлементКнопка = Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"), Элементы.КоманднаяПанельФормы);
    ЭлементКнопка.ИмяКоманды = ИмяНовойКоманды;
    
КонецПроцедуры

Важное замечание: если попытаться передать в ЭлементКнопка.ИмяКоманды строку с именем команды, которой нет в коллекции Команды текущей формы, платформа вызовет исключение времени выполнения (ошибку недопустимого значения).

Рекомендации при обновлении конфигураций на поддержке

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

  1. Проверить состав подсистемы БСП: в современных версиях Библиотеки стандартных подсистем многие старые команды справочников криптографии упразднены, а функционал перенесен в общие формы и модули (например, ЭлектроннаяПодписьКлиент).
  2. Использовать расширения конфигурации: чтобы не снимать объекты с поддержки поставщика и не усложнять будущие обновления, добавление команд и кнопок рекомендуется выполнять в отдельном расширении (через переопределение формы и добавление клиентских обработчиков).
← На главную