Как сделать колонку табличного поля 1С++ недоступной для редактирования?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Внешняя компонента 1С++ существенно расширяет возможности платформы 1С версии 7.7, позволяя использовать объект ТабличноеПоле для удобного вывода списков и таблиц. Однако в отличие от стандартных элементов управления 1С v8, у колонок ТабличногоПоля в 1С++ нет готового свойства "ТолькоПросмотр" или "Доступность", которое можно было бы переключить в палитре свойств. По умолчанию табличное поле является элементом отображения данных, а процесс редактирования ячеек полностью управляется программно. В этой статье разберем, как устроена логика редактирования колонок, почему проверка условий в модуле формы может не срабатывать и как правильно заблокировать изменение конкретных колонок.

Принцип работы редактирования в Табличном поле 1С++

В 1С++ интерактивное редактирование ячейки запускается не автоматически, а исключительно вызовом метода РедактироватьЗначение(). Когда пользователь совершает двойной клик или нажимает клавишу Enter на ячейке, табличное поле генерирует событие Выбор (или процедуру вида ИмяРеквизитаВыбор в модуле формы).

Рассмотрим базовая логику блокировки колонок. Для того чтобы запретить редактирование определенных колонок, достаточно в самом начале обработчика события проверить имя текущей колонки и досрочно прервать выполнение процедуры с помощью оператора Возврат.

Посмотрим на пример кода в модуле формы:


Процедура ак_ТабПолеВыбор(ТПИсточник, НомерСтрокиТП, КолонкаТП, Регион)
    // Проверяем, входит ли колонка в список недоступных для редактирования
    Если КолонкиТПТолькоПросмотр.НайтиЗначение(КолонкаТП.Имя) <> 0 Тогда
        Возврат; // Прерываем обработку, не вызывая метод редактирования
    КонецЕсли;
    
    // Если колонка доступна, получаем значение и вызываем редактирование
    ЗначениеТЗ = ТПИсточник.ПоставщикДанных.ТаблицаЗначений.ПолучитьЗначение(НомерСтрокиТП, КолонкаТП.Имя);
    
    Длина = 0;
    Точность = 0;
    ТПИсточник.ПоставщикДанных.ТаблицаЗначений.ПолучитьПараметрыКолонки(КолонкаТП.Имя, , Длина, Точность);
    
    // Явно приводим параметры длины и точности к числовому типу
    Длина = Число(Длина);
    Точность = Число(Точность);
    
    ТПИсточник.РедактироватьЗначение(НомерСтрокиТП, КолонкаТП, Регион, ЗначениеТЗ, Длина, Точность);
КонецПроцедуры

Почему отмена редактирования в модуле формы может не работать

Проанализируем ситуацию, с которой часто сталкиваются разработчики: в модуле формы прописано условие отмены через Возврат, условие срабатывает, однако курсор всё равно заходит в ячейку и активирует режим редактирования.

Выясним причину такого поведения. Если элемент управления ТабличноеПоле создан с использованием объектно-ориентированного расширения (ООП) 1С++ и привязан к пользовательскому классу, порядок обработки событий меняется:

  1. При возникновении события Выбор первым срабатывает обработчик, описанный внутри самого класса 1С++.
  2. Если внутри метода класса зашит непосредственный вызов метода РедактироватьЗначение(), режим редактирования ячейки активируется еще до того, как управление передается в модуль формы.
  3. Процедура модуля формы (например, ак_ТабПолеВыбор) вызывается уже после или параллельно, поэтому условие Возврат в модуле формы никак не влияет на отработанный код класса.

Таким образом, если табличное поле основано на классе, логику ограничения доступа необходимо закладывать непосредственно в класс или передавать список запрещенных колонок внутрь объекта класса.

Ошибки при передаче параметров в РедактироватьЗначение

При организации программного редактирования ячеек важно обращать внимание на типы передаваемых параметров в метод РедактироватьЗначение(). Если передать параметры длины и точности в виде строк или неопределенных значений, редактор ячейки может работать с ошибками:

Чтобы избежать этих проблем, всегда явно приводите параметры длины и точности к числовому типу с помощью функции Число() перед вызовом метода РедактироватьЗначение().

Пошаговая инструкция по настройке запрета редактирования колонок

Разберем по шагам, как правильно настроить недоступность колонок в табличном поле 1С++:

  1. Проверьте наличие пользовательского класса: Проанализируйте, создается ли табличное поле через СоздатьОбъект("ТабличноеПоле") или через класс-преемник. Если используется класс, откройте код класса и найдите процедуру Выбор.
  2. Добавьте условие проверки колонок: Разместите список запрещенных к редактированию колонок (передавая его в класс или объявляя в модуле) и проверяйте имя текущей колонки Колонка.Имя перед вызовом редактирования.
  3. Исключите вызов РедактироватьЗначение: Убедитесь, что для недоступных колонок метод РедактироватьЗначение() не вызывается ни в модуле формы, ни внутри класса.
  4. Проверьте типы данных: При вызове редактирования убедитесь, что параметры Длина и Точность имеют числовой тип.
← На главную