Запрет добавления строк в табличной части: 5 способов для управляемой формы

· 9 мин

Содержание

Частая ошибка: снимают видимость у кнопки «Добавить» и считают задачу решённой. Строку при этом всё равно можно добавить клавишей Ins, через контекстное меню или копированием. Убрать кнопку и запретить добавление — две разные задачи.

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

Все примеры — для управляемых форм платформы 8.3 с интерфейсом «Такси». Работаем в Конфигураторе или в расширении конфигурации.

Сначала решите, что именно запрещаем

Запрет бывает разным, и способ зависит от задачи. Выберите случай.

Что нужно сделать с таблицей?

Свойство таблицы в Конфигураторе: самый чистый способ

Откройте форму объекта (документа или справочника) в Конфигураторе. На вкладке «Элементы» выделите таблицу — это элемент с типом «Таблица формы», а не сама табличная часть из дерева метаданных. Справа в палитре свойств найдите флажок Изменение состава строк и снимите его.

Что произойдёт после запуска:

  • 🚫 в командной панели таблицы пропадут «Добавить», «Копировать» и «Удалить» (последняя тоже относится к изменению состава строк);
  • 🚫 клавиши Ins, F9 и Del перестанут менять состав;
  • 🚫 перетащить строку или вставить из буфера тоже не получится;
  • ✅ значения в существующих ячейках остаются редактируемыми.

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

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

Что делать с самими кнопками

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

  1. Выделите кнопку в дереве элементов формы.
  2. Снимите флажок Видимость (или Доступность, если кнопку надо показать серой).
  3. Либо уберите команду из командной панели совсем.

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

Управление из кода формы

Запрет, который зависит от условия, задают программно. Тот же флаг доступен из модуля формы:

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

Здесь Товары — имя таблицы формы. Для проведённого документа добавлять строки нельзя, для непроведённого — можно.

Если состояние меняется на лету (например, поставили флажок «Закрыто»), обновляйте свойство в обработчике изменения реквизита:

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

Присваивание на клиенте допустимо: это свойство элемента формы, а не данных.

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

Есть второй способ: оставить кнопки как есть, но отказать при попытке добавить. У таблицы есть событие ПередНачаломДобавления:

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

Плюс подхода: можно объяснить пользователю, почему не получилось. Минус: кнопка по-прежнему на месте и «ничего не делает» — это раздражает. Для постоянного запрета берите свойство таблицы, для условного — код с понятным сообщением.

Аналогичное событие для удаления — ПередУдалением. Оно вызывается и при нажатии Del, и при выборе пункта «Удалить» в меню.

Скрытая кнопка — не защита. Код формы выполняется на клиенте, и обойти его можно обработкой, загрузкой данных или внешним соединением. Для жёстких правил используйте проверку в модуле объекта.

Права и роли: запрет для одних, свобода для других

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

Есть два пути.

Путь первый — права на объекте. В редакторе роли у документа или справочника раскройте табличные части. Для каждой есть права «Просмотр» и «Редактирование». Роль без «Редактирования» табличной части позволит её видеть, но не менять. Это настоящая защита: она работает и в формах, и в обработках, и при обмене данными, если обмен идёт от имени пользователя.

Путь второй — проверка роли в форме. Когда нужно менять поведение формы, но не вводить новую роль:

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

Имя роли замените на свою. РольДоступна проверяет, назначена ли роль текущему пользователю.

Сравнение подходов:

СпособЧто даётОграничение
Свойство таблицыНет кнопок и горячих клавиш для всехОдинаково для всех пользователей
Код в формеУсловный запретЗащищает только интерфейс
Права роли на табличную частьЗапрет на уровне данныхНужно менять роли и проверять их на тестовом пользователе
Проверка в модуле объектаПравило для любого источника данныхПользователь видит отказ только при записи

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

Проверка в модуле объекта: когда нужен настоящий запрет

Интерфейс можно обойти, данные — нет. Модуль объекта (документа, справочника) срабатывает при записи из любого места: из формы, из обмена, из загрузки.

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

Типовой пример — ограничение числа строк:

Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если Товары.Количество() > 5 Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = "В документе не может быть больше пяти строк.";
        Сообщение.Поле = "Товары";
        Сообщение.УстановитьДанные(ЭтотОбъект);
        Сообщение.Сообщить();
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

А чтобы запретить новые строки в уже проведённом документе, сравните с базой:

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

Ссылка.Товары читает табличную часть из базы, то есть до изменений. Число строк в базе сравнивается с числом строк в записываемом объекте.

Если объект записывается обработкой, которая сознательно добавляет строки, такая проверка её тоже остановит. Добавьте в условие признак вроде ДополнительныеСвойства.РазрешитьДобавление и устанавливайте его в нужной обработке.

Что с СКД и динамическими списками

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

Система компоновки данных строит отчёты. В отчёте нет табличной части, куда пользователь добавляет строки. Кнопки «Добавить» там не бывает, поэтому и убирать нечего. Настройки отчёта, где можно добавлять отборы и поля, — отдельный механизм, и их ограничивают флагами доступности в схеме компоновки.

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

  • в Конфигураторе снимите видимость команды «Создать» в командной панели списка;
  • либо уберите у роли право «Добавление» на этот справочник или документ, тогда кнопки не будет для всех, у кого нет права.

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

Особенности управляемых форм

Несколько нюансов, на которых чаще всего спотыкаются.

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

Типовые конфигурации. Правка формы типового документа в БП, ЗУП или УТ ставит объект «на поддержку с изменениями». При обновлении придётся сравнивать и объединять. Чище вынести правку в расширение конфигурации : оно подменяет свойства и обработчики формы, не трогая типовой код.

Нет флажка в палитре свойств. Вы выбрали не элемент формы, а реквизит таблицы или колонку. Нужно выделить именно таблицу в дереве элементов.

Порядок событий. Обработчик ПриСозданииНаСервере срабатывает один раз при открытии. Если вы позже меняете состояние объекта на клиенте, свойство придётся пересчитать (пример с флажком «Закрыто» выше).

Копирование и подбор. Копирование строки — это тоже добавление, и оно закрывается тем же свойством. Подбор из справочника и заполнение обработкой — отдельные кнопки, их нужно убрать вручную, если они не нужны.

Как сделать это в расширении, не трогая типовую форму

Для типовых конфигураций это основной путь. Схема короткая:

  1. Создайте расширение конфигурации и добавьте в него нужный документ или справочник.
  2. Откройте его форму в расширении. Платформа создаст копию формы, привязанную к типовой.
  3. Выделите таблицу и снимите флажок Изменение состава строк.
  4. Если запрет условный, добавьте обработчик события ПриСозданииНаСервере в расширении. Типовой обработчик при этом продолжит выполняться.
  5. Подключите расширение к базе и перезапустите сеанс.

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

Как проверить результат

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

  • открыть форму в режиме 1С:Предприятие и убедиться, что кнопок нет;
  • нажать Ins и F9 в таблице: новых строк быть не должно;
  • попробовать вставить строки из буфера обмена;
  • зайти под пользователем с ограниченной ролью и повторить те же действия;
  • записать документ через обработку или обмен, если такие сценарии есть.

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

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

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