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