Реализация ограничения доступа к отдельным ячейкам табличного поля отличается в зависимости от вычислительных затрат на определение доступности.
В случае быстрого вычисления доступности управление доступом осуществляется в
обработчике события ПриВыводеСтроки() табличного поля, где программно
нужным ячейкам в строке устанавливается в значение Истина свойство
ТолькоПросмотр.
Пример:
Процедура СписокЕдиницыИзмеренияПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Если ДанныеСтроки.Владелец = Неопределено Тогда ОформлениеСтроки.Ячейки.Коэффициент.ТолькоПросмотр = Ложь; Иначе ОформлениеСтроки.Ячейки.Коэффициент.ТолькоПросмотр = (ДанныеСтроки.Ссылка = мТекущаяЕдиницаХраненияОстатков); КонецЕсли; КонецПроцедуры |
В случае длительного вычисление доступности, то есть, если для определения доступности /недоступности ячейки необходимо выполнять действия, приводящие к чтению из БД, или любые другие, длительно выполняющиеся действия, то выполнение этих действий в обработчике ПриDыводеCтроки может привести к существенным задержкам, при работе с табличным полем.
В таких случаях следует применять следующий метод:
Считается, что приведенное в примере табличное поле содержит колонку "Искомая", доступ к ячейкам которой необходимо регулировать, и колонку "Значение", по значениям строк которой устанавливается данный режим доступа.
Определена функция РежимДоступа(), которая по задаваемому алгоритму определяет текущий режим доступа для ячейки.
Функция РазрешенДоступ(Значение) Если Значение = <Условие доступа> Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецФункции |
1. Запрет прямого редактирования значения ячейки выполняется в обработке события табличного поля ПередНачаломИзменения:
Процедура ТабличноеПолеПередНачаломИзменения(Элемент, Отказ) Если Элемент.ТекущаяКолонка = Элемент.Колонки.Искомая Тогда Отказ = НЕ РазрешенДоступ (Элемент.ТекущиеДанные.Значение); КонецЕсли; КонецПроцедуры |
2. Поскольку вход в режим редактирования строки может осуществляться с любой колонки, также добавляются следующие процедуры и переменные для индикации, что происходит редактирование.
Переменная модуля формы - признак того, что происходит редактирование:
//////////////////////////////////////////////////////////////////////////////// // ПЕРЕМЕННЫЕ МОДУЛЯ // Перем мПроисходитРедактирование // при создании формы должна устанавливаться в Ложь …. //////////////////////////////////////////////////////////////////////////////// // ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ // мПроисходитРедактирование = Ложь; |
Обработчики начала и окончания редактирования строки табличного поля, которые устанавливают и сбрасывают признак редактирования:
Процедура ТабличноеПолеПриНачалеРедактирования(Элемент, НоваяСтрока) мПроисходитРедактирование = Истина; КонецПроцедуры Процедура ТабличноеПолеПриОкончанииРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования) мПроисходитРедактирование = Ложь; КонецПроцедуры |
3. В событии ПриАктивацииСтроки() необходимо выполнять сброс установленных ограничений на доступ для текущей строки:
Процедура ТабличноеПолеПриАктивизацииСтроки(Элемент) Элемент.Колонки.Искомая.ЭлементУправления.ТолькоПросмотр = Истина; КонецПроцедуры |
4. Процедура, выполняющая регулирование доступа к ячейкам вызывается при активизации "Искомой" колонки табличного поля, в случае если строка находится в режиме редактирования:
Процедура ТабличноеПолеПриАктивизацииКолонки(Элемент) Если мПроисходитРедактирование Тогда ТекущаяКолонка = Элемент.ТекущаяКолонка; Если ТекущаяКолонка = Элемент.Колонки.Искомая Тогда ТекущаяКолонка.ЭлементУправления.ТолькоПросмотр = НЕ РазрешенДоступ (Элемент.ТекущиеДанные.Значение); КонецЕсли; КонецЕсли; КонецПроцедуры |
Дата: 2018-11-18, просмотров: 310.