Как запретить редактирование ячейки в 1С при переходе по TAB в управляемых формах

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

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

Анализ проблемы: почему событие ПередНачаломИзменения подводит?

Разберем ситуацию: разработчик прописывает логику проверки в событии ПередНачаломИзменения для элемента формы (поля ввода в таблице). Этот код отлично срабатывает, когда пользователь кликает в ячейку мышкой. Но как только начинается навигация по строке через TAB, проверка перестает работать, и пользователь получает доступ к редактированию «чужих» данных. Посмотрим на типичный пример такого кода:


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

Причина такого поведения кроется в логике работы платформы 1С v8.3. Если табличная часть находится в режиме "Вход в строку", то после активации первой ячейки вся строка считается находящейся в режиме редактирования. При нажатии TAB фокус перемещается между колонками внутри уже активного сеанса правки, и событие ПередНачаломИзменения для конкретного элемента может не инициироваться повторно. Для платформы переход в соседнюю колонку той же строки не всегда является «началом нового изменения».

Решение №1: Условное оформление — «золотой стандарт»

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

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

  1. Откроем форму документа или справочника в конфигураторе.
  2. Перейдем на закладку "Условное оформление" (находится в свойствах самой формы).
  3. Добавим новый элемент оформления:
    • Оформление: Установим флаг ТолькоПросмотр в значение Истина или Доступность в значение Ложь.
    • Условие: Укажем Объект.Запчасти.Пользователь Не Равно ТекущийПользователь.
    • Оформляемые поля: Выберем колонку ЗапчастиКоммент.

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

Выбор между ТолькоПросмотр и Доступность влияет на пользовательский опыт:

— Если выбрать ТолькоПросмотр, пользователь сможет встать в ячейку по TAB, но не сможет ничего изменить.

— Если выбрать Доступность = Ложь, то при нажатии TAB курсор будет просто перепрыгивать через запрещенную ячейку, что значительно ускоряет работу.

Решение №2: Программная установка доступности в событиях активации

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


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

Почему этот метод часто называют «вредным»? Выясним причины:

Сравнение методов и рекомендации

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

Для реализации качественного интерфейса придерживаемся следующих правил:

  1. Всегда отдаем предпочтение Условному оформлению для статических правил (например: «нельзя редактировать чужое»).
  2. Используем Доступность = Ложь в УО, если хотим реализовать «пропуск» ячеек при навигации по TAB.
  3. Если логика очень сложная (требует обращения к сторонним регистрам или внешним системам), вычисляем признак возможности редактирования один раз при получении данных и записываем его в невидимую колонку таблицы. Затем настраиваем УО по этой колонке.
  4. Помним о безопасности: запрет в форме — это удобство для пользователя, а не защита данных. Для реальной защиты на уровне базы данных используйте RLS (Record Level Security).

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

← На главную