Почему не редактируется программно созданная таблица на управляемой форме 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При динамической генерации интерфейса в 1С:Предприятии 8.3 разработчики часто сталкиваются с ситуацией: таблица значений успешно передается на форму, реквизиты и визуальные элементы создаются без ошибок, данные отображаются, однако пользователь не может изменить значения в ячейках. Двойной клик мыши или нажатие клавиши Enter не приводят к переходу в режим редактирования строки, хотя свойства доступности и только просмотра у формы и таблицы проверены. Разберем причину такого поведения и пошаговый алгоритм правильного программного создания колонок.

Главная причина: значение по умолчанию для вида элемента формы

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

Для активации возможности редактирования необходимо явно назначить свойство Вид создаваемого элемента управления:

НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;

Если колонка имеет логический тип (Булево), вместо поля ввода следует задавать ВидПоляФормы.ПолеФлажка или ВидПоляФормы.ПолеПереключателя, чтобы пользователь мог интерактивно переключать состояние флажка.

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

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

  1. Создание реквизитов формы. Формируем массив объектов РеквизитФормы и регистрируем их пакетно с помощью метода ИзменитьРеквизиты(). Вызывать этот метод нужно единым массивом, так как он выполняет полную переинициализацию контекста формы.
  2. Создание визуальных элементов управления. Добавляем поля через коллекцию Элементы, указывая в качестве родителя нашу таблицу, настраиваем путь к данным и обязательно задаем редактируемый вид поля.
  3. Заполнение данными. Преобразуем исходную таблицу значений в данные формы через метод ЗначениеВРеквизитФормы().

Посмотрим на типовой пример реализации в процедуре ПриСозданииНаСервере:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // 1. Формируем список новых реквизитов-колонок для реквизита формы "ТаблицаДанных"
    МассивРеквизитов = Новый Массив;
    
    // Колонка номенклатуры (ссылочный тип)
    МассивРеквизитов.Добавить(Новый РеквизитФормы(
        "Номенклатура", 
        Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), 
        "ТаблицаДанных", 
        "Номенклатура"
    ));
    
    // Колонка количества (числовой тип)
    МассивКвалификаторов = Новый КвалификаторыЧисла(15, 3, ДопустимыйЗнак.Неотрицательный);
    МассивРеквизитов.Добавить(Новый РеквизитФормы(
        "Количество", 
        Новый ОписаниеТипов("Число", , , МассивКвалификаторов), 
        "ТаблицаДанных", 
        "Количество"
    ));
    
    // Применяем изменения структуры реквизитов
    ИзменитьРеквизиты(МассивРеквизитов);
    
    // 2. Создаем элементы формы для отображения и редактирования колонок
    // Поле номенклатуры
    КолонкаНоменклатура = Элементы.Добавить("ТаблицаДанныхНоменклатура", Тип("ПолеФормы"), Элементы.ТаблицаДанных);
    КолонкаНоменклатура.Вид = ВидПоляФормы.ПолеВвода;
    КолонкаНоменклатура.ПутьКДанным = "ТаблицаДанных.Номенклатура";
    КолонкаНоменклатура.РедактированиеТекста = Истина;
    
    // Поле количества
    КолонкаКоличество = Элементы.Добавить("ТаблицаДанныхКоличество", Тип("ПолеФормы"), Элементы.ТаблицаДанных);
    КолонкаКоличество.Вид = ВидПоляФормы.ПолеВвода;
    КолонкаКоличество.ПутьКДанным = "ТаблицаДанных.Количество";
    КолонкаКоличество.РедактированиеТекста = Истина;
    
    // 3. Загружаем переданные данные, если они переданы в параметрах
    Если Параметры.Свойство("ИсходнаяТаблица") И ТипЗнч(Параметры.ИсходнаяТаблица) = Тип("ТаблицаЗначений") Тогда
        ЗначениеВРеквизитФормы(Параметры.ИсходнаяТаблица, "ТаблицаДанных");
    КонецЕсли;
    
КонецПроцедуры

Дополнительные факторы, блокирующие редактирование

Если свойство Вид установлено в ВидПоляФормы.ПолеВвода, но редактирование все равно не работает, проверим следующие свойства и настройки:

  1. Режим выбора таблицы. Если у элемента ТаблицаФормы установлено свойство РежимВыбора = Истина, двойной клик или клавиша Enter инициируют выбор строки (завершение работы с таблицей), а не вход в режим редактирования ячейки. Для свободного ввода данных режим выбора должен быть отключен.
  2. Событие «Выбор» таблицы. Проверьте, не назначен ли для таблицы обработчик события Выбор, в котором параметру СтандартнаяОбработка присваивается значение Ложь без открытия альтернативных диалогов редактирования.
  3. Корректность типа данных в реквизите. Если при вызове Новый РеквизитФормы передать пустое ОписаниеТипов, платформа не сможет определить, какой редактор предоставить пользователю (строку, поле выбора ссылки, калькулятор или календарь), что делает ввод невозможным.
  4. Свойства родительских контейнеров. Убедитесь, что свойства ТолькоПросмотр и Доступность не заблокированы на уровне самой формы, группы-контейнера или элемента таблицы.
← На главную