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