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

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

При разработке интерфейсов на платформе 1С:Предприятие 8 (Управляемые формы) начинающие разработчики часто сталкиваются с архитектурной особенностью: попытка напрямую обратиться к свойству доступности конкретной ячейки в строке таблицы приводит к ошибке. Код вида СтрокаТаблицы.ТОперации.Доступность = Ложь не работает, так как объект строки табличной части (коллекция данных) не содержит в себе элементов управления и их визуальных свойств.

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

Выясняем причину проблемы: Данные vs Элементы формы

Для понимания логики работы управляемого интерфейса важно разделять данные формы и элементы формы:

  1. Данные формы (например, Объект.Продукция) — это таблицы и структуры, хранящие информацию. У них нет понятий цвета, видимости или доступности.
  2. Элементы формы (например, Элементы.ПродукцияТОперации) — это визуальные элементы управления, которые отображают данные на экране.

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

Способ 1: Использование Условного Оформления формы (Рекомендуемый)

Это самый надежный, производительный и правильный с точки зрения стандартов разработки «1С» метод. Платформа самостоятельно отслеживает изменение значений в строках на клиенте и мгновенно применяет правила оформления без лишних вызовов сервера.

Для настройки условного оформления мы можем использовать как интерактивный режим в конфигураторе, так и программную установку при создании формы.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    УстановитьУсловноеОформлениеНаФорме();
    
КонецПроцедуры

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

Важная деталь: В настройках условного оформления крайне рекомендуется использовать свойство ТолькоПросмотр вместо свойства Доступность. Если установить Доступность = Ложь, ячейка станет полностью неактивной — пользователь не сможет кликнуть по ней или скопировать находящееся там значение. Использование ТолькоПросмотр = Истина блокирует изменение данных, но сохраняет удобство работы с интерфейсом.

Способ 2: Использование клиентских событий табличной части

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

Наиболее правильным программным способом является перехват события начала редактирования строки — ПриНачалеРедактирования или ПередНачаломИзменения табличной части.

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


&НаКлиенте
Процедура ПродукцияПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    
    ТекущиеДанные = Элемент.ТекущиеДанные;
    
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Проверяем условие блокировки ячейки ТОперации для текущей строки
    ЯчейкаДолжнаБытьЗаблокирована = НЕ ЗначениеЗаполнено(ТекущиеДанные.Спецификация);
    
    // Управляем свойством ТолькоПросмотр элемента формы (колонки) на клиенте
    Элементы.ПродукцияТОперации.ТолькоПросмотр = ЯчейкаДолжнаБытьЗаблокирована;
    
КонецПроцедуры

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

Сравнение методов и выбор оптимального решения

Проанализируем оба подхода, чтобы вы могли выбрать наиболее подходящий для вашего сценария:

  1. Условное оформление (Способ 1):
    • Плюсы: Отрабатывает автоматически на уровне платформы; не требует написания кода обработчиков на клиенте; визуально сразу показывает пользователю заблокированные ячейки (можно выделить цветом) до того, как он начнет редактирование.
    • Минусы: Сложно использовать, если условие блокировки требует комплексных расчетов или запросов к базе данных.
  2. Обработчик событий (Способ 2):
    • Плюсы: Позволяет реализовать любую сложную логику проверки прав доступа, обращений к серверу или анализа связанных документов.
    • Минусы: Пользователь не видит визуальную блокировку ячейки, пока не попробует войти в режим ее редактирования. Неправильная реализация может привести к снижению производительности формы.

Резюме разработки: Всегда отдавайте приоритет Условному оформлению формы. Используйте его для простых логических проверок реквизитов текущей строки. К написанию кода в обработчиках ПриНачалеРедактирования прибегайте только в исключительных случаях, когда декларативных возможностей платформы действительно недостаточно.

← На главную