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