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