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