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