Как программно добавить редактируемую таблицу на управляемую форму 1С?

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

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

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

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

Этап 1: Создание реквизита формы

Прежде чем что-то рисовать на экране, мы должны подготовить «контейнер» в памяти формы. Это делается с помощью метода ИзменитьРеквизиты. Важно помнить, что этот метод доступен только в серверном контексте. Рассмотрим пример кода, создающего таблицу значений с двумя колонками:


// Описываем структуру добавляемых реквизитов
МассивРеквизитов = Новый Массив;
ИмяТаблицы = "ПрограммнаяТаблица";

// Добавляем саму таблицу (тип - ТаблицаЗначений)
МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяТаблицы, Новый ОписаниеТипов("ТаблицаЗначений")));

// Добавляем колонки таблицы
// ВАЖНО: обязательно указывайте тип данных для колонки через ОписаниеТипов
МассивРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), ИмяТаблицы));
МассивРеквизитов.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)), ИмяТаблицы));

// Применяем изменения на форме
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);

Этап 2: Создание элементов формы (визуализация)

Теперь, когда реквизит ПрограммнаяТаблица существует в контексте формы, нам нужно создать визуальный объект ТаблицаФормы и колонки для него. Выясним, на что нужно обратить внимание, чтобы таблица была редактируемой.


// 1. Создаем саму таблицу как элемент формы
ЭлементТаблица = Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"));
ЭлементТаблица.ПутьКДанным = ИмяТаблицы;

// Настраиваем возможность редактирования
ЭлементТаблица.ИзменятьСоставСтрок = Истина;
ЭлементТаблица.ИзменятьПорядокСтрок = Истина;

// 2. Создаем колонку "Номенклатура"
ИмяКолонки = "Номенклатура";
НоваяКолонка = Элементы.Добавить(ИмяТаблицы + ИмяКолонки, Тип("ПолеФормы"), ЭлементТаблица);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; // КРИТИЧЕСКИ ВАЖНО для редактирования
НоваяКолонка.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонки;

// 3. Создаем колонку "Количество"
ИмяКолонкиЧисло = "Количество";
КолонкаЧисло = Элементы.Добавить(ИмяТаблицы + ИмяКолонкиЧисло, Тип("ПолеФормы"), ЭлементТаблица);
КолонкаЧисло.Вид = ВидПоляФормы.ПолеВвода;
КолонкаЧисло.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонкиЧисло;

Почему таблица может не редактироваться?

Разберем основные причины (в диагностике которых может помочь редактор форм), по которым кнопка «Добавить» может быть активна, но ячейки остаются заблокированными:

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

Дополнительные настройки для удобства работы

Чтобы программная таблица выглядела и вела себя как «родная», рассмотрим еще несколько важных аспектов.

Командная панель

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


ЭлементТаблица.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Верх;

Обработка событий

Зачастую нам нужно не просто вводить данные, но и реагировать на их изменение (например, пересчитывать сумму при изменении количества). Для этого используется метод УстановитьДействие. Рассмотрим пример привязки события ПриИзменении к колонке:


КолонкаЧисло.УстановитьДействие("ПриИзменении", "ПрограммнаяТаблицаКоличествоПриИзменении");

При этом в модуле формы обязательно должна существовать экспортная процедура с соответствующим именем:


&НаКлиенте
Процедура ПрограммнаяТаблицаКоличествоПриИзменении(Элемент)
    // Ваша логика пересчета
    ТекущиеДанные = Элементы.ПрограммнаяТаблица.ТекущиеДанные;
    Если ТекущиеДанные <> Неопределено Тогда
        // Выполняем действия
    КонецЕсли;
КонецПроцедуры

Особенности работы с типами данных формы

Важно помнить, что программно созданная таблица на форме — это объект типа ДанныеФормыКоллекция, а не привычная ТаблицаЗначений. Хотя они очень похожи, у них есть различия в методах работы. Например, если вам нужно выгрузить данные из этой коллекции в обычную таблицу значений для обработки на сервере, используйте метод ЗначениеВРеквизитФормы или ДанныеФормыВЗначение.

Также проанализируем ситуацию с вложенностью. Если вы хотите добавить таблицу не в корень формы, а в определенную группу или на страницу, обязательно передавайте родительский элемент третьим параметром в метод Элементы.Добавить(Имя, Тип, Родитель). Если родитель не указан, таблица «улетит» в самый низ формы, что часто портит интерфейс.

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

← На главную