Как управлять доступностью ячеек в табличном поле в 1С:Предприятие (обычные формы)?

Программист 1С v8.3 (Обычные формы)
← На главную

Часто в процессе разработки прикладных решений на платформе 1С возникает задача гибкого управления интерфейсом: необходимо запретить пользователю редактировать определенные ячейки табличной части в зависимости от значений других полей в этой же строке. Рассмотрим, как реализовать подобную логику в обычных формах, чтобы пользователь не мог внести изменения там, где это не предусмотрено бизнес-процессом.

Разберем задачу по шагам

Представим, что у нас есть табличное поле с колонками Номенклатура, Заказчик, Количество и Признак. Наша цель:

  1. Если Признак = 1, запретить редактирование всей строки.
  2. Если Признак = 2, разрешить редактирование только колонки Количество.
  3. Если Признак = 3, разрешить редактирование всех полей.

Использование события ПриАктивизацииСтроки

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

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


Процедура ТабличнаяЧасть1ПриАктивизацииСтроки(Элемент)
    // Получаем текущие данные строки для обращения к значению признака
    ТекДанные = Элемент.ТекущиеДанные;
    
    // Если таблица пуста, выходим из процедуры
    Если ТекДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Управляем свойством ТолькоПросмотр в зависимости от значения Признака
    Если ТекДанные.Признак = 1 Тогда 
        // Запрещаем все
        ЭлементыФормы.ТабличнаяЧасть1.Колонки.Номенклатура.ТолькоПросмотр = Истина;
        ЭлементыФормы.ТабличнаяЧасть1.Колонки.Количество.ТолькоПросмотр = Истина;
    ИначеЕсли ТекДанные.Признак = 2 Тогда 
        // Запрещаем все, кроме количества
        ЭлементыФормы.ТабличнаяЧасть1.Колонки.Номенклатура.ТолькоПросмотр = Истина;
        ЭлементыФормы.ТабличнаяЧасть1.Колонки.Количество.ТолькоПросмотр = Ложь;
    Иначе    
        // Разрешаем все
        ЭлементыФормы.ТабличнаяЧасть1.Колонки.Номенклатура.ТолькоПросмотр = Ложь;
        ЭлементыФормы.ТабличнаяЧасть1.Колонки.Количество.ТолькоПросмотр = Ложь;
    КонецЕсли;    
КонецПроцедуры

Важные рекомендации по оптимизации

При написании кода всегда старайтесь избегать лишних обращений к объектам формы. Если вы работаете внутри процедуры события, используйте локальные переменные. Как показано в примере выше, обращение к Элемент.ТекущиеДанные один раз в начале процедуры значительно упрощает дальнейшую работу и делает код более «чистым».

Нюансы реализации: что нужно знать

Важно понимать разницу между методами блокировки:

  1. Свойство ТолькоПросмотр у колонки: Этот подход меняет поведение для всей колонки целиком. Если мы используем его внутри события ПриАктивизацииСтроки, мы фактически перенастраиваем колонку «на лету» при переходе между строками. Это визуально выглядит так, будто ячейки заблокированы выборочно.
  2. Событие ПриВыводеСтроки: Если вам требуется более тонкая настройка, которая корректно отражается при прокрутке списка, рассмотрите возможность использования события ПриВыводеСтроки. В нем доступен объект ОформлениеСтроки, который позволяет управлять ячейками более эффективно, не затрагивая настройки колонки целиком.
  3. Безопасность данных: Помните, что визуальная блокировка ячеек через ТолькоПросмотр — это лишь защита от случайных действий пользователя в интерфейсе. Она не препятствует программному изменению данных. Для обеспечения целостности данных при записи документа или справочника всегда дублируйте проверки в модуле объекта, в частности, в процедуре ПередЗаписью.

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

← На главную