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