Разработка и Конфигурация · 11 мин
Как сделать кнопки в 1С: пошаговое руководство
Как добавить кнопку на форму в 1С: создание команды, привязка обработчика, программное создание кнопок, работа с командной панелью и типичные ошибки.
Кнопка в 1С — это не самостоятельный объект, а визуальное представление команды на форме. Поэтому создание кнопки всегда состоит из трёх шагов: создать команду, написать для неё обработчик и перетащить команду на форму в нужное место. Понимание этой связки избавляет от большинства вопросов новичков, которые пытаются «нарисовать» кнопку напрямую.
Способ добавления зависит от типа формы. В управляемых формах (платформа 8.3, современные конфигурации) кнопки создаются через команды формы или команды объекта. В обычных формах (старые конфигурации на 8.2 и ранее) кнопка добавляется как элемент диалога с событием «Нажатие». Ниже разобраны оба подхода, а также программное создание кнопок «на лету».
Перед началом работы убедитесь, что у вас есть права на изменение конфигурации или хотя бы на создание внешней обработки. Если конфигурация типовая и находится на поддержке, прямое изменение форм потребует снятия объектов с поддержки — безопасная альтернатива описана в разделе про расширения.
Где создавать кнопку: форма объекта, общая форма или расширение
Кнопку можно добавить на форму документа, справочника, отчёта, обработки или на общую форму. Логика везде одинаковая: команда + обработчик + элемент формы. Выбирайте ту форму, где кнопка нужна пользователю по смыслу задачи — например, кнопку «Заполнить по заказу» логично разместить на форме документа «Реализация товаров».
Если конфигурация типовая (1С:Бухгалтерия, Управление торговлей, ЗУП), изменять её формы напрямую нежелательно: при обновлении изменения могут конфликтовать с обновлением поставщика. Правильный путь — создать расширение конфигурации, заимствовать в него нужную форму и добавить кнопку там. Расширение накладывается поверх типовой конфигурации и не мешает обновлениям.
Для разовых задач и тестирования удобна внешняя обработка: создайте новую внешнюю обработку (Файл → Новый → Внешняя обработка), добавьте ей форму и тренируйтесь на ней. Это полностью безопасно для рабочей базы.
Создание кнопки на управляемой форме через конфигуратор
Откройте конфигуратор, найдите нужный объект (например, документ), разверните его ветку и двойным щелчком откройте форму. Если формы ещё нет, создайте её конструктором: правой кнопкой по объекту → «Добавить» → «Форма документа».
В редакторе формы перейдите на вкладку «Команды» (обычно слева вверху, рядом с вкладкой «Элементы»). Добавьте новую команду, задайте ей имя, например «ЗаполнитьПоОстаткам», и заголовок — тот текст, который увидит пользователь на кнопке. В свойствах команды нажмите кнопку с лупой у поля «Действие» — конфигуратор создаст заготовку обработчика в модуле формы.
После этого вернитесь на вкладку «Элементы» и просто перетащите команду из списка команд в дерево элементов формы — в то место, где должна появиться кнопка: в командную панель, в группу кнопок или в подменю. 1С автоматически создаст элемент типа «Кнопка формы», связанный с вашей командой.
- 1Откройте форму объекта в конфигураторе
- 2На вкладке «Команды» добавьте новую команду и задайте заголовок
- 3Через свойство «Действие» создайте обработчик в модуле формы
- 4Напишите код обработчика
- 5Перетащите команду в дерево элементов формы
- 6Обновите конфигурацию базы данных (F7) и проверьте в режиме предприятия
Написание обработчика команды
Обработчик команды в управляемой форме обычно разбивается на две процедуры: клиентскую с директивой &НаКлиенте и серверную с директивой &НаСервере. Клиентская часть отвечает за взаимодействие с пользователем (вопросы, открытие форм), серверная — за работу с данными, запросы и изменение объектов.
Пример простейшего обработчика, который по нажатию кнопки заполняет табличную часть и сообщает об этом пользователю:
&НаКлиенте
Процедура ЗаполнитьПоОстаткам(Команда)
ЗаполнитьПоОстаткамНаСервере();
Сообщить("Табличная часть заполнена");
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПоОстаткамНаСервере()
// здесь запрос к остаткам и заполнение табличной части
КонецПроцедуры
Обратите внимание: имя процедуры должно совпадать с именем команды, иначе кнопка не сработает. Если кнопка нажимается, но ничего не происходит — в первую очередь проверьте, что обработчик существует, не содержит синтаксических ошибок и находится в модуле именно той формы, где размещена кнопка.
&НаКлиенте
Процедура Приветствие(Команда)
ПоказатьПредупреждение(, "Кнопка работает!");
КонецПроцедурыКнопки в командной панели и важные команды
Командная панель формы — это полоса вверху формы, где расположены стандартные кнопки («Записать», «Провести», «Печать»). Свою команду можно перетащить прямо в командную панель, и кнопка появится рядом со стандартными. Для табличных частей у каждой таблицы есть своя командная панель — туда добавляют кнопки, оперирующие строками таблицы.
Чтобы кнопка визуально выделялась, используйте свойство элемента «Важность»: значение «Важное» подсвечивает кнопку, «Обычное» оставляет стандартной, а «Дополнительный» убирает её в меню «Ещё». Также полезно задать картинку кнопки (свойство «Картинка») и сочетание клавиш (свойство «СочетаниеКлавиш» у команды), чтобы опытные пользователи могли вызывать действие с клавиатуры.
Если кнопок много, группируйте их: добавьте в командную панель элемент «Подменю» и перенесите связанные команды внутрь. Это сохраняет форму компактной и снижает риск того, что пользователь случайно нажмёт не ту кнопку.
Программное создание кнопок
Иногда кнопки нужно создавать динамически — например, по кнопке на каждый склад из справочника или на каждый вид операции. В управляемых формах это делается в обработчике ПриСозданииНаСервере: сначала добавляется команда, затем элемент формы, затем назначается общий обработчик.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
НоваяКоманда = Команды.Добавить("КомандаСклад1");
НоваяКоманда.Заголовок = "Склад 1";
НоваяКоманда.Действие = "НажатиеДинамическойКнопки";
НоваяКнопка = Элементы.Добавить("КнопкаСклад1", Тип("КнопкаФормы"), Элементы.КоманднаяПанель);
НоваяКнопка.ИмяКоманды = "КомандаСклад1";
КонецПроцедуры
&НаКлиенте
Процедура НажатиеДинамическойКнопки(Команда)
Сообщить("Нажата: " + Команда.Имя);
КонецПроцедуры
Ключевые моменты: имя команды и имя элемента должны быть уникальными в пределах формы, процедура-обработчик, указанная в свойстве Действие, обязана существовать в модуле формы ещё на этапе компиляции, а динамические элементы пересоздаются при каждой перерисовке формы — поэтому логику создания размещают именно в ПриСозданииНаСервере, а не по событию на клиенте.
Кнопки в обычных формах
В обычных формах (режим обычного приложения) подход другой: кнопка добавляется как самостоятельный элемент диалога через панель инструментов редактора формы. Разместите кнопку на форме мышью, затем в палитре свойств задайте ей имя и надпись.
Действие назначается через событие «Нажатие»: в палитре свойств на вкладке событий нажмите кнопку с лупой — конфигуратор создаст процедуру вида Кнопка1Нажатие(Элемент) в модуле формы. Весь код пишется внутри этой процедуры, разделения на клиент и сервер в обычных формах нет.
Обычные формы встречаются в основном в старых конфигурациях и в режиме совместимости. Если вы ведёте новую разработку, используйте управляемые формы — именно они работают в веб-клиенте и тонком клиенте.
Сравнение подходов
Стандартный способ для постоянных кнопок; наглядно, легко поддерживать, но требует изменения конфигурации или расширения
Подходит, когда набор кнопок зависит от данных; гибко, но сложнее отлаживать и легко получить дубли имён
Единственный безопасный способ для типовых конфигураций на поддержке; требует проверки совместимости после обновлений
Проверка результата и отладка
После добавления кнопки обновите конфигурацию базы данных клавишей F7 и запустите режим предприятия. Откройте нужную форму и проверьте: кнопка видна, заголовок читаем, нажатие вызывает обработчик, а обработчик выполняет задуманное действие без ошибок.
Если обработчик не срабатывает, поставьте точку останова в первой строке процедуры и запустите отладку (F5). Отсутствие остановки означает, что команда не связана с обработчиком или кнопка ссылается на другую команду. Остановка с последующей ошибкой укажет на проблему уже внутри кода.
Проверьте поведение кнопки в граничных ситуациях: при пустой табличной части, у пользователя с ограниченными правами, при незаписанном документе. Частая проблема — кнопка доступна пользователю, у которого нет прав на объекты, к которым обращается обработчик, и вместо результата он получает ошибку нарушения прав доступа.
Как проверить результат
Кнопка отображается в ожидаемом месте с заданным заголовком
Кнопки нет — команда не перетащена в элементы или отключена видимость
Выполняется обработчик, результат виден пользователю
Ничего не происходит — обработчик не связан с командой или содержит ошибку компиляции
Действие выполняется у всех целевых пользователей
Ошибка прав доступа у части пользователей
Часто задаваемые вопросы
Можно ли добавить кнопку в типовую конфигурацию без снятия с поддержки?
Да, через расширение конфигурации. Создайте расширение, заимствуйте в него нужную форму, добавьте команду и кнопку — типовая конфигурация при этом остаётся на поддержке и обновляется штатно.
Почему кнопка видна в конфигураторе, но не отображается у пользователя?
Чаще всего не обновлена конфигурация базы данных (нужно нажать F7) либо у элемента снят флаг «Видимость». Также проверьте функциональные опции: если команде назначена функциональная опция, отключённая в базе, кнопка скрывается автоматически.
Как сделать, чтобы кнопка нажималась сочетанием клавиш?
У команды формы есть свойство «СочетаниеКлавиш». Задайте там нужную комбинацию, например Ctrl+Shift+Z, и команда будет вызываться с клавиатуры независимо от того, где на форме находится кнопка.
Как временно скрыть кнопку, не удаляя её?
Установите свойство «Видимость» элемента кнопки в «Ложь» — в конфигураторе или программно: Элементы.ИмяКнопки.Видимость = Ложь. Чтобы запретить нажатие, но оставить кнопку видимой, используйте свойство «Доступность».
Можно ли одной кнопкой вызывать стандартную команду, например «Провести»?
Да. В списке команд формы перейдите на вкладку «Глобальные команды» или используйте стандартные команды объекта и перетащите нужную (например, «ПровестиИЗакрыть») в дерево элементов — платформа сама создаст кнопку со стандартным поведением.
Почему динамически созданная кнопка выдаёт ошибку «Процедура не обнаружена»?
Процедура, указанная в свойстве Действие команды, должна существовать в модуле формы с точным совпадением имени и быть экспортной по контексту вызова. Проверьте написание имени и то, что процедура не удалена и не переименована после назначения.
Что важно запомнить
Кнопка в 1С — это команда плюс элемент формы: создайте команду, напишите обработчик, перетащите команду на форму. Для типовых конфигураций используйте расширения, для динамических кнопок — Команды.Добавить() и Элементы.Добавить(), а результат всегда проверяйте в режиме предприятия под разными ролями.