Как установить доступность конкретного поля в табличной части документа для отдельных строк?

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

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

Рассмотрим пошагово, как решить задачу блокировки конкретной ячейки в строке, если определенное условие (например, пустое значение) не выполняется.

Разбор проблемы и причины поведения системы

Частая ошибка при настройке оформления заключается в неправильном указании пути к полю. Если в коде при добавлении элемента в УсловноеОформление указать в качестве Поле имя самой коллекции строк (всей таблицы), то свойство ТолькоПросмотр применится ко всей строке целиком. Чтобы заблокировать только одно поле, необходимо передать путь к конкретному элементу (колонке).

Реализация через Условное оформление

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

  1. Создадим новый элемент в коллекции УсловноеОформление.
  2. Определим поле, которое нужно заблокировать.
  3. Установим отбор, при котором это поле должно стать неактивным.
  4. Применим параметр оформления ТолькоПросмотр.

Разберем пример кода, который решает поставленную задачу:


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

Почему это решение является правильным

Использование УсловноеОформление — это декларативный подход. Система сама анализирует данные и применяет стили или ограничения доступности без необходимости писать сложные циклы обработки событий. Это значительно повышает производительность системы, особенно при работе с большими объемами данных в табличных частях.

Важно помнить следующие моменты:

Дополнительные возможности

Если условие, при котором поле должно быть доступно или нет, невозможно описать стандартным отбором (например, требуется сложная проверка прав или расчет на сервере), разработчики прибегают к обработчикам ПриАктивизацииСтроки или ПриАктивизацииЯчейки. Однако стоит учитывать, что при таком подходе ограничение будет действовать только на текущую активную строку, что может вызвать визуальное «мигание» доступности полей при перемещении курсора по таблице.

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

← На главную