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

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

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

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

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

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

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

Где создаётся кнопка: конфигуратор и режим разработки

Вся работа с кнопками ведётся в конфигураторе 1С:Предприятие. Откройте конфигурацию для изменения (меню «Конфигурация» → «Открыть конфигурацию»), найдите нужный объект — документ, справочник или обработку — и откройте его основную форму двойным щелчком. Перед вами появится редактор формы с двумя ключевыми областями: деревом элементов формы слева и вкладками «Модуль» и «Команды».

Если конфигурация типовая и стоит на полной поддержке, прямое изменение формы приведёт к снятию объекта с поддержки и усложнит обновления. В этом случае правильный путь — создать расширение конфигурации (меню «Конфигурация» → «Расширения конфигурации»), добавить в него заимствованную форму и программировать кнопку уже там.

Создание команды и размещение кнопки на форме

В редакторе формы перейдите на вкладку «Команды» и откройте подвкладку «Команды формы». Нажмите кнопку «Добавить» и задайте имя команды, например ЗаполнитьПоОстаткам. В свойствах команды можно указать заголовок (текст на кнопке), картинку, подсказку и сочетание клавиш. Свойство «Действие» пока оставьте пустым — обработчик добавим на следующем шаге.

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

Альтернативный путь — стандартные команды объекта. У формы документа уже есть команды «Провести», «Записать», «Печать»; их не нужно создавать, достаточно перетащить из вкладки «Стандартные команды» в нужное место дерева элементов. Программировать их обработчики не требуется — действие встроено в платформу.

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

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

Обработчик — это процедура в модуле формы, которая выполняется при нажатии кнопки. Чтобы платформа создала её заготовку автоматически, в свойствах команды щёлкните по значку лупы рядом с полем «Действие». Появится диалог выбора расположения кода: «На клиенте», «На сервере» или «На клиенте и сервере». Для первого варианта выберите «На клиенте» — это самый частый случай.

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

&НаКлиенте

Процедура ЗаполнитьПоОстаткам(Команда)

ПоказатьПредупреждение(, "Кнопка нажата, начинаем заполнение");

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

Имя процедуры совпадает с именем команды, параметр Команда содержит ссылку на объект команды формы. Внутри обработчика доступны все реквизиты формы: например, для формы документа данные объекта доступны через Объект.Номенклатура, Объект.Товары и так далее.

Клиентский и серверный код: что выбрать

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

Типовой шаблон «клиент вызывает сервер» выглядит так:

&НаКлиенте

Процедура ЗаполнитьПоОстаткам(Команда)

ЗаполнитьПоОстаткамНаСервере();

Элементы.Товары.Обновить();

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

&НаСервере

Процедура ЗаполнитьПоОстаткамНаСервере()

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Остатки.Номенклатура КАК Номенклатура,

| Остатки.КоличествоОстаток КАК Количество

|ИЗ

| РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки";

Объект.Товары.Загрузить(Запрос.Выполнить().Выгрузить());

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

Программное создание кнопки без редактора формы

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

&НаСервере

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

НоваяКоманда = Команды.Добавить("ПроверитьДанные");

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

НоваяКоманда.Действие = "ПроверитьДанныеНажатие";

НоваяКнопка = Элементы.Добавить("КнопкаПроверитьДанные", Тип("КнопкаФормы"), Элементы.КоманднаяПанель);

НоваяКнопка.ИмяКоманды = "ПроверитьДанные";

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

&НаКлиенте

Процедура ПроверитьДанныеНажатие(Команда)

ПоказатьОповещениеПользователя("Проверка выполнена");

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

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

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

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

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

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

Кнопка отображается на форме в режиме предприятия
Норма

Кнопка видна в ожидаемом месте, заголовок читается

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

Кнопки нет — проверьте родительский элемент и видимость

Нажатие выполняет код
Норма

Срабатывает точка останова в обработчике, выполняется действие

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

Ничего не происходит — не назначено действие команды

Данные объекта меняются корректно
Норма

Табличная часть заполняется, документ записывается без ошибок

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

Ошибка в журнале регистрации или пустой результат запроса

Кнопка в расширении или прямое изменение: как выбрать

Сравнение подходов

Изменение формы в конфигураторе

Подходит для собственных конфигураций и снятых с поддержки. Полный контроль, но усложняет обновление типовых решений

Расширение с заимствованием формы

Сохраняет поддержку типовой конфигурации. Ограничение: форма фиксируется, изменения поставщика в ней не подтянутся автоматически

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

Минимальная связь с типовой формой, устойчиво к обновлениям. Требует аккуратности: родительский элемент может быть переименован поставщиком

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

Итог

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

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

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

Почему кнопка нажимается, но код не выполняется?

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

Как сделать кнопку недоступной по условию?

Управляйте свойством Элементы.ИмяКнопки.Доступность в коде формы, например в обработчике ПриОткрытии или при изменении ключевого реквизита. Для более тонкой настройки используйте условное оформление формы либо функциональные опции, если кнопка должна скрываться целиком по настройке системы.

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

Нет, создание команд и элементов формы возможно только в конфигураторе или через расширение. В режиме предприятия администратор может лишь изменить видимость существующих элементов через «Изменить форму», но запрограммировать новое действие так нельзя.

Чем отличается кнопка командной панели от кнопки в форме?

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

Как вызвать из кнопки длительную операцию, чтобы форма не зависала?

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

Работает ли код кнопки в веб-клиенте?

Базовые обработчики работают, но есть ограничения: в веб-клиенте недоступны некоторые операции с файловой системой и COM-объектами, а модальные вызовы требуют асинхронного стиля (ПоказатьВопрос, НачатьПомещениеФайла). Проверяйте обработчик во всех клиентах, которые используются в вашей организации.