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

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

Как добавить кнопку на управляемую форму в 1С

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

Кнопка на управляемой форме в 1С — это не самостоятельный элемент с кодом «внутри», как было в обычных формах, а связка из трёх объектов: команды формы, элемента формы типа «Кнопка» и процедуры-обработчика в модуле формы. Пока все три части созданы и связаны между собой, кнопка либо не появится, либо будет неактивна, либо вызовет ошибку при нажатии.

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

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

Что нужно понять перед добавлением кнопки

В управляемой форме логика интерфейса строится на декларативном принципе: вы описываете, что должно быть на форме, а платформа сама решает, как это отрисовать на тонком клиенте, веб-клиенте или мобильном приложении. Поэтому нельзя «нарисовать» кнопку мышью в произвольной точке — её положение определяется местом в дереве элементов и родительской группой.

Кнопка всегда связана с командой. Команда определяет действие, кнопка — лишь способ его вызвать. Одна и та же команда может быть представлена несколькими кнопками в разных местах формы и пунктом в меню «Ещё». Это важно при отладке: если кнопка не работает, проблема ищется в команде и её обработчике, а не в самом элементе.

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

Добавление кнопки через конфигуратор

Откройте конфигуратор, найдите нужный объект (документ, справочник, обработку) и раскройте ветку «Формы». Двойным щелчком откройте форму — появится редактор с деревом элементов слева вверху, панелью команд слева внизу и предпросмотром справа.

Порядок действий в конфигураторе
  1. 1
    Откройте форму объекта в конфигураторе
  2. 2
    На закладке «Команды» перейдите на вкладку «Команды формы» и нажмите «Добавить»
  3. 3
    Задайте имя команды, например «ЗаполнитьПоУмолчанию», и заголовок, который увидит пользователь
  4. 4
    В свойстве «Действие» нажмите кнопку выбора и создайте обработчик — платформа добавит процедуру в модуль формы
  5. 5
    Перетащите команду из панели команд в нужное место дерева элементов формы — появится кнопка
  6. 6
    Сохраните форму, обновите конфигурацию базы данных и проверьте в режиме предприятия

Ключевой момент — именно перетаскивание команды в дерево элементов. Если просто создать команду, но не добавить её на форму, кнопки не будет. После перетаскивания у нового элемента автоматически заполнится свойство «ИмяКоманды», а заголовок унаследуется от команды.

Если форма объекта ещё не создана (используется форма по умолчанию), сначала добавьте её: в свойствах объекта нажмите кнопку выбора у поля «Основная форма» или создайте форму через контекстное меню ветки «Формы» — конструктор предложит тип формы и состав реквизитов.

Куда поместить кнопку

Место кнопки определяет родительский элемент в дереве. Перетащите команду на «КоманднаяПанель» формы — кнопка появится в верхней панели рядом со стандартными кнопками «Записать» и «Провести». Перетащите на группу-колонку или страницу — кнопка окажется внутри этой группы. Для размещения рядом с конкретным полем создайте группу с группировкой «Горизонтальная» и поместите в неё поле и кнопку.

Если кнопок много и они относятся к второстепенным действиям, разумно создать подменю: добавьте в дерево элементов группу с видом «Подменю» и перетащите команды в неё. Так командная панель не перегружается, а редко используемые действия убираются в выпадающий список.

Настройка команды и обработчика

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

При создании обработчика платформа спросит тип: «На клиенте», «На сервере» или «На клиенте и сервере». Выбирайте по содержимому кода: вызов вопроса, открытие формы, работа с файлами на компьютере пользователя — клиент; запросы к базе, изменение данных объекта — сервер. Директивы компиляции (&НаКлиенте, &НаСервере) расставляются автоматически, но при необходимости их можно изменить вручную в модуле формы.

bsl
&НаКлиенте
Процедура ЗаполнитьПоУмолчанию(Команда)
	ЗаполнитьПоУмолчаниюНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПоУмолчаниюНаСервере()
	Объект.Комментарий = "Заполнено автоматически";
КонецПроцедуры

Обратите внимание на параметр «Команда» в обработчике — через него доступна сама команда формы. Если одна процедура обслуживает несколько кнопок, по имени команды можно разветвить логику.

Программное добавление кнопки

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

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

Три правила, которые здесь критичны. Во-первых, свойство Действие принимает строку с именем процедуры модуля формы — сама процедура должна существовать, иначе при нажатии будет ошибка. Во-вторых, тип элемента указывается как Тип("КнопкаФормы"). В-третьих, родительский элемент (третий параметр метода Добавить) должен существовать на форме — если командная панель называется иначе, используйте её фактическое имя.

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

Проверка результата

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

Контрольные точки

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

Кнопка видна на форме
Норма

Отображается в ожидаемом месте с заданным заголовком

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

Кнопки нет — команда не перетащена в дерево элементов или скрыта функциональной опцией

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

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

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

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

Состояние кнопки
Норма

Кнопка активна, когда действие уместно

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

Кнопка серая — проверьте свойство Доступность и связь с данными формы

Дополнительно проверьте форму в том клиенте, которым реально пользуются сотрудники. Отрисовка в тонком и веб-клиенте может отличаться: длинные заголовки обрезаются, группы перестраиваются. Если кнопка критична для работы, убедитесь, что она не ушла в меню «Ещё» из-за нехватки ширины панели.

Типичные ошибки и ограничения

Типичные ошибки
01
Команда создана, но не перетащена в дерево элементов — кнопка просто не появляется на форме
02
В свойстве Действие указано имя, не совпадающее с процедурой модуля, — ошибка при нажатии
03
Серверная логика размещена в клиентском обработчике — ошибка компиляции или недоступность контекста
04
Программное добавление кнопки выполнено в обработчике ПриОткрытии вместо ПриСозданииНаСервере — элементы формы там ещё недоступны для создания
05
Изменена типовая форма без оценки последствий — конфликты при обновлении конфигурации

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

Способы добавить кнопку

В конфигураторе

Подходит для постоянных кнопок; наглядно и быстро, но требует изменения конфигурации

Программно в модуле формы

Подходит для кнопок, появляющихся по условию; гибче, но сложнее сопровождать

Через расширение конфигурации

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

FAQ

Почему кнопка появилась, но неактивна (серая)?

Чаще всего причина в том, что команда связана с данными, которых нет в текущем контексте, или в явно установленном свойстве Доступность = Ложь. Проверьте также, не переопределяет ли доступность стандартная обработка формы — например, в форме нового незаписанного объекта часть действий блокируется платформой.

Как добавить кнопку в форму списка, а не форму объекта?

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

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

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

Как назначить кнопке сочетание клавиш?

В свойствах кнопки есть свойство «СочетаниеКлавиш» — откройте его и выберите комбинацию из списка. Выбирайте сочетания, не занятые стандартными командами платформы, чтобы не возникало конфликтов.

Кнопка есть в тонком клиенте, но пропала в веб-клиенте. Что делать?

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

Итог

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

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