Как программно сделать кнопку Добавить в табличной части неактивной?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки интерфейсов на управляемых формах 1С часто возникает задача ограничить действия пользователя с табличной частью. Одной из наиболее распространенных задач является отключение кнопки Добавить при сохранении возможности редактирования существующих строк или использования других команд (например, удаления или копирования). Рассмотрим детально все доступные инструменты и методы для решения этой задачи.

Метод 1: Прямое управление свойством Доступность

Самый простой и очевидный способ — обратиться к конкретному элементу формы, который представляет собой кнопку в командной панели. Проанализируем, как это реализовать программно. Важно помнить, что если командная панель заполняется автоматически, имя кнопки формируется системой по определенному шаблону: ИмяТаблицы + Добавить. Для интерактивной проверки и изменения свойств элементов без доработки кода можно использовать обработку для редактирования свойств элементов формы в режиме предприятия.

Рассмотрим пример кода, который следует разместить в процедуре ПриОткрытии на стороне клиента:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    // Отключаем доступность кнопки добавления в основной панели
    Элементы.ТоварыДобавить.Доступность = Ложь;
    
    // Также не забываем про контекстное меню, которое вызывается правой кнопкой мыши
    Элементы.ТоварыКонтекстноеМенюДобавить.Доступность = Ложь;
КонецПроцедуры

Этот метод хорош тем, что он точечный. Однако у него есть существенный минус: он не блокирует стандартные горячие клавиши (например, Insert). Пользователь все еще сможет добавить строку, нажав клавишу на клавиатуре, даже если кнопка на экране выглядит серой и неактивной.

Метод 2: Свойство таблицы ИзменениеСоставаСтрок

Выясним, как можно заблокировать добавление более надежно. У самого элемента формы типа Таблица есть крайне полезное свойство — ИзменениеСоставаСтрок. Если мы установим его в значение Ложь, система автоматически сделает неактивными кнопки Добавить, Скопировать и Удалить. Более того, этот метод автоматически блокирует горячие клавиши.

Проанализируем программную установку этого свойства:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Полная блокировка изменения состава строк (добавление, копирование, удаление)
    Элементы.Товары.ИзменениеСоставаСтрок = Ложь;
КонецПроцедуры

Если же нам нужно запретить только добавление, но оставить удаление, этот метод в чистом виде не подойдет, так как он действует комплексно.

Метод 3: Перехват события ПередДобавлением

Разберем ситуацию, когда нам нужно не просто визуально отключить кнопку, а программно контролировать процесс создания новой строки. Для этого у таблицы формы существует событие ПередДобавлением. Это наиболее гибкий метод, позволяющий внедрить сложную логику проверки условий.

Посмотрим на пример реализации:


&НаКлиенте
Процедура ТоварыПередДобавлением(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
    Если Не Копирование Тогда 
        // Если происходит именно добавление новой строки, а не копирование существующей
        Отказ = Истина;
        Сообщить("Добавление новых строк в данной ситуации запрещено правилами системы.");
    КонецЕсли;
КонецПроцедуры

Используя параметр Отказ = Истина, мы полностью пресекаем попытку создания строки, вне зависимости от того, как она была инициирована: нажатием кнопки, горячей клавишей или через контекстное меню.

Метод 4: Настройка видимости вместо доступности

Иногда с точки зрения UX-дизайна лучше полностью скрыть кнопку, чтобы не вводить пользователя в заблуждение неактивным элементом. Рассмотрим, как это сделать. Вместо свойства Доступность используем свойство Видимость.


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

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

Метод 5: Кастомная командная панель

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

  1. Выбираем элемент Командная панель таблицы.
  2. Снимаем галочку Автозаполнение.
  3. Нажимаем правой кнопкой мыши и выбираем Заполнить автоматически (это создаст копии всех стандартных кнопок, но уже как отдельные управляемые элементы).
  4. Удаляем кнопку Добавить или меняем её свойства в конфигураторе.

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

Метод 6: Блокировка горячих клавиш через фиктивные команды

Как мы уже выяснили, простое отключение Доступность = Ложь не спасает от клавиши Insert. Чтобы "обмануть" систему, мы можем применить следующий прием: создадим на форме новую команду, назовем её ЗаглушкаДобавления, оставим её действие пустым, но в свойствах команды назначим Сочетание клавиш — Insert.

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

Метод 7: Управление через права доступа (Роли)

Рассмотрим ситуацию с точки зрения безопасности. Если добавление строк должно быть запрещено для определенных категорий пользователей всегда, правильнее всего сделать это на уровне метаданных. В конфигураторе для конкретной роли можно снять право Интерактивное добавление для соответствующей табличной части объекта (Справочника или Документа).

В этом случае платформа 1С сама позаботится о том, чтобы кнопки добавления не появились в интерфейсе, а попытки программного добавления жестко пресекались на уровне ядра. Это самый надежный метод, так как его невозможно обойти через настройки формы.

Резюме

Подводя итог, выбор инструмента зависит от вашей конкретной цели:

Совместное использование этих методов позволит вам создать максимально защищенный и интуитивно понятный интерфейс для конечного пользователя.

← На главную