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