Новая кнопка на форме и в командном интерфейсе 1С в Конфигураторе

· 9 мин

Содержание

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

Ниже порядок для управляемых форм платформы 8.3 в Конфигураторе. Для типовых конфигураций (БП, ЗУП, УТ) такие правки делают через расширение, чтобы не снимать конфигурацию с поддержки.

Какую команду выбрать: форма или вся конфигурация

Есть два вида команд, и от выбора зависит, где потом искать кнопку.

Вид командыГде создаётсяГде виднаКогда брать
Команда формыВкладка «Команды» редактора формыТолько на этой формеДействие над данными именно этой формы
Общая командаВетка «Общие → Общие команды» в дереве конфигурацииВ командном интерфейсе разделов, на формах по настройкеДействие нужно во многих местах: отчёт, обработка, переход к списку

Если кнопка работает с текущим документом (заполнить, пересчитать, отправить), берите команду формы. Если нужен вызов обработки из любого раздела или на нескольких формах сразу, берите общую команду.

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

Создаём команду формы

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

В модуле формы появится заготовка:

&НаКлиенте
Процедура ЗаполнитьПоШаблону(Команда)
	// здесь будет код
КонецПроцедуры

В свойствах команды есть ещё «Подсказка» (всплывает при наведении) и «Картинка». Подсказку лучше написать сразу: через полгода никто не вспомнит, что делает кнопка.

Выводим кнопку на форму

Команда без элемента формы не видна. Теперь её нужно разместить.

Самый быстрый способ: перетащите команду из вкладки «Команды» на вкладку «Элементы». Платформа сама создаст кнопку и привяжет её к команде. Второй способ: в дереве элементов выберите нужную группу, нажмите «Добавить» и выберите «Кнопка», затем в свойстве «Имя команды» укажите созданную команду.

Куда ставить кнопку, решает группа:

  • 🔘 Командная панель формы (КоманднаяПанель) — кнопки над документом. Самое привычное место.
  • 📋 Командная панель таблицы — если действие относится к строкам табличной части.
  • 📌 Группа «Подменю» — когда кнопок много и верхняя панель не вмещает их.
  • 🖱 Обычная группа на форме — кнопка в самом поле, рядом с реквизитами.

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

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

Пишем обработчик нажатия

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

Типовая схема. Клиентская процедура собирает нужные данные, вызывает серверную и показывает результат:

&НаКлиенте
Процедура ЗаполнитьПоШаблону(Команда)
	Если Объект.Контрагент.Пустая() Тогда
		ПоказатьПредупреждение(, "Сначала выберите контрагента.");
		Возврат;
	КонецЕсли;
	ЗаполнитьПоШаблонуНаСервере();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьПоШаблонуНаСервере()
	ДокументОбъект = РеквизитФормыВЗначение("Объект");
	ДокументОбъект.Товары.Очистить();
	// заполнение строк
	ЗначениеВРеквизитФормы(ДокументОбъект, "Объект");
КонецПроцедуры

Здесь РеквизитФормыВЗначение превращает данные формы в объект, а ЗначениеВРеквизитФормы возвращает изменения обратно. Если пропустить обратную передачу, на форме ничего не изменится.

Обращение к базе из клиентской процедуры недопустимо. Запрос, чтение справочника по ссылке и запись объекта идут только на сервере.

Если нужно показать вопрос перед действием, используйте оповещение: клиентская процедура вызывает ПоказатьВопрос с описанием оповещения, а продолжение идёт в отдельной процедуре. Прямой ждущей функции в управляемой форме нет, поэтому код делят на две части.

Параметры команды и контекст выполнения

У команды формы контекст понятен: это сама форма и её данные. У общей команды данные приходят через два механизма.

Параметр команды. В свойстве «Тип параметра команды» общей команды перечисляют типы, с которыми она работает, например ДокументСсылка.РеализацияТоваровУслуг. Тогда кнопка появляется на формах объектов этого типа и в списках. Что именно выбрано в списке, придёт в обработчик.

Параметры выполнения команды. Обработчик общей команды находится в модуле команды и выглядит так:

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

ПараметрКоманды содержит ссылку или массив ссылок из того места, где нажали кнопку. ПараметрыВыполненияКоманды.Источник — форма, с которой вызвали команду.

Если у общей команды параметр не задан, она ни от чего не зависит и просто появляется в командном интерфейсе раздела. Так делают кнопки открытия отчётов и обработок.

Где ещё кнопка может появиться

Общую команду в дереве конфигурации привязывают к командному интерфейсу двумя способами.

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

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

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

Права и видимость кнопки

Кнопка видна не всем, и причин у этого несколько.

Права роли. Для общей команды на вкладке «Права» роли отдельным правом «Просмотр» разрешается показ. Без него команда пользователю недоступна, даже если все остальное настроено верно.

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

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

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

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

Как не править типовую конфигурацию

В типовой конфигурации на поддержке прямое изменение формы тянет за собой сложности при каждом обновлении. Надёжнее расширение:

  1. В Конфигураторе откройте меню «Конфигурация → Расширения конфигурации » и создайте новое расширение.
  2. Добавьте в расширение нужный объект как заимствованный (контекстное меню «Добавить в расширение»).
  3. Откройте заимствованную форму, создайте команду и кнопку так же, как описано выше.
  4. Обновите конфигурацию базы данных (F7 или «Конфигурация → Обновить конфигурацию БД»).

Это лучше, чем перенос правок вручную после каждого релиза. Расширения доступны начиная с платформы 8.3.6.

Значок, подсказка и порядок кнопок

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

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

Две практические привычки:

  • Заголовок кнопки начинайте с глагола: «Заполнить», «Проверить», «Выгрузить». По такому тексту понятно, что произойдёт.
  • Опасные действия (удаление, массовая обработка) выносите в подменю и добавляйте вопрос перед выполнением, чтобы случайный клик не испортил данные.

Кнопка для выделенных строк

Частая задача: действие над несколькими строками списка или табличной части. Для списка достаточно общей команды с параметром команды, тогда в ПараметрКоманды придёт массив выделенных ссылок. Для табличной части обработчик на клиенте читает выделение сам:

&НаКлиенте
Процедура ОтметитьСтроки(Команда)
	ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
	Если ВыделенныеСтроки.Количество() = 0 Тогда
		ПоказатьПредупреждение(, "Выделите хотя бы одну строку.");
		Возврат;
	КонецЕсли;
	Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл
		СтрокаТЧ = Объект.Товары.НайтиПоИдентификатору(ИдентификаторСтроки);
		СтрокаТЧ.Отмечено = Истина;
	КонецЦикла;
КонецПроцедуры

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

Если кнопка не заработала

Типичные случаи, которые не относятся к правам и видимости:

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

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

Проверка и отладка новой кнопки

Запустите «Отладка → Начать отладку» (F5). Платформа предложит обновить базу : согласитесь. В Конфигураторе откройте обработчик и поставьте точку останова F9 на первой строке. Нажмите кнопку в 1С — управление перейдёт в отладчик.

В отладчике удобны F11 (шаг с заходом) и F10 (шаг без захода). Значения смотрите через окно «Вычислить выражение» (Shift+F9).

Если кнопки нет, проверьте по порядку:

  • 🔍 Создан ли элемент формы, привязанный к команде (одной команды мало).
  • 🔐 Есть ли у роли пользователя право на команду или объект.
  • 🔄 Обновлена ли конфигурация базы данных после правки расширения.
  • 🔇 Не выключена ли функциональная опция команды.
  • 🧭 Входит ли форма в тот вариант интерфейса, который открыт у пользователя.

Если кнопка есть, а нажатие ничего не меняет, ищите, что именно возвращает серверная процедура: частая причина в отсутствии вызова ЗначениеВРеквизитФормы.

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

Можно ли добавить кнопку в обычное приложение, не в управляемое?
В обычной форме кнопку берут из панели элементов и в свойстве «Действие» назначают процедуру на событие нажатия. Отдельной команды там нет, поэтому схема проще, но обычные формы остались в старых конфигурациях. В актуальных работают управляемые.
Почему кнопка есть в Конфигураторе, но не видна в программе?
Чаще всего у пользователя нет права на объект или функциональная опция выключена. Проверьте роль, затем состав подсистемы.
Чем кнопка отличается от команды?
Команда описывает действие и его обработчик, кнопка — это элемент формы, который запускает команду. Одну команду можно вывести несколькими кнопками.
Как сделать так, чтобы кнопка появилась в списке документов, а не в самом документе?
Добавьте команду в форму списка, в командную панель списка, или создайте общую команду с типом параметра, равным ссылке на этот документ.
Нужно ли перезапускать сеанс после изменений?
Да, пользователям нужно закрыть и заново открыть программу, чтобы получить обновлённую конфигурацию. При работе в клиент-серверном варианте сначала обновите конфигурацию БД.