Кнопка редактирования в управляемой форме 1С: от команды до прав

· 9 мин

Содержание

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

Ниже рассматривается платформа 8.3 с интерфейсом «Такси» и управляемые формы. Если у вас типовая конфигурация на поддержке, сначала включите возможность изменения или лучше вынесите доработку в расширение: так обновления не затрут вашу кнопку.

Что подготовить до начала

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

  • 📝 открыть форму элемента из формы списка (аналог стандартной команды «Изменить»);
  • 🔓 снять режим «только просмотр» с формы, которая открыта для чтения;
  • 🧩 открыть произвольную обработку или форму с данными выделенной строки.

От выбора зависит код обработчика. Сама схема добавления кнопки одинакова для всех трёх случаев.

Перед правкой проверьте три вещи:

  1. База открыта в конфигураторе, а не в режиме «1С:Предприятие».
  2. Объект, форму которого вы правите, не заблокирован от изменений поддержкой.
  3. У вас есть копия конфигурации или хранилище, откуда можно откатиться.

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

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

Откройте нужный объект в дереве конфигурации, например справочник, и найдите его форму: ветка «Формы» внутри объекта. Двойной щелчок откроет редактор формы.

В редакторе есть несколько вкладок. Нас интересуют две: «Элементы» (то, что видит пользователь) и «Команды» (то, что умеет форма).

Порядок действий:

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

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

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

Если команду нужно запускать из разных форм, не плодите копии. Создайте общую команду в ветке «Общие → Общие команды» и укажите тип параметра. Тогда одна кнопка появится везде, где есть объект этого типа.

Размещение кнопки в командной панели

Команда пока видна только на вкладке «Команды». Чтобы появилась кнопка, команду нужно поместить в элемент формы.

Перейдите на вкладку «Элементы». Если у формы нет командной панели, её создаёт платформа автоматически при включении свойства «Автоматическое заполнение». Для формы списка есть два места:

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

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

Полезные свойства кнопки:

  • Вид — обычная кнопка, гиперссылка или кнопка командной панели;
  • Отображение — только картинка, только текст или оба;
  • Только в меню «Все действия» — убирает кнопку с панели, оставляя в выпадающем меню;
  • Расположение в группе — с каким соседом она будет стоять.

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

Что должен делать обработчик

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

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

Здесь Список — имя таблицы формы на вкладке «Элементы». Если у вас оно другое, замените. Метод ПоказатьЗначение открывает форму объекта по ссылке. Для других задач годится ОткрытьФорму с явным указанием формы и параметра Ключ:

ПараметрыФормы = Новый Структура("Ключ", ТекущиеДанные.Ссылка);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);

Имя формы в первой строке подставьте своё: тип объекта и название формы берите из дерева конфигурации.

Когда нужно снять «только просмотр»

Вторая типичная задача: форма открывается нередактируемой, а пользователю нужна кнопка «Редактировать», которая разрешает ввод. Тут пригодится свойство формы ТолькоПросмотр:

&НаКлиенте
Процедура Редактировать(Команда)
	ЭтотОбъект.ТолькоПросмотр = Ложь;
	Элементы.Редактировать.Доступность = Ложь;
КонецПроцедуры

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

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

Какой способ выбрать

Прежде чем писать код, сверьтесь с таблицей. Часто задача решается проще, чем кажется.

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

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

Порядок работы, который экономит время

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

Видимость и доступность кнопки по условию

Часто кнопка нужна не всем и не всегда. Например, редактировать можно только документ в определённом состоянии. Для этого используют два свойства элемента: Видимость (показывать или нет) и Доступность (нажимается или серая).

Управление выносят в серверную процедуру, которая срабатывает при открытии формы:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Элементы.Редактировать.Видимость = Не Объект.ПометкаУдаления;
КонецПроцедуры

Для динамической реакции на выбор строки добавьте обработчик события таблицы «ПриАктивизацииСтроки» и переключайте Доступность там. Не вешайте тяжёлые вычисления на это событие, оно срабатывает при каждом перемещении курсора.

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

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

Права доступа и роли

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

Ключевые права находятся в ветке «Роли» конфигурации, на закладке «Права» для объекта:

  • Просмотр — видеть данные;
  • Редактирование — менять существующие объекты;
  • Добавление — создавать новые;
  • Интерактивное добавление, интерактивное изменение — то же, но только из интерфейса (не из кода).

Чтобы показать кнопку только тем, у кого есть нужное право, проверьте его в серверном коде при открытии формы:

Элементы.Редактировать.Видимость = ПравоДоступа("Редактирование", Метаданные.Справочники.Контрагенты);

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

После правки ролей перезапустите сеанс. Права кешируются на время работы пользователя в системе.

Проверка и отладка

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

Минимальный набор проверок:

  1. Кнопка есть на нужной форме и в нужном месте.
  2. При невыбранной строке выдаётся понятное сообщение, а не ошибка.
  3. С правом на изменение объект открывается и сохраняется.
  4. Без права кнопка скрыта или действие корректно отклоняется.
  5. После записи форма ведёт себя так, как вы задумали (закрывается или остаётся).

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

Ошибки выполнения серверных процедур попадают в журнал регистрации с текстом и пользователем.

Если кнопка не появилась или не работает

Разберём симптомы, которые встречаются чаще всего.

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

Ещё одна ловушка: серверная процедура пытается открыть форму. Открывать формы можно только на клиенте, поэтому обработчик, вызывающий ОткрытьФорму или ПоказатьЗначение, должен иметь директиву &НаКлиенте.

Как не потерять доработку при обновлении

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

Практичная схема:

  • для новых кнопок и команд используйте расширение конфигурации (с версии платформы 8.3.6);
  • код расширения грузится отдельным файлом .cfe, затем отдельным шагом применяется обновление конфигурации базы данных;
  • в расширении можно перехватывать процедуры формы и добавлять элементы, не трогая типовой код.

Так кнопка переживёт и плановые релизы конфигурации.

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

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