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