Кнопки в 1С 8.3: конструктор формы и программный способ

· 9 мин

Содержание

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

Ниже — как создать кнопку в 1С на управляемой форме (интерфейс «Такси»): привязать команду, разнести код по клиенту и серверу, добавить кнопку в табличную часть и в список, управлять её видимостью из кода. Статья рассчитана на управляемые формы платформы 8.3; в обычных формах версии 8.2 механизм другой.

Команда и элемент: из чего состоит кнопка

В управляемой форме кнопка — это два разных объекта:

  • 🔹 Команда — описывает действие. У неё есть обработчик (процедура) и заголовок.
  • 🔹 Элемент «Кнопка» — то, что видит пользователь. Он ссылается на команду через свойство ИмяКоманды.

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

Отсюда два подхода к созданию:

СпособКогда подходитЧто нужно
Конструктор формыФорма ваша или в расширении, состав кнопок постоянныйКонфигуратор, право на изменение
ПрограммноНабор кнопок зависит от данных, прав, настроекКод в модуле формы на сервере
«Изменить форму» у пользователяНужна готовая стандартная команда, кода нетРежим «1С:Предприятие», без конфигуратора

Третий вариант — для тех, у кого нет доступа к конфигуратору. В типовой форме через меню Ещё → Изменить форму… можно вытащить на панель уже существующие стандартные команды (например, печать или проведение), но свою процедуру так не напишешь.

Кроме команд формы, которые вы пишете сами, есть ещё два источника:

  • 🔹 Стандартные команды — платформа формирует их автоматически для реквизитов и объекта формы (открыть, создать, пометить на удаление и т. п.). Их не нужно программировать, достаточно привязать кнопку.
  • 🔹 Глобальные команды — общие команды конфигурации, доступные из любой формы.

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

Конструктор формы или код?

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

Самый частый сценарий для новичка. Откройте форму в конфигураторе двойным щелчком по ней в дереве объекта (формы лежат в ветке Формы справочника, документа или обработки).

Создаём команду:

  1. В редакторе формы перейдите на закладку «Команды» → группа «Команды формы».
  2. Нажмите кнопку добавления команды и задайте ей имя, например РассчитатьИтог.
  3. В палитре свойств команды найдите свойство «Действие» и нажмите на лупу справа.
  4. В появившемся окне выберите, где выполнять процедуру — на клиенте или на сервере, — и подтвердите. Платформа создаст заготовку обработчика в модуле формы.

Теперь кнопку нужно показать на форме:

  1. Перейдите на закладку «Элементы».
  2. Перетащите созданную команду из списка команд прямо в дерево элементов — платформа сама создаст элемент «Кнопка», уже привязанный к команде.
  3. Либо добавьте пустой элемент типа «Кнопка» вручную и в его свойстве ИмяКоманды выберите нужную команду из списка.

Перетаскивание команды в дерево элементов — самый быстрый способ: имя команды подставляется автоматически, и кнопка сразу рабочая.

В обработчике останется написать логику. Заготовка выглядит так:

&НаКлиенте
Процедура РассчитатьИтог(Команда)
    Объект.СуммаИтог = Объект.Количество * Объект.Цена;
КонецПроцедуры

Запустите 1С:Предприятие, откройте форму — кнопка «Рассчитать итог» уже на месте и реагирует на нажатие.

Клиент и сервер: где выполняется обработчик

Это та развилка, на которой спотыкаются чаще всего. В управляемом приложении код формы делится на клиентский (&НаКлиенте) и серверный (&НаСервере).

  • Нажатие кнопки всегда приходит на клиент. Поэтому сама процедура-обработчик команды должна быть &НаКлиенте.
  • Работа с базой — запросы, чтение и запись объектов — возможна только на сервере.

Если по кнопке нужно обратиться к базе, вызовите из клиентской процедуры серверную:

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

&НаСервере
Процедура ЗаполнитьОстаткиНаСервере()
    Запрос = Новый Запрос;
    // ... текст запроса и заполнение данных формы
КонецПроцедуры

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

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

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

Схема та же: сначала команда, потом элемент.

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

    Команда = Команды.Добавить("Обновить");
    Команда.Действие = "Обновить_Обработка";
    Команда.Заголовок = "Обновить данные";

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

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

&НаКлиенте
Процедура Обновить_Обработка(Команда)
    Сообщить("Данные обновлены");
КонецПроцедуры

Разберём по шагам:

  1. Команды.Добавить("Обновить") — создаёт команду формы.
  2. Команда.Действие = "Обновить_Обработка" — связывает её с клиентской процедурой по имени. Процедура должна существовать в модуле формы и быть &НаКлиенте.
  3. Элементы.Добавить(Имя, Тип("КнопкаФормы")) — добавляет видимый элемент. Третьим параметром можно передать родителя — группу или командную панель; без него кнопка встанет в теле формы.
  4. Кнопка.ИмяКоманды — привязывает элемент к команде.

Если код создания кнопки разместить в клиентской процедуре, элемент не появится: коллекции Элементы и Команды меняются исключительно в серверном контексте.

Чтобы положить кнопку в конкретную группу или на командную панель, сначала получите нужный элемент-родитель и передайте его третьим аргументом метода Добавить.

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

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

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

Обработчик такой кнопки работает с текущей строкой:

&НаКлиенте
Процедура ТоварыЗаполнитьЦену(Команда)
    ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
    Если ТекущаяСтрока = Неопределено Тогда
        Возврат;
    КонецЕсли;
    ТекущаяСтрока.Цена = 0;
КонецПроцедуры

Несколько важных моментов:

  • 🔹 ТекущиеДанные возвращает Неопределено, если ни одна строка не выделена, — проверку стоит ставить всегда.
  • 🔹 Для динамического списка строка — это ссылка на объект базы; менять его напрямую через ТекущиеДанные нельзя, нужно открывать объект на запись.
  • 🔹 Программно кнопка в панель таблицы добавляется так же, как обычная, но родителем указывают командную панель этой таблицы.

Динамическое поведение: видимость, доступность, заголовок

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

  • Видимость — показывать кнопку или нет.
  • Доступность — активна она или «серая».
  • Заголовок — текст на кнопке.

Эти свойства элемента можно менять прямо на клиенте, серверный контекст не требуется:

&НаКлиенте
Процедура ПриИзмененииСтатуса()
    Элементы.КнопкаЗакрыть.Доступность = (Объект.Статус = "Открыт");
    Элементы.КнопкаЗакрыть.Видимость   = НЕ Объект.Проведен;
КонецПроцедуры

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

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

Не прячьте кнопку совсем, если действие временно недоступно по понятной причине. Лучше оставить её видимой, но недоступной (Доступность = Ложь) — пользователю понятнее, чем исчезнувший элемент.

Внешний вид и размещение кнопки

Несколько свойств, которые делают кнопку аккуратной и заметной:

СвойствоЗа что отвечает
ЗаголовокТекст на кнопке
КартинкаКнопкиЗначок из библиотеки картинок платформы
ОтображениеТекст, картинка или и то и другое
ПодсказкаВсплывающая подсказка при наведении
ОтображатьВсегдаНе прятать кнопку под меню «Ещё»

Про размещение по опыту:

  • Частые и важные действия выносите в командную панель формы и ставьте им ОтображатьВсегда = Истина, иначе на узком экране они спрячутся под «Ещё».
  • Группируйте родственные кнопки в обычные группы — так командная панель не превращается в сплошную ленту.
  • Для действий, которые работают со строкой, кнопка должна жить в панели таблицы, а не формы, — иначе непонятно, к чему она относится.
  • Длинный текст заменяйте значком с подсказкой: панель остаётся компактной.

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

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

Почему кнопка не работает: что проверить

Если кнопка не появилась или не реагирует, разберите по симптому. Почти всегда причина — в одном из пяти мест.

Диагностика: выберите симптом

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

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

Можно ли добавить кнопку без конфигуратора?
Свою кнопку с кодом — нет. Но пользователь с правами может через Ещё → Изменить форму… вынести на панель уже готовую стандартную команду.
Чем команда отличается от кнопки?
Команда — это действие и его обработчик. Кнопка — видимый элемент, который на эту команду ссылается через свойство ИмяКоманды. Одну команду могут показывать несколько кнопок.
Почему обработчик нельзя делать серверным?
Нажатие приходит на клиент, поэтому процедура команды должна быть &НаКлиенте. Обращение к базе из неё выносят в серверную процедуру, которую клиент и вызывает.
Как сделать кнопку видимой по условию?
Меняйте свойство Видимость элемента из кода — при открытии формы и в обработчике изменения поля, от которого зависит условие. Делать это можно на клиенте.
Куда поставить кнопку, которая работает со строкой таблицы?
В командную панель самой таблицы. В обработчике берите строку через Элементы.ИмяТаблицы.ТекущиеДанные и проверяйте её на Неопределено.