Как программно настроить редактирование, оформление и проверку данных в Таблице Значений на обычной форме

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

При работе с обычными формами в 1С 8.3 (например, в конфигурации «Управление производственным предприятием») разработчики часто сталкиваются с тем, что программно выгруженная Таблица Значений (ТЗ) ведет себя не так, как ожидалось. Ячейки могут не редактироваться, колонки не принимать нужную ширину, а вместо привычных «галочек» отображаться текст «Да/Нет». Рассмотрим подробно, как решить эти задачи и превратить обычное табличное поле в удобный инструмент для пользователя.

Разберем проблему типизации колонок

Одной из самых частых причин, по которой ячейки в колонке «Наименование» не поддаются редактированию, является отсутствие явного указания типа данных при создании ТЗ. Если вы добавляете колонку просто по имени, 1С может определить её тип как Неопределено, что блокирует ввод текста в табличном поле.

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


// Правильное создание колонок с явным указанием типов
дТЗ = Новый ТаблицаЗначений;
дТЗ.Колонки.Добавить("наименование", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(150)));
дТЗ.Колонки.Добавить("код", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(10)));
дТЗ.Колонки.Добавить("выбор", Новый ОписаниеТипов("Булево"));
дТЗ.Колонки.Добавить("код_п", Новый ОписаниеТипов("Булево"));

После выгрузки ТЗ на форму через команду СоздатьКолонки(), обязательно проверьте свойство ТолькоПросмотр самого элемента формы ТабличноеПоле. Если оно установлено в Истина, редактирование будет закрыто для всей таблицы целиком, независимо от настроек конкретных колонок.

Как ограничить редактирование конкретных строк по условию

Часто требуется разрешить редактирование колонки в целом, но запретить изменение данных в тех строках, которые соответствуют определенному критерию (например, если флаг код_п установлен в Ложь). Для решения этой задачи мы воспользуемся событием ПриНачалеРедактирования нашего табличного поля.

Рассмотрим алгоритм реализации такой проверки:


Процедура ТЗПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)
    // Получаем данные текущей строки
    ТекущиеДанные = Элемент.ТекущиеДанные;
    
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

    // Условие: запрет редактирования, если код_п равен Ложь
    Если ТекущиеДанные.код_п = Ложь Тогда
        // Запрещаем редактирование всей строки
        Элемент.РазрешитьПравку = Ложь;
        // Или можно использовать Отказ в событии ПередНачаломИзменения
    КонецЕсли;
КонецПроцедуры

Если же вы хотите запретить редактирование только в одной конкретной колонке («Наименование») при определенных условиях, лучше использовать событие ПередНачаломИзменения. Это позволит курсору перемещаться по таблице, но не даст войти в режим редактирования ячейки.

Настройка отображения флажка (чекбокса)

По умолчанию колонки типа Булево отображаются текстом «Да» или «Нет». Чтобы превратить их в интерактивные «галочки», нужно правильно настроить свойства колонки в ТабличномПоле. Выясним важный нюанс: свойства Данные и ДанныеФлажка работают вместе особым образом.

  1. Установите свойство ДанныеФлажка в название вашей колонки из ТЗ (например, "код_п").
  2. Очистите свойство Данные для этой колонки. Если оставить там то же имя, 1С будет рисовать и текст, и флажок.
  3. Установите РежимРедактирования в значение Непосредственно, чтобы пользователь мог менять состояние флажка одним кликом мыши.

Программная раскраска строк по условию

Чтобы визуально выделить строки, в которых редактирование запрещено, воспользуемся событием ПриВыводеСтроки. Это событие вызывается каждый раз, когда строка отрисовывается на экране, что позволяет динамически управлять оформлением.


Процедура ТЗПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Проверяем условие из данных строки
    Если ДанныеСтроки.код_п = Ложь Тогда
        // Устанавливаем цвет фона для всей строки
        ОформлениеСтроки.ЦветФона = Новый Цвет(240, 240, 240); // Серый цвет
        
        // Можно также изменить цвет текста для конкретной колонки
        ОформлениеСтроки.Ячейки.наименование.ЦветТекста = Новый Цвет(128, 128, 128);
    КонецЕсли;
КонецПроцедуры

Важно: Не используйте в этом событии тяжелые запросы или сложные вычисления, так как это значительно замедлит прокрутку таблицы пользователем.

Выбор из списка без повторений

Если в колонке «Порядок» нужно ограничить выбор пользователя только определенными значениями, которые еще не заняты в других строках, мы можем динамически формировать СписокВыбора.

Рассмотрим, как это сделать в событии НачалоВыбора:


Процедура ТЗПорядокНачалоВыбора(Элемент, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь; // Отключаем стандартный выбор
    
    // Создаем список доступных значений
    Список = Новый СписокЗначений;
    Для Индекс = 1 По 10 Цикл
        Список.Добавить(Индекс);
    КонецЦикла;
    
    // Удаляем из списка те значения, которые уже есть в ТЗ
    Для Каждого СтрТЗ Из дТЗ Цикл
        НайденныйЭлемент = Список.НайтиПоЗначению(СтрТЗ.порядок);
        Если НайденныйЭлемент <> Неопределено Тогда
            Список.Удалить(НайденныйЭлемент);
        КонецЕсли;
    КонецЦикла;
    
    // Предлагаем пользователю выбрать из оставшихся
    ВыбранноеЗначение = ВыбратьИзСписка(Список, Элемент);
    Если ВыбранноеЗначение <> Неопределено Тогда
        ЭлементыФормы.ТЗ.ТекущиеДанные.порядок = ВыбранноеЗначение.Значение;
    КонецЕсли;
КонецПроцедуры

Проблемы с шириной колонок и автоадаптацией

Если установка Колонка.Ширина = 3 не приносит результата, проанализируем настройки самого ТабличногоПоля. В обычных формах существует механизм автоматического распределения ширины, который может игнорировать ваши настройки.

Чтобы зафиксировать ширину, выполните следующие действия:

  1. Отключите свойство АвтоМасштаб у элемента ТабличноеПоле.
  2. Убедитесь, что у соседних колонок не установлено свойство РастягиватьПоГоризонтали, иначе они «схлопнут» вашу узкую колонку.
  3. Сначала программно установите ширину Колонка.Ширина = 5, а уже потом применяйте ограничение ИзменениеРазмера = ИзменениеРазмераКолонки.НеИзменять.

Помните, что метод СоздатьКолонки() полностью перерисовывает таблицу и сбрасывает все ваши программные настройки. Поэтому рекомендуется либо настраивать колонки в конфигураторе заранее, либо применять оформление (флажки, ширину, цвета) строго после каждого вызова СоздатьКолонки().

← На главную