Новая кнопка «Изменить» в форме 1С: команда, обработчик, права
Содержание
Пользователь открывает список договоров и просит: «Нужна кнопка, которая сразу открывает выделенный договор на правку и не даёт случайно щёлкнуть мышью по строке». Или наоборот: форма элемента открывается только для просмотра, а кнопка «Разрешить редактирование» нужна всем. Обе задачи решаются одинаково: в управляемой форме создаётся команда, она выводится на форму кнопкой, а в модуле формы пишется обработчик.
Чтобы добавить кнопку редактирования в 1С, откройте нужную форму в конфигураторе, на вкладке «Команды» создайте команду, перетащите её в командную панель на вкладке «Элементы» и напишите процедуру в поле «Действие». Дальше — подробно, с кодом и подводными камнями. Описание для 8.3 с управляемыми формами и интерфейсом «Такси».
Что решить до начала доработки
Сначала ответьте на три вопроса. От них зависит, как вы будете менять форму.
- Конфигурация типовая или своя? Типовую (БП, ЗУП, УТ) на поддержке лучше не править напрямую. Правка форм вручную снимает объект с поддержки, а каждое обновление превращается в ручное слияние. Выход — расширение конфигурации (появилось в платформе 8.3.6): форму расширяют, а не меняют.
- Какая форма? Форма списка, форма элемента (объекта) или форма документа. У каждой свой механизм «редактирования», об этом ниже.
- Что значит «редактирование»? Открыть выделенную строку на правку, снять режим «только просмотр» или запустить свой сценарий (например, групповое изменение реквизита).
Что понадобится:
- 🔧 Конфигуратор, запущенный от пользователя с полными правами;
- 💾 копия базы: правки конфигурации делают на копии, не в рабочей базе;
- 🧩 для типовой конфигурации — расширение:
Конфигурация → Расширения конфигурации; - 👤 тестовый пользователь с ограниченной ролью — проверять кнопку только под администратором нельзя.
Не правьте типовую форму в рабочей базе. Сделайте копию, проверьте доработку, потом переносите.
Как создать команду и вывести её кнопкой на форму
В управляемой форме кнопка всегда связана с командой. Нельзя положить на форму «просто кнопку» и написать код у неё в свойствах: сначала команда, потом элемент, который её запускает.
Создание команды
- В конфигураторе в дереве конфигурации найдите объект (например, справочник «Контрагенты») и откройте нужную форму двойным щелчком.
- В редакторе формы перейдите на вкладку «Команды» (рядом с «Элементы» и «Реквизиты»).
- Нажмите «Добавить», задайте имя команды, например
РедактироватьВыделенное. - В свойстве «Заголовок» напишите то, что увидит пользователь: «Изменить».
- Откройте свойство «Действие» и нажмите кнопку лупы. Платформа создаст в модуле формы пустую процедуру обработчика.
Имя команды — без пробелов, на русском, но в имени лучше сразу отразить смысл: так проще искать в модуле.
Размещение на форме
Перейдите на вкладку «Элементы». Перетащите команду из списка команд в нужное место: в командную панель формы, в панель таблицы или в группу «Больше действий». Платформа создаст кнопку, привязанную к команде.
Что можно настроить в свойствах кнопки:
| Свойство | Для чего |
|---|---|
| Заголовок | Текст на кнопке |
| Картинка | Значок из библиотеки картинок; удобно для узкой панели |
| Отображение | Только картинка, только текст или картинка с текстом |
| Расположение в командной панели | Основная часть или дополнительные команды |
| Быстрая клавиша | Сочетание клавиш для запуска |
💡 Одна команда может стоять на форме в нескольких местах: например, на панели таблицы и в контекстном меню. Обработчик при этом общий.
Обработчик: что происходит после нажатия
Процедура обработчика получает один параметр — Команда. Исполняется она на клиенте, поэтому над ней стоит директива &НаКлиенте. Всё, что требует обращения к базе, выносится в серверную процедуру.
Простейший вариант для формы списка — открыть выделенный элемент на правку:
&НаКлиенте
Процедура РедактироватьВыделенное(Команда)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
ПоказатьПредупреждение(, "Выделите строку в списке.");
Возврат;
КонецЕсли;
ПоказатьЗначение(, ТекущиеДанные.Ссылка);
КонецПроцедуры
Что здесь важно:
Элементы.Список.ТекущиеДанные— строка, на которой стоит курсор. Если список пуст или курсор не стоит ни на одной строке, вернётсяНеопределено. Проверка обязательна, иначе получите ошибку при обращении кСсылка.ПоказатьЗначениеоткрывает форму объекта по ссылке. Какая именно форма откроется, определяет свойство «Основная форма объекта» в метаданных.- Если нужна конкретная форма, используйте
ОткрытьФормус параметромКлюч:
&НаКлиенте
Процедура РедактироватьВыделенное(Команда)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура("Ключ", ТекущиеДанные.Ссылка);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы, ЭтотОбъект);
КонецПроцедуры
Для документов вместо ФормаОбъекта в пути стоит ФормаДокумента.
Клиент или сервер
Частая ошибка новичка — пытаться записать объект прямо в клиентской процедуре. Так не получится: чтение и запись данных идут на сервере. Схема такая:
&НаКлиенте
Процедура ОтметитьПроверенным(Команда)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ОтметитьПровереннымНаСервере(ТекущиеДанные.Ссылка);
Элементы.Список.Обновить();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ОтметитьПровереннымНаСервере(Ссылка)
Объект = Ссылка.ПолучитьОбъект();
Объект.Комментарий = "Проверено";
Объект.Записать();
КонецПроцедуры
&НаСервереБезКонтекста не передаёт на сервер всю форму, поэтому вызов быстрее. Если серверной процедуре нужны реквизиты формы, используйте &НаСервере.
Если объект блокируется другим пользователем или не проходит проверку заполнения, Записать() вызовет исключение. Для кнопок, которые меняют данные, оберните запись в Попытка … Исключение и покажите пользователю понятное сообщение.
Видимость и доступность: когда кнопку скрыть, а когда затемнить
У любого элемента формы два свойства, которыми управляют из кода:
Видимость— кнопки нет на форме вообще;Доступность— кнопка видна, но серая и не нажимается.
Выбирайте по смыслу. Если действие недоступно всегда и пользователю о нём знать не нужно, скрывайте. Если оно станет доступным при выполнении условия (выбрана строка, документ не проведён), лучше затемнить: пользователь видит, что функция есть, и догадывается, чего не хватает.
Поменять свойства можно в двух местах:
- в конфигураторе, в палитре свойств элемента — «статическое» значение;
- в коде — динамически, обычно в
ПриСозданииНаСервереили в обработчике события формы.
Пример: кнопка активна, только если в списке есть выделенная строка. Для этого подключите обработчик события таблицы ПриАктивизацииСтроки:
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
Элементы.ФормаРедактироватьВыделенное.Доступность =
(Элементы.Список.ТекущиеДанные <> Неопределено);
КонецПроцедуры
Имя элемента кнопки (ФормаРедактироватьВыделенное) берите из дерева элементов формы: платформа добавляет префикс Форма, когда кнопка стоит в командной панели формы. Если кнопка в панели таблицы, имя будет другое — посмотрите в конфигураторе.
💡 Для быстрой проверки условия на клиенте используйте свойство элемента, а не обращение к серверу: серверный вызов на каждое движение курсора заметно тормозит список.
Список и объект: «редактирование» в двух формах
Слово «редактирование» означает разное в зависимости от формы.
| Форма | Что делает кнопка | Как реализовать |
|---|---|---|
| Список | Открывает выделенный элемент на правку | ПоказатьЗначение или ОткрытьФорму с ключом |
| Список | Меняет значение в выделенных строках | Серверная процедура, перебор Элементы.Список.ВыделенныеСтроки |
| Элемент / документ | Снимает режим «только просмотр» | ЭтотОбъект.ТолькоПросмотр = Ложь |
| Элемент / документ | Включает редактирование отдельного поля | Свойство ТолькоПросмотр у элемента формы |
Кнопка в форме списка: несколько выделенных строк
Если пользователь выделил десять договоров и хочет проставить в них одну дату, нужен перебор:
&НаКлиенте
Процедура УстановитьДату(Команда)
Выделенные = Элементы.Список.ВыделенныеСтроки;
Если Выделенные.Количество() = 0 Тогда
Возврат;
КонецЕсли;
УстановитьДатуНаСервере(Выделенные);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьДатуНаСервере(Выделенные)
Для Каждого Ссылка Из Выделенные Цикл
Объект = Ссылка.ПолучитьОбъект();
Объект.Дата = ТекущаяДатаСеанса();
Объект.Записать();
КонецЦикла;
КонецПроцедуры
Группы справочника в ВыделенныеСтроки тоже попадают. Если нужно менять только элементы, проверьте тип строки или отбор списка.
Кнопка в форме объекта: «Разрешить редактирование»
Многие формы открываются только для просмотра, чтобы пользователь случайно не изменил реквизит. Кнопка снятия блокировки записывается просто:
&НаКлиенте
Процедура РазрешитьРедактирование(Команда)
ЭтотОбъект.ТолькоПросмотр = Ложь;
Элементы.ФормаРазрешитьРедактирование.Видимость = Ложь;
КонецПроцедуры
Если защита нужна только для отдельных полей, управляйте свойством ТолькоПросмотр у элемента формы, а не у всей формы. Тогда остальные поля продолжат работать как обычно.
Свойство ТолькоПросмотр — защита интерфейса, а не безопасности. Кто получил право на изменение данных, обойдёт её через другую форму или обработку. Настоящее ограничение делается ролями.
Права доступа: кто увидит и нажмёт кнопку
Показать кнопку всем, а запретить действие в коде — плохая практика: пользователь жмёт, получает сообщение об отсутствии прав и звонит администратору. Лучше проверять право заранее и прятать кнопку.
В управляемой форме проверку делают при создании формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЕстьПраво = ПравоДоступа("Изменение", Метаданные.Справочники.Контрагенты);
Элементы.ФормаРедактироватьВыделенное.Видимость = ЕстьПраво;
КонецПроцедуры
Параметры ПравоДоступа: имя права ("Изменение", "Добавление", "Удаление", "Просмотр") и объект метаданных. Функция возвращает Истина, если текущему пользователю право выдано в какой-либо из его ролей.
Есть и второй способ — настроить видимость на уровне ролей, без кода. Для команд есть собственное право просмотра: в роли можно отметить, какие команды форм пользователю доступны. Этот способ удобен, когда доступ к кнопке должен меняться администратором без участия программиста.
Порядок такой:
- Откройте нужную роль в дереве конфигурации:
Общие → Роли. - Найдите объект метаданных, к которому относится форма.
- Проверьте права
ИзменениеиПросмотр. Без права на изменение кнопка «Изменить» бессмысленна. - Назначьте роль тестовому пользователю в списке пользователей: в конфигураторе это
Администрирование → Пользователи.
Если вы работаете с типовой конфигурацией, роли в ней защищены поддержкой. Добавляйте свои роли в расширении, а не меняйте типовые.
Проверка и отладка
После правки запустите 1С:Предприятие из конфигуратора (клавиша F5) или через меню Отладка → Начать отладку. Платформа сама обновит конфигурацию базы.
Что проверить, прежде чем отдавать доработку:
- 🟢 кнопка видна на нужной форме и в нужном месте;
- 🟢 при пустом списке нажатие не вызывает ошибку;
- 🟢 под пользователем с ролью «только чтение» кнопки нет или она не работает ;
- 🟢 после изменения данных список обновляется;
- 🟢 запись работает при блокировке объекта другим сеансом.
Отладка
Поставьте точку останова в первой строке обработчика: щёлкните в левом поле модуля или нажмите F9. Запустите отладку и нажмите кнопку. Выполнение остановится на этой строке.
Что смотреть:
- окно «Локальные переменные» — значения
ТекущиеДанныеиСсылка; - вычисление выражений (
Shift+F9) — удобно проверитьЭлементы.Список.ТекущиеДанныепо месту; - переход между клиентской и серверной процедурой: отладчик останавливается в обеих, если точка стоит и там, и там.
Для расширений есть особенность: в отладке видно код расширения только если оно подключено к проверяемой базе и не отключено в списке расширений.
Типичные причины, почему кнопка «не работает»
| Симптом | Что проверить |
|---|---|
| Кнопки нет на форме | Команда создана, но не перетащена на вкладку «Элементы» |
| Кнопка серая | Условие в Доступность не выполняется; проверьте обработчик события таблицы |
| Нажатие ничего не делает | Пустое поле «Действие» у команды или процедура с другим именем |
| Ошибка «Поле объекта не обнаружено» | Обращение к реквизиту, которого нет в списке; добавьте поле в запрос динамического списка или в отбор |
| «Недостаточно прав» | У роли нет права Изменение на объект |
| Кнопка пропала после обновления | Типовая форма заменилась, а правки были не в расширении |