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

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

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

Постановка задачи и выбор метода

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

Способ 1. Настройка условного оформления через конфигуратор

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

  1. Откроем форму документа или справочника, перейдем на закладку Условное оформление (в нижней части окна свойств формы).
  2. Нажмем кнопку Добавить.
  3. В поле Оформление выберем параметр Только просмотр и установим его в значение Да (Истина).
  4. В поле Условие добавим новый элемент отбора. Левое значение — наше поле Объект.Товары.ТолькоПросмотр, вид сравнения — Равно, правое значение — Истина.
  5. В поле Оформляемые поля выберем те колонки, которые должны блокироваться, например, ТоварыЦена и ТоварыСумма.

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

Способ 2. Программная настройка условного оформления (Рекомендуемый)

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

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

    // 1. Создаем новый элемент условного оформления
    ЭлементУО = УсловноеОформление.Элементы.Добавить();

    // 2. Устанавливаем, что именно мы хотим изменить (ТолькоПросмотр)
    ЭлементУО.Оформление.УстановитьЗначениеПараметра("ТолькоПросмотр", Истина);

    // 3. Формируем условие: когда в ТЧ "Товары" реквизит "Блокировка" равен Истина
    ЭлементОтбора = ЭлементУО.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.ТолькоПросмотр");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Истина;

    // 4. Указываем поля, к которым применяется блокировка
    ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТоварыЦена");
    
    ОформляемоеПоле = ЭлементУО.Поля.Элементы.Добавить();
    ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("ТоварыСумма");

КонецПроцедуры

Важный нюанс: при указании поля для условия мы используем путь к данным (Объект.Товары.ТолькоПросмотр), а при указании оформляемого поля — имя элемента формы (ТоварыЦена). Будьте внимательны, это частая причина ошибок.

Различие между свойствами «ТолькоПросмотр» и «Доступность»

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

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

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

Рассмотрим пример кода:


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

Важное ограничение: Этот метод меняет свойство элемента формы для всей колонки сразу. Когда пользователь перемещается по строкам, колонка будет то открываться для редактирования, то закрываться. Однако визуально "шахматки" (когда одна строка серая, а другая белая одновременно) вы не увидите. Если вам нужна именно визуальная индикация заблокированных строк во всей таблице сразу, используйте только Условное оформление.

Использование возможностей БСП

Если вы работаете в типовой конфигурации (например, 1С:Бухгалтерия 3.0 или ERP), проанализируйте общие модули. В составе Библиотеки стандартных подсистем (БСП) часто есть механизмы для упрощенного управления оформлением. Например, функции в модуле УправлениеФормами позволяют задавать правила оформления одной строкой кода. Это избавляет от необходимости вручную создавать объекты ПолеКомпоновкиДанных и элементы коллекции оформления.

Заключение

Мы выяснили, что для задачи "сделать недоступными строки ТЧ" наиболее эффективным является программное создание Условного оформления в процедуре ПриСозданииНаСервере. Это обеспечивает высокую производительность (отрисовкой занимается платформа на нижнем уровне), корректное визуальное отображение и чистоту программного кода. Помните, что использование свойства ТолькоПросмотр вместо Доступность делает работу пользователя с программой более комфортной.

← На главную