В процессе разработки интерфейсов на управляемых формах 1С часто возникает задача ограничить действия пользователя с табличной частью. Одной из наиболее распространенных задач является отключение кнопки Добавить при сохранении возможности редактирования существующих строк или использования других команд (например, удаления или копирования). Рассмотрим детально все доступные инструменты и методы для решения этой задачи.
Самый простой и очевидный способ — обратиться к конкретному элементу формы, который представляет собой кнопку в командной панели. Проанализируем, как это реализовать программно. Важно помнить, что если командная панель заполняется автоматически, имя кнопки формируется системой по определенному шаблону: ИмяТаблицы + Добавить. Для интерактивной проверки и изменения свойств элементов без доработки кода можно использовать обработку для редактирования свойств элементов формы в режиме предприятия.
Рассмотрим пример кода, который следует разместить в процедуре ПриОткрытии на стороне клиента:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Отключаем доступность кнопки добавления в основной панели
Элементы.ТоварыДобавить.Доступность = Ложь;
// Также не забываем про контекстное меню, которое вызывается правой кнопкой мыши
Элементы.ТоварыКонтекстноеМенюДобавить.Доступность = Ложь;
КонецПроцедуры
Этот метод хорош тем, что он точечный. Однако у него есть существенный минус: он не блокирует стандартные горячие клавиши (например, Insert). Пользователь все еще сможет добавить строку, нажав клавишу на клавиатуре, даже если кнопка на экране выглядит серой и неактивной.
Выясним, как можно заблокировать добавление более надежно. У самого элемента формы типа Таблица есть крайне полезное свойство — ИзменениеСоставаСтрок. Если мы установим его в значение Ложь, система автоматически сделает неактивными кнопки Добавить, Скопировать и Удалить. Более того, этот метод автоматически блокирует горячие клавиши.
Проанализируем программную установку этого свойства:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Полная блокировка изменения состава строк (добавление, копирование, удаление)
Элементы.Товары.ИзменениеСоставаСтрок = Ложь;
КонецПроцедуры
Если же нам нужно запретить только добавление, но оставить удаление, этот метод в чистом виде не подойдет, так как он действует комплексно.
Разберем ситуацию, когда нам нужно не просто визуально отключить кнопку, а программно контролировать процесс создания новой строки. Для этого у таблицы формы существует событие ПередДобавлением. Это наиболее гибкий метод, позволяющий внедрить сложную логику проверки условий.
Посмотрим на пример реализации:
&НаКлиенте
Процедура ТоварыПередДобавлением(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
Если Не Копирование Тогда
// Если происходит именно добавление новой строки, а не копирование существующей
Отказ = Истина;
Сообщить("Добавление новых строк в данной ситуации запрещено правилами системы.");
КонецЕсли;
КонецПроцедуры
Используя параметр Отказ = Истина, мы полностью пресекаем попытку создания строки, вне зависимости от того, как она была инициирована: нажатием кнопки, горячей клавишей или через контекстное меню.
Иногда с точки зрения UX-дизайна лучше полностью скрыть кнопку, чтобы не вводить пользователя в заблуждение неактивным элементом. Рассмотрим, как это сделать. Вместо свойства Доступность используем свойство Видимость.
&НаКлиенте
Процедура СкрытьКнопкуДобавления()
Элементы.ТоварыДобавить.Видимость = Ложь;
КонецПроцедуры
Важный момент: если вы используете автоматическое заполнение командной панели, скрытие кнопки может привести к тому, что панель перестроится, и интерфейс "прыгнет". В таких случаях рекомендуется переходить к ручному управлению командной панелью.
Если стандартные инструменты не дают нужного результата, проанализируем вариант с созданием собственной панели инструментов. В свойствах таблицы формы можно снять флаг Автозаполнение у командной панели. После этого вы можете вручную добавить только те кнопки, которые нужны пользователю.
Этот подход дает полный контроль над визуальной составляющей, но требует больше времени на поддержку при обновлении конфигурации. При разработке кастомных элементов программным путем можно изучить пример динамического добавления и удаления элементов формы.
Как мы уже выяснили, простое отключение Доступность = Ложь не спасает от клавиши Insert. Чтобы "обмануть" систему, мы можем применить следующий прием: создадим на форме новую команду, назовем её ЗаглушкаДобавления, оставим её действие пустым, но в свойствах команды назначим Сочетание клавиш — Insert.
Таким образом, когда пользователь нажмет Insert, система выполнит вашу пустую команду вместо стандартного действия таблицы по добавлению строки.
Рассмотрим ситуацию с точки зрения безопасности. Если добавление строк должно быть запрещено для определенных категорий пользователей всегда, правильнее всего сделать это на уровне метаданных. В конфигураторе для конкретной роли можно снять право Интерактивное добавление для соответствующей табличной части объекта (Справочника или Документа).
В этом случае платформа 1С сама позаботится о том, чтобы кнопки добавления не появились в интерфейсе, а попытки программного добавления жестко пресекались на уровне ядра. Это самый надежный метод, так как его невозможно обойти через настройки формы.
Подводя итог, выбор инструмента зависит от вашей конкретной цели:
Доступность.ПередДобавлением или свойство ИзменениеСоставаСтрок.Видимость или настраиваем командную панель вручную.Совместное использование этих методов позволит вам создать максимально защищенный и интуитивно понятный интерфейс для конечного пользователя.