При доработке и обновлении конфигураций 1С разработчики нередко сталкиваются с ситуацией, когда на управляемой форме кнопка перестает работать, а в ее свойствах поле ИмяКоманды оказывается пустым. При попытке ввести имя нужной команды с клавиатуры конфигуратор не дает этого сделать, а в выпадающем списке выбора нужная команда отсутствует. Разберем детально, почему платформа 1С накладывает такие ограничения, как устроен механизм привязки команд к элементам формы и какие способы существуют для решения данной задачи.
Проанализируем внутреннее устройство управляемого интерфейса платформы «1С:Предприятие 8.3». Кнопка формы (объект КнопкаФормы) сама по себе не содержит логики выполнения алгоритма — она является лишь элементом отображения, связанным с конкретным исполняемым объектом — командой.
В конфигураторе поле ИмяКоманды представляет собой селектор строгой типизированной связи, а не произвольную текстовую строку. Платформа формирует список доступных значений исключительно из команд, входящих в текущую область видимости формы. В этот список входят:
Команды конкретной управляемой формы.Закрыть, Записать, Провести).Общие команды, а также параметризуемые команды объектов, контекст которых доступен форме.Если нужная процедура или команда объявлена в модуле другого объекта (например, внутри конкретного справочника), платформа не включает ее в список доступных для произвольной или общей формы, так как между ними отсутствует прямая контекстная связь.
Рассмотрим типовую ситуацию: после объединения конфигураций на общей форме (например, в форме настройки криптографии) кнопка потеряла связь с командой добавления сертификата. В конфигурации существует справочник СертификатыЭЦП, и внутри него есть команды ЗагрузитьСертификатИзФайла и ЗагрузитьСертификатИзХранилищаСертификатов. Однако на общей форме эти команды в списке выбора отсутствуют.
Разберем, почему так происходит:
Группа установлено значение Панель действий.Сервис или Панель навигации, она размещается в командном интерфейсе всей подсистемы, но не становится автоматически доступной для произвольных кнопок на независимых формах.СправочникСсылка.СертификатыЭЦП или СправочникОбъект.СертификатыЭЦП. Для платформы эта форма является независимой, поэтому параметрические команды справочника к ней не привязываются.Наиболее правильным архитектурным решением при разработке логики конкретной формы является создание собственной команды формы, которая вызывает требуемую логику программно. Разберем этот процесс по шагам:
ЗагрузитьСертификатИзФайла.ЗагрузитьСертификатИзФайла.Посмотрим на пример клиентского обработчика команды, вызывающего типовые методы подсистемы криптографии или экспортные методы менеджера справочника:
&НаКлиенте
Процедура ЗагрузитьСертификатИзФайла(Команда)
// Вызываем экспортный метод общего модуля или открываем форму мастера добавления
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("РежимВыбора", Ложь);
ОткрытьФорму("Справочник.СертификатыКлючейЭлектроннойПодписиИШифрования.Форма.ФормаЭлемента", ПараметрыОткрытия, ЭтаФорма);
КонецПроцедуры
Такой способ гарантирует, что метаданные конфигурации не засоряются дублирующими глобальными командами, а логика взаимодействия кнопки и формы остается прозрачной.
Если функционал должен быть универсально доступен из различных общих форм и панелей разделов, логику можно вынести в глобальные команды метаданных.
Разберем алгоритм настройки:
ЗагрузитьСертификатИзФайла).Посмотрим на структуру модуля общей команды:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// Логика вызова функционала загрузки сертификата
Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайлаСертификата", ЭтотОбъект);
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Фильтр = "Файлы сертификатов (*.cer; *.crt)|*.cer;*.crt|Все файлы (*.*)|*.*";
Диалог.Показать(Оповещение);
КонецПроцедуры
В среде встроенного языка 1С свойство ИмяКоманды доступно для записи в виде строки. Однако важно понимать: назначить кнопке можно имя только той команды, которая уже зарегистрирована в коллекции ЭтаФорма.Команды.
Рассмотрим пример создания кнопки и привязки к ней команды программно в обработчике ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// 1. Создаем команду формы программно
ИмяНовойКоманды = "КомандаЗагрузкиСертификата";
НоваяКоманда = ЭтаФорма.Команды.Добавить(ИмяНовойКоманды);
НоваяКоманда.Действие = "ЗагрузитьСертификатИзФайла";
НоваяКоманда.Заголовок = "Загрузить из файла...";
// 2. Создаем кнопку на форме и привязываем имя команды строкой
ИмяКнопки = "КнопкаЗагрузитьСертификат";
ЭлементКнопка = Элементы.Добавить(ИмяКнопки, Тип("КнопкаФормы"), Элементы.КоманднаяПанельФормы);
ЭлементКнопка.ИмяКоманды = ИмяНовойКоманды;
КонецПроцедуры
Важное замечание: если попытаться передать в ЭлементКнопка.ИмяКоманды строку с именем команды, которой нет в коллекции Команды текущей формы, платформа вызовет исключение времени выполнения (ошибку недопустимого значения).
Если потеря связи кнопки с командой произошла в результате типового обновления конфигурации, находящейся на поддержке, следует придерживаться следующих правил:
ЭлектроннаяПодписьКлиент).