При разработке внешних обработок и форм часто возникает задача ограничить изменение данных в таблице значений или табличной части. Например, если данные загружаются со сканера штрихкодов или из внешнего файла, требуется разрешить пользователю корректировать исключительно те строки, где информация распозналась некорректно (например, не заполнена дата или реквизиты равны значениям по умолчанию), оставив остальные строки заблокированными.
Разберем основные подходы к решению этой задачи, рассмотрим частые ошибки при блокировке ячеек и выясним, как правильно организовать логику работы с табличным полем.
Наиболее прямолинейный способ управления возможностью редактирования строки табличного поля — обработчик события ПередНачаломИзменения. Это событие вызывается непосредственно перед тем, как пользователь начинает вводить или изменять значение в строке.
Проанализируем пример кода, в котором редактирование разрешается только для тех строк, где дата выработки осталась незаполненной (равна пустой дате):
Процедура ТПРеализацияПередНачаломИзменения(Элемент, Отказ)
// Проверяем заполненность даты в текущей строке
Если ЗначениеЗаполнено(Элемент.ТекущаяСтрока.ДатаВыработки) Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Параметр Отказ = Истина отменяет открытие ячейки для редактирования. Если требуется разрешить изменение только определенных колонок, мы можем дополнительно проанализировать активную колонку через свойство Элемент.ТекущаяКолонка.
Если требуется заблокировать конкретные ячейки визуально и функционально без постоянного вызова прерываний в обработчиках изменений, более правильным подходом является управление свойством ТолькоПросмотр на уровне оформления ячеек в событии ПриВыводеСтроки.
Рассмотрим пример настройки оформления:
Процедура ТПРеализацияПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Если дата заполнена, блокируем редактирование ячеек строки
Если ЗначениеЗаполнено(ДанныеСтроки.ДатаВыработки) Тогда
ОформлениеСтроки.Ячейки.Количество.ТолькоПросмотр = Истина;
ОформлениеСтроки.Ячейки.ДатаВыработки.ТолькоПросмотр = Истина;
Иначе
ОформлениеСтроки.Ячейки.Количество.ТолькоПросмотр = Ложь;
ОформлениеСтроки.Ячейки.ДатаВыработки.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецПроцедуры
Такой подход обеспечивает наглядное поведение интерфейса: недоступные ячейки не переходят в режим ввода, что исключает лишние вопросы со стороны пользователей.
Иногда возникает ситуация: свойство колонки Доступность = Истина и ТолькоПросмотр = Ложь, однако ввести числовое значение (например, количество) не удается. Выясним основные причины такого поведения:
ТолькоПросмотр и Доступность. Если они установлены некорректно в палитре свойств или программно, ввод будет заблокирован.ПриВыводеСтроки или ПриПолученииДанных, свойство ТолькоПросмотр конкретной ячейки могло быть переопределено там.Неопределено приведет к автоматическому приведению к 0 или невозможности ввода. Числовые колонки для очистки следует сбрасывать в 0 либо инициализировать с составным типом.Если условие редактирования завязано на пустую дату, возникает логическая коллизия: как только пользователь вводит правильную дату, строка считается заполненной и мгновенно блокируется для редактирования остальных колонок (количества, веса и т.д.). Если оператор сначала указал дату, исправить остальные поля он уже не сможет.
Рассмотрим наиболее надежные способы устранения этой проблемы:
РучнаяСтрока). При ошибке сканирования в эту колонку устанавливается значение Истина. Проверка возможности редактирования выполняется по данному флагу, а не по значению даты.ПриОкончанииРедактирования. Пользователю дается возможность свободно заполнить все поля строки, а при попытке уйти со строки система валидирует данные целиком и выдает предупреждение, если реквизиты заполнены некорректно.Посмотрим на пример организации проверки по флагу ручной корректировки:
Процедура ТПРеализацияПередНачаломИзменения(Элемент, Отказ)
// Редактировать разрешено только строки, помеченные как требующие исправления
Если НЕ Элемент.ТекущаяСтрока.ТребуетИсправления Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Использование явного признака ручной обработки позволяет гибко управлять доступом к полям и предотвращает случайную блокировку данных в процессе их ввода.