К статье
Практический материал

Разработка и Конфигурация · 8 мин

Как добавить команду программно в 1С

Как программно добавить команду на форму или в командную панель в 1С: работа с коллекцией Команды, Элементы, обработчики действий и типичные ошибки разработчика.

Программное добавление команды в 1С требуется, когда состав кнопок формы зависит от данных: ролей пользователя, вида документа, настроек функциональных опций. Вместо того чтобы рисовать десятки команд в конфигураторе, разработчик создаёт их динамически в модуле формы — в обработчике ПриСозданииНаСервере.

Работа сводится к трём объектам: коллекция Команды формы хранит саму команду с обработчиком, коллекция Элементы содержит кнопку, которая эту команду отображает, а процедура с директивой &НаКлиенте или &НаСервере выполняет действие. Пропуск любого из трёх шагов — самая частая причина того, что кнопка не появляется или не реагирует на нажатие.

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

Где и когда выполнять программное добавление команды

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

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

Создание команды через коллекцию Команды

Первый шаг — добавить объект в коллекцию Команды формы и заполнить ключевые свойства: Действие (имя процедуры-обработчика в виде строки), Заголовок, Картинка, Подсказка. Имя команды должно быть уникальным в пределах формы.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

НоваяКоманда = Команды.Добавить("КомандаЗаполнитьЦены");

НоваяКоманда.Действие = "Подключаемый_ЗаполнитьЦены";

НоваяКоманда.Заголовок = "Заполнить цены";

НоваяКоманда.Подсказка = "Заполнить цены номенклатуры по виду цен";

НоваяКоманда.Картинка = БиблиотекаКартинок.ЗаполнитьПоДанным;

КонецПроцедуры

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

Добавление кнопки и привязка к команде

Команда без элемента формы невидима. Кнопка создаётся через Элементы.Добавить() с типом КнопкаФормы, а привязка выполняется присвоением свойства ИмяКоманды. Второй параметр метода Добавить — родительский элемент: командная панель, группа кнопок или подменю.

Кнопка = Элементы.Добавить("КнопкаЗаполнитьЦены", Тип("КнопкаФормы"),

Элементы.КоманднаяПанельФормы);

Кнопка.ИмяКоманды = "КомандаЗаполнитьЦены";

Кнопка.Вид = ВидКнопкиФормы.ОбычнаяКнопка;

Если родитель не указан, кнопка попадёт в корень формы и, скорее всего, отобразится не там, где ожидалось. Всегда передавайте родителя явно — существующую командную панель или заранее созданную группу кнопок.

Порядок действий
  1. 1
    В ПриСозданииНаСервере добавьте команду: Команды.Добавить(Имя)
  2. 2
    Задайте свойства: Действие, Заголовок, Подсказка, Картинка
  3. 3
    Добавьте кнопку: Элементы.Добавить(Имя, Тип("КнопкаФормы"), Родитель)
  4. 4
    Привяжите кнопку: Кнопка.ИмяКоманды = Имя команды
  5. 5
    Создайте процедуру-обработчик с именем из свойства Действие
  6. 6
    Откройте форму и проверьте видимость и срабатывание кнопки

Обработчик команды: клиент или сервер

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

&НаКлиенте

Процедура Подключаемый_ЗаполнитьЦены(Команда)

ЗаполнитьЦеныНаСервере();

КонецПроцедуры

&НаСервере

Процедура ЗаполнитьЦеныНаСервере()

// логика заполнения табличной части

КонецПроцедуры

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

Команды для табличных частей и динамических списков

Чтобы кнопка работала в контексте строки таблицы, добавьте её в командную панель таблицы формы: Элементы.Товары.КоманднаяПанель или в контекстное меню. Текущая строка в обработчике доступна через Элементы.Товары.ТекущиеДанные.

Для динамических списков действует то же правило, но учитывайте: стандартные команды списка (создать, скопировать, удалить) управляются свойствами самого списка, а программные кнопки добавляются поверх. Если кнопка должна показываться только при определённых условиях, управляйте свойством Видимость элемента в серверных обработчиках, а не пересоздавайте команду.

Если команд несколько и они создаются в цикле по данным (например, по списку видов операций), формируйте имя команды и кнопки с уникальным суффиксом, а обработчик делайте один общий, разбирая Команда.Имя внутри процедуры. Так код остаётся компактным.
ПЗ
Практическое замечание

Типичные ошибки и проверка результата

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

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

Типичные ошибки
01
Создание команды на клиенте — коллекция Команды доступна только на сервере, код завершится ошибкой
02
Опечатка в свойстве Действие — кнопка видна, но при нажатии возникает ошибка «Процедура не обнаружена»
03
Кнопка добавлена без родителя — она не отображается в командной панели
04
Дублирование имени команды или кнопки — ошибка при создании формы
05
Повторное добавление команды при повторном вызове серверной процедуры без проверки Команды.Найти()
Контрольные точки

Как проверить результат

Кнопка на форме
Норма

Кнопка видна в нужной командной панели с заданным заголовком

Тревожный признак

Кнопки нет — проверьте родителя и видимость группы

Нажатие кнопки
Норма

Выполняется обработчик без ошибок

Тревожный признак

Ошибка «процедура не обнаружена» — имя в Действие не совпадает с процедурой

Повторное открытие формы
Норма

Команда создаётся заново без ошибок дублирования

Тревожный признак

Ошибка уникальности имени — добавьте проверку Команды.Найти(Имя)

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

Можно ли добавить команду в подменю программно?

Да. Сначала найдите или создайте группу подменю (тип ГруппаФормы с видом Подменю), затем передайте её как родителя при добавлении кнопки через Элементы.Добавить(). Стандартные подменю вроде «Ещё» доступны как дочерние элементы командной панели формы.

Как удалить программно добавленную команду?

Используйте Команды.Удалить(Команды.Найти(ИмяКоманды)) на сервере, предварительно удалив связанную кнопку через Элементы.Удалить(). Удалять кнопку без удаления команды можно — команда просто перестанет быть видимой.

Работает ли этот способ в обычных формах?

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

Почему картинка команды не отображается на кнопке?

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

Как добавить одну команду сразу на несколько форм?

Дублировать код в каждом модуле формы не нужно: вынесите создание команды и обработчик в общий модуль, а из ПриСозданииНаСервере каждой формы вызывайте его, передавая форму параметром. Обработчик в этом случае должен быть экспортной процедурой формы либо используйте стандартные команды и подключаемые механизмы БСП.

Итог

Что важно запомнить

Программная команда создаётся в три шага на сервере: Команды.Добавить() с обработчиком в свойстве Действие, кнопка через Элементы.Добавить() с явным родителем, привязка через ИмяКоманды. Проверяйте уникальность имён и совпадение имени обработчика — большинство ошибок связано именно с этим.