Запрет добавления строк в табличной части: 5 способов для управляемой формы
Содержание
Частая ошибка: снимают видимость у кнопки «Добавить» и считают задачу решённой. Строку при этом всё равно можно добавить клавишей Ins, через контекстное меню или копированием. Убрать кнопку и запретить добавление — две разные задачи.
Чтобы пользователь не добавлял строки в табличную часть, у таблицы формы выключают свойство Изменение состава строк. Оно гасит и кнопку, и горячие клавиши
, и пункты меню разом. Дальше разберём, где его искать, как менять из кода и чем подстраховаться на уровне данных.
Все примеры — для управляемых форм платформы 8.3 с интерфейсом «Такси». Работаем в Конфигураторе или в расширении конфигурации.
Сначала решите, что именно запрещаем
Запрет бывает разным, и способ зависит от задачи. Выберите случай.
Изменение состава строк и сделайте таблицу «Только просмотр». Подробности — в первых двух разделах.Изменение состава строк. Ячейки останутся редактируемыми.Свойство таблицы в Конфигураторе: самый чистый способ
Откройте форму объекта (документа или справочника) в Конфигураторе. На вкладке «Элементы» выделите таблицу — это элемент с типом «Таблица формы», а не сама табличная часть из дерева метаданных. Справа в палитре свойств найдите флажок Изменение состава строк и снимите его.
Что произойдёт после запуска:
- 🚫 в командной панели таблицы пропадут «Добавить», «Копировать» и «Удалить» (последняя тоже относится к изменению состава строк);
- 🚫 клавиши
Ins,F9иDelперестанут менять состав; - 🚫 перетащить строку или вставить из буфера тоже не получится;
- ✅ значения в существующих ячейках остаются редактируемыми.
Если нужно заблокировать ещё и правку ячеек, включите у таблицы Только просмотр. На уровне отдельной колонки есть то же свойство: так можно оставить редактируемыми 2-3 колонки из десяти.
Это основной способ. Он работает на уровне платформы, не требует кода и не ломается при обновлении формы. Остальные методы нужны, когда запрет зависит от условий.
Что делать с самими кнопками
Бывает, что в командной панели остаются свои кнопки: «Подбор», «Заполнить», «Загрузить из файла». Они продолжают работать, даже когда состав строк закрыт. Если пользователю нужно запретить и их, уберите их отдельно:
- Выделите кнопку в дереве элементов формы.
- Снимите флажок
Видимость(илиДоступность, если кнопку надо показать серой). - Либо уберите команду из командной панели совсем.
У стандартной командной панели есть автозаполнение. Пока оно включено, платформа сама добавляет стандартные кнопки. Чтобы удалять и переименовывать их вручную, отключите Автозаполнение у командной панели таблицы.
Управление из кода формы
Запрет, который зависит от условия, задают программно. Тот же флаг доступен из модуля формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Проведен Тогда
Элементы.Товары.ИзменятьСоставСтрок = Ложь;
КонецЕсли;
КонецПроцедуры
Здесь Товары — имя таблицы формы. Для проведённого документа добавлять строки нельзя, для непроведённого — можно.
Если состояние меняется на лету (например, поставили флажок «Закрыто»), обновляйте свойство в обработчике изменения реквизита:
&НаКлиенте
Процедура ЗакрытоПриИзменении(Элемент)
Элементы.Товары.ИзменятьСоставСтрок = Не Объект.Закрыто;
КонецПроцедуры
Присваивание на клиенте допустимо: это свойство элемента формы, а не данных.
Перехват события перед добавлением
Есть второй способ: оставить кнопки как есть, но отказать при попытке добавить. У таблицы есть событие ПередНачаломДобавления:
&НаКлиенте
Процедура ТоварыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа)
Отказ = Истина;
ПоказатьПредупреждение(, "Строки в эту таблицу добавляет только обработка заполнения.");
КонецПроцедуры
Плюс подхода: можно объяснить пользователю, почему не получилось. Минус: кнопка по-прежнему на месте и «ничего не делает» — это раздражает. Для постоянного запрета берите свойство таблицы, для условного — код с понятным сообщением.
Аналогичное событие для удаления — ПередУдалением. Оно вызывается и при нажатии Del, и при выборе пункта «Удалить» в меню.
Скрытая кнопка — не защита. Код формы выполняется на клиенте, и обойти его можно обработкой, загрузкой данных или внешним соединением. Для жёстких правил используйте проверку в модуле объекта.
Права и роли: запрет для одних, свобода для других
Пока речь шла об интерфейсе. Если правило звучит как «менеджерам нельзя, бухгалтерам можно», удобнее связать его с ролью.
Есть два пути.
Путь первый — права на объекте. В редакторе роли у документа или справочника раскройте табличные части. Для каждой есть права «Просмотр» и «Редактирование». Роль без «Редактирования» табличной части позволит её видеть, но не менять. Это настоящая защита: она работает и в формах, и в обработках, и при обмене данными, если обмен идёт от имени пользователя.
Путь второй — проверка роли в форме. Когда нужно менять поведение формы, но не вводить новую роль:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Не РольДоступна("ПолныеПрава") Тогда
Элементы.Товары.ИзменятьСоставСтрок = Ложь;
КонецЕсли;
КонецПроцедуры
Имя роли замените на свою. РольДоступна проверяет, назначена ли роль текущему пользователю.
Сравнение подходов:
| Способ | Что даёт | Ограничение |
|---|---|---|
| Свойство таблицы | Нет кнопок и горячих клавиш для всех | Одинаково для всех пользователей |
| Код в форме | Условный запрет | Защищает только интерфейс |
| Права роли на табличную часть | Запрет на уровне данных | Нужно менять роли и проверять их на тестовом пользователе |
| Проверка в модуле объекта | Правило для любого источника данных | Пользователь видит отказ только при записи |
После правки ролей проверьте результат под тестовым пользователем. Зайдите в базу под ним и убедитесь, что и кнопки исчезли, и запись не проходит.
Проверка в модуле объекта: когда нужен настоящий запрет
Интерфейс можно обойти, данные — нет. Модуль объекта (документа, справочника) срабатывает при записи из любого места: из формы, из обмена, из загрузки.
Что здесь можно сделать? Прямо запретить «добавление» в этом модуле нельзя: он видит только итоговый состав строк. Но можно сравнить состояние до и после и отказать в записи.
Типовой пример — ограничение числа строк:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Товары.Количество() > 5 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "В документе не может быть больше пяти строк.";
Сообщение.Поле = "Товары";
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
А чтобы запретить новые строки в уже проведённом документе, сравните с базой:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Не ЭтоНовый() Тогда
СтарыйСостав = Ссылка.Товары.Количество();
Если Товары.Количество() > СтарыйСостав Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Добавлять строки в этот документ нельзя.";
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Ссылка.Товары читает табличную часть из базы, то есть до изменений. Число строк в базе сравнивается с числом строк в записываемом объекте.
Если объект записывается обработкой, которая сознательно добавляет строки, такая проверка её тоже остановит. Добавьте в условие признак вроде ДополнительныеСвойства.РазрешитьДобавление и устанавливайте его в нужной обработке.
Что с СКД и динамическими списками
Запрос приходит и в таком виде: «убрать кнопку добавления через систему компоновки данных». Здесь нужно уточнить, о каком объекте речь.
Система компоновки данных строит отчёты. В отчёте нет табличной части, куда пользователь добавляет строки. Кнопки «Добавить» там не бывает, поэтому и убирать нечего. Настройки отчёта, где можно добавлять отборы и поля, — отдельный механизм, и их ограничивают флагами доступности в схеме компоновки.
Если на самом деле речь о динамическом списке (журнал документов , справочник), то кнопка «Создать» в нём создаёт новый объект, а не строку. Скрыть её можно так:
- в Конфигураторе снимите видимость команды «Создать» в командной панели списка;
- либо уберите у роли право «Добавление» на этот справочник или документ, тогда кнопки не будет для всех, у кого нет права.
Второй вариант честнее: при отсутствии права платформа сама скроет стандартные команды, не нужно править форму.
Особенности управляемых форм
Несколько нюансов, на которых чаще всего спотыкаются.
Таблица значений и табличная часть — не одно и то же. Свойство Изменение состава строк относится к элементу формы. Если на форме таблица, привязанная к реквизиту типа «Таблица значений», она настраивается так же, но защиты на уровне данных у неё нет: данные живут только в форме.
Типовые конфигурации. Правка формы типового документа в БП, ЗУП или УТ ставит объект «на поддержку с изменениями». При обновлении придётся сравнивать и объединять. Чище вынести правку в расширение конфигурации : оно подменяет свойства и обработчики формы, не трогая типовой код.
Нет флажка в палитре свойств. Вы выбрали не элемент формы, а реквизит таблицы или колонку. Нужно выделить именно таблицу в дереве элементов.
Порядок событий. Обработчик ПриСозданииНаСервере срабатывает один раз при открытии. Если вы позже меняете состояние объекта на клиенте, свойство придётся пересчитать (пример с флажком «Закрыто» выше).
Копирование и подбор. Копирование строки — это тоже добавление, и оно закрывается тем же свойством. Подбор из справочника и заполнение обработкой — отдельные кнопки, их нужно убрать вручную, если они не нужны.
Как сделать это в расширении, не трогая типовую форму
Для типовых конфигураций это основной путь. Схема короткая:
- Создайте расширение конфигурации и добавьте в него нужный документ или справочник.
- Откройте его форму в расширении. Платформа создаст копию формы, привязанную к типовой.
- Выделите таблицу и снимите флажок
Изменение состава строк. - Если запрет условный, добавьте обработчик события
ПриСозданииНаСерверев расширении. Типовой обработчик при этом продолжит выполняться. - Подключите расширение к базе и перезапустите сеанс.
При обновлении типовой конфигурации форма в расширении не затирается. Если разработчики добавят в типовую форму новые элементы, они появятся и у вас.
Как проверить результат
Проверку удобно делать по короткому списку, на тестовой копии базы:
- открыть форму в режиме 1С:Предприятие и убедиться, что кнопок нет;
- нажать
InsиF9в таблице: новых строк быть не должно; - попробовать вставить строки из буфера обмена;
- зайти под пользователем с ограниченной ролью и повторить те же действия;
- записать документ через обработку или обмен, если такие сценарии есть.
Последний пункт чаще всего забывают. Интерфейс уже закрыт, а данные в таблицу всё равно попадают из загрузки. Если такой путь есть и он нежелателен, нужна проверка в модуле объекта.
Частые вопросы
Можно ли убрать кнопку «Добавить», но оставить «Удалить»?
Изменение состава строк — нет, оно управляет обеими. Оставьте свойство включённым, снимите видимость кнопки «Добавить» и вставьте отказ в событие ПередНачаломДобавления, чтобы закрыть горячие клавиши.Почему после снятия видимости кнопки строку можно добавить клавишей Ins?
ПередНачаломДобавления.Работает ли это для обычных форм?
Как запретить добавление всем, кроме администратора?
ПриСозданииНаСервере проверьте роль через РольДоступна и выключите ИзменятьСоставСтрок для остальных. Если нужна жёсткая защита, уберите право «Редактирование» табличной части у ролей этих пользователей.