Как ограничить редактирование ячеек колонки в табличной части управляемой формы 1С 8.3

Программист 1С v8.3 (Управляемые формы) 1С:Розница Торговля и дистрибуция
← На главную

В процессе разработки и настройки прикладных решений на платформе 1С:Предприятие 8.3 часто возникает задача выборочно запретить пользователю редактирование данных в конкретной колонке табличной части. Например, требуется запретить кассиру изменять цену для всех позиций чека, кроме определенных товаров со свободной ценой.

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

Способ 1. Настройка через программное «Условное оформление» формы

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

Проанализируем базовые правила настройки условного оформления:

  1. На уровне элемента формы (колонки) свойство ТолькоПросмотр должно быть отключено (значение Ложь), а свойство Доступность — включено (значение Истина). Если колонка заблокирована целиком на уровне формы, условное оформление не сможет сделать отдельные ячейки доступными.
  2. У пользователя должны быть права на редактирование соответствующего реквизита (включая дополнительные права пользователя, если они проверяются в конфигурации).
  3. Правило условного оформления добавляется программно в процедуре ПриСозданииНаСервере модуля формы.

Посмотрим на пример программного создания элемента условного оформления:


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

Важный момент: при таком подходе платформа на стороне клиента сама отрисовывает ячейки заблокированными или доступными без лишних серверных вызовов.

Способ 2. Перехват события «ПередНачаломИзменения» таблицы

Если требуется жесткий контроль редактирования непосредственно в момент клика или нажатия клавиши ввода, рассмотрим вариант с обработчиком события таблицы ПередНачаломИзменения на клиенте.

Этот способ позволяет проверить, в какой именно колонке находится пользователь, и отменить редактирование строки или ячейки при несоблюдении условий:


&НаКлиенте
Процедура ТоварыПередНачаломИзменения(Элемент, Отказ, РедактированиеНовой)
    
    ТекущиеДанные = Элемент.ТекущиеДанные;
    
    Если ТекущиеДанные <> Неопределено Тогда
        // Проверяем, активирована ли колонка цены и подходит ли номенклатура
        Если Элемент.ТекущийЭлемент = Элементы.ТоварыЦена 
            И ТекущиеДанные.Номенклатура <> РазрешеннаяНоменклатура Тогда
            
            Отказ = Истина;
            
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Способ 3. Динамическое переключение свойства в «ПриАктивизацииСтроки»

Еще один клиентский подход — управление свойством элемента формы ТолькоПросмотр при перемещении пользователя по строкам таблицы.

Разберем реализацию в обработчике ПриАктивизацииСтроки:


&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
    
    ТекущиеДанные = Элемент.ТекущиеДанные;
    
    Если ТекущиеДанные <> Неопределено Тогда
        // Разрешаем редактирование колонки Только для разрешенного товара
        Элементы.ТоварыЦена.ТолькоПросмотр = (ТекущиеДанные.Номенклатура <> РазрешеннаяНоменклатура);
    КонецЕсли;
    
КонецПроцедуры

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

Рекомендации по доработке конфигураций

  1. Отказ от жесткого кодирования (Hardcode): Не рекомендуется привязываться к строковому значению Код = "123" непосредственно в коде. При изменении кода номенклатуры или переносе базы логика перестанет работать. Оптимально создать дополнительный реквизит номенклатуры (например, РедактированиеЦеныРазрешено) или использовать предопределенный элемент справочника.
  2. Использование расширений: Чтобы сохранить типовую конфигурацию на поддержке, все описанные обработчики и правила условного оформления следует помещать в расширение конфигурации с использованием аннотаций &После или &Вместо.
← На главную