Как отключить доступность поля в конкретной строке таблицы 1С, не блокируя всю колонку?

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

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

Метод 1: Условное оформление (рекомендуемый для управляемых форм)

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

Проанализируем шаги по настройке условного оформления:

  1. Откроем форму документа или справочника в конфигураторе.
  2. Перейдем на закладку «Условное оформление» в окне свойств формы.
  3. Добавим новый элемент оформления.
  4. В поле «Оформление» выберем свойство Только просмотр (установим значение Истина) или Доступность (значение Ложь). Мы рекомендуем использовать Только просмотр, так как это позволяет пользователю выделять текст в ячейке, но запрещает его изменение.
  5. В поле «Условие» укажем логику: например, Объект.Начисления.ВидРасчета Равно ПланВидовРасчета.ОсновныеНачисления.Больничный.
  6. В поле «Оформляемые поля» выберем конкретную колонку (например, НачисленияГрафикРаботы).

Если нам необходимо настроить это программно (например, если условие зависит от динамических параметров), рассмотрим пример кода, который можно разместить в процедуре ПриСозданииНаСервере:


ЭлементОформления = УсловноеОформление.Элементы.Добавить();
ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить();
ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Объект.Начисления.ГрафикРаботы");

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

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

Метод 2: Использование события ПриАктивизацииСтроки

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

Посмотрим на пример реализации такого обработчика:


&НаКлиенте
Процедура НачисленияПриАктивизацииСтроки(Элемент)
    ТекущиеДанные = Элемент.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Проверяем условие для блокировки
    БлокироватьПоле = (ТекущиеДанные.ВидРасчета = ПредопределенноеЗначение("ПланВидовРасчета.Начисления.БольничныйЛист"));
    
    // Управляем доступностью конкретного элемента (колонки) в контексте текущей строки
    Элементы.НачисленияГрафикРаботы.ТолькоПросмотр = БлокироватьПоле;
КонецПроцедуры

Важное замечание: этот метод имеет визуальный недостаток. Если у вас в таблице много строк, и вы быстро их перелистываете, колонка будет «мигать», меняя свою доступность. Кроме того, если таблица пуста или активна только одна строка, нужно убедиться, что обработчик корректно отрабатывает начальное состояние формы.

Метод 3: Перехват в событии НачалоВыбора

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


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

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

Метод 4: Реализация в обычных формах (v8.2 и ранее)

Если вы работаете с устаревшим интерфейсом («Обычные формы»), подход будет отличаться. В таких формах нет условного оформления в том виде, в котором оно существует в управляемых формах. Здесь мы используем событие табличного поля ПриВыводеСтроки. Рассмотрим этот механизм подробнее:

Событие ПриВыводеСтроки вызывается платформой для каждой отрисовываемой на экране строки. Это позволяет индивидуально настроить свойства ячейки для конкретного объекта строки.


Процедура ТабличнаяЧастьПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Если ДанныеСтроки.ВидРасчета = мВидРасчетаБольничный Тогда
        // Блокируем конкретную ячейку в оформлении строки
        ОформлениеСтроки.Ячейки.ГрафикРаботы.ТолькоПросмотр = Истина;
        ОформлениеСтроки.Ячейки.ГрафикРаботы.ЦветТекста = ЦветаСтиля.ТекстЗаблокированногоЭлемента;
    Иначе
        ОформлениеСтроки.Ячейки.ГрафикРаботы.ТолькоПросмотр = Ложь;
    КонецЕсли;
КонецПроцедуры

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

Сравнение свойств: Доступность vs Только просмотр

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

Рекомендация: В большинстве бизнес-задач свойство Только просмотр является более предпочтительным, так как оно не нарушает привычный ритм работы пользователя с клавиатурой.

Резюме по выбору решения

Подведем итоги нашего анализа. Выбор метода зависит от архитектуры вашего решения:

  1. Для управляемых форм всегда начинайте с Условного оформления. Это максимально надежный способ, работающий на уровне платформенных механизмов.
  2. Если логика зависит от сложных расчетов или данных, которых нет в строке, используйте ПриАктивизацииСтроки в сочетании с ТолькоПросмотр.
  3. Для обычных форм единственным верным способом визуально выделить недоступность ячейки в конкретной строке является событие ПриВыводеСтроки.
  4. Если нужно просто запретить ввод в ссылочные поля, используйте НачалоВыбора с параметром СтандартнаяОбработка = Ложь.

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

← На главную