Внешняя компонента 1С++ существенно расширяет возможности платформы 1С версии 7.7, позволяя использовать объект ТабличноеПоле для удобного вывода списков и таблиц. Однако в отличие от стандартных элементов управления 1С v8, у колонок ТабличногоПоля в 1С++ нет готового свойства "ТолькоПросмотр" или "Доступность", которое можно было бы переключить в палитре свойств. По умолчанию табличное поле является элементом отображения данных, а процесс редактирования ячеек полностью управляется программно. В этой статье разберем, как устроена логика редактирования колонок, почему проверка условий в модуле формы может не срабатывать и как правильно заблокировать изменение конкретных колонок.
В 1С++ интерактивное редактирование ячейки запускается не автоматически, а исключительно вызовом метода РедактироватьЗначение(). Когда пользователь совершает двойной клик или нажимает клавишу Enter на ячейке, табличное поле генерирует событие Выбор (или процедуру вида ИмяРеквизитаВыбор в модуле формы).
Рассмотрим базовая логику блокировки колонок. Для того чтобы запретить редактирование определенных колонок, достаточно в самом начале обработчика события проверить имя текущей колонки и досрочно прервать выполнение процедуры с помощью оператора Возврат.
Посмотрим на пример кода в модуле формы:
Процедура ак_ТабПолеВыбор(ТПИсточник, НомерСтрокиТП, КолонкаТП, Регион)
// Проверяем, входит ли колонка в список недоступных для редактирования
Если КолонкиТПТолькоПросмотр.НайтиЗначение(КолонкаТП.Имя) <> 0 Тогда
Возврат; // Прерываем обработку, не вызывая метод редактирования
КонецЕсли;
// Если колонка доступна, получаем значение и вызываем редактирование
ЗначениеТЗ = ТПИсточник.ПоставщикДанных.ТаблицаЗначений.ПолучитьЗначение(НомерСтрокиТП, КолонкаТП.Имя);
Длина = 0;
Точность = 0;
ТПИсточник.ПоставщикДанных.ТаблицаЗначений.ПолучитьПараметрыКолонки(КолонкаТП.Имя, , Длина, Точность);
// Явно приводим параметры длины и точности к числовому типу
Длина = Число(Длина);
Точность = Число(Точность);
ТПИсточник.РедактироватьЗначение(НомерСтрокиТП, КолонкаТП, Регион, ЗначениеТЗ, Длина, Точность);
КонецПроцедуры
Проанализируем ситуацию, с которой часто сталкиваются разработчики: в модуле формы прописано условие отмены через Возврат, условие срабатывает, однако курсор всё равно заходит в ячейку и активирует режим редактирования.
Выясним причину такого поведения. Если элемент управления ТабличноеПоле создан с использованием объектно-ориентированного расширения (ООП) 1С++ и привязан к пользовательскому классу, порядок обработки событий меняется:
Выбор первым срабатывает обработчик, описанный внутри самого класса 1С++.РедактироватьЗначение(), режим редактирования ячейки активируется еще до того, как управление передается в модуль формы.ак_ТабПолеВыбор) вызывается уже после или параллельно, поэтому условие Возврат в модуле формы никак не влияет на отработанный код класса.Таким образом, если табличное поле основано на классе, логику ограничения доступа необходимо закладывать непосредственно в класс или передавать список запрещенных колонок внутрь объекта класса.
При организации программного редактирования ячеек важно обращать внимание на типы передаваемых параметров в метод РедактироватьЗначение(). Если передать параметры длины и точности в виде строк или неопределенных значений, редактор ячейки может работать с ошибками:
Чтобы избежать этих проблем, всегда явно приводите параметры длины и точности к числовому типу с помощью функции Число() перед вызовом метода РедактироватьЗначение().
Разберем по шагам, как правильно настроить недоступность колонок в табличном поле 1С++:
СоздатьОбъект("ТабличноеПоле") или через класс-преемник. Если используется класс, откройте код класса и найдите процедуру Выбор.Колонка.Имя перед вызовом редактирования.РедактироватьЗначение() не вызывается ни в модуле формы, ни внутри класса.Длина и Точность имеют числовой тип.