Программное создание элементов интерфейса в 1С — задача не самая простая, особенно когда речь заходит о сложных структурах, таких как таблицы. Часто разработчики сталкиваются с ситуацией, когда таблица отображается на форме, строки можно копировать или перемещать, но добавить новую пустую строку или отредактировать существующие ячейки не получается. В этой статье мы подробно разберем, как избежать типичных ошибок и сделать программную таблицу полностью функциональной.
Для того чтобы таблица на форме стала «живой» и позволяла пользователю вводить данные, необходимо четко разделять процесс на два этапа: создание структуры данных (реквизита формы) и создание визуальных элементов (элементов формы). Проанализируем каждый этап отдельно.
Этап 1: Создание реквизита формы
Прежде чем что-то рисовать на экране, мы должны подготовить «контейнер» в памяти формы. Это делается с помощью метода ИзменитьРеквизиты. Важно помнить, что этот метод доступен только в серверном контексте. Рассмотрим пример кода, создающего таблицу значений с двумя колонками:
// Описываем структуру добавляемых реквизитов
МассивРеквизитов = Новый Массив;
ИмяТаблицы = "ПрограммнаяТаблица";
// Добавляем саму таблицу (тип - ТаблицаЗначений)
МассивРеквизитов.Добавить(Новый РеквизитФормы(ИмяТаблицы, Новый ОписаниеТипов("ТаблицаЗначений")));
// Добавляем колонки таблицы
// ВАЖНО: обязательно указывайте тип данных для колонки через ОписаниеТипов
МассивРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"), ИмяТаблицы));
МассивРеквизитов.Добавить(Новый РеквизитФормы("Количество", Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(15, 3)), ИмяТаблицы));
// Применяем изменения на форме
ЭтаФорма.ИзменитьРеквизиты(МассивРеквизитов);
Этап 2: Создание элементов формы (визуализация)
Теперь, когда реквизит ПрограммнаяТаблица существует в контексте формы, нам нужно создать визуальный объект ТаблицаФормы и колонки для него. Выясним, на что нужно обратить внимание, чтобы таблица была редактируемой.
// 1. Создаем саму таблицу как элемент формы
ЭлементТаблица = Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"));
ЭлементТаблица.ПутьКДанным = ИмяТаблицы;
// Настраиваем возможность редактирования
ЭлементТаблица.ИзменятьСоставСтрок = Истина;
ЭлементТаблица.ИзменятьПорядокСтрок = Истина;
// 2. Создаем колонку "Номенклатура"
ИмяКолонки = "Номенклатура";
НоваяКолонка = Элементы.Добавить(ИмяТаблицы + ИмяКолонки, Тип("ПолеФормы"), ЭлементТаблица);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; // КРИТИЧЕСКИ ВАЖНО для редактирования
НоваяКолонка.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонки;
// 3. Создаем колонку "Количество"
ИмяКолонкиЧисло = "Количество";
КолонкаЧисло = Элементы.Добавить(ИмяТаблицы + ИмяКолонкиЧисло, Тип("ПолеФормы"), ЭлементТаблица);
КолонкаЧисло.Вид = ВидПоляФормы.ПолеВвода;
КолонкаЧисло.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонкиЧисло;
Разберем основные причины (в диагностике которых может помочь редактор форм), по которым кнопка «Добавить» может быть активна, но ячейки остаются заблокированными:
Вид элемента формы (колонки) присвоено значение ВидПоляФормы.ПолеНадписи, 1С просто отобразит текст без возможности его изменить. Всегда устанавливайте ВидПоляФормы.ПолеВвода.Новый РеквизитФормы вы не указали ОписаниеТипов, система не поймет, какой редактор (календарь, калькулятор или выбор из справочника) нужно открыть.ТолькоПросмотр. Оно есть у всей формы, у элемента таблицы и у каждой конкретной колонки. Если хотя бы на одном уровне стоит Истина, редактирование будет недоступно.ПутьКДанным колонки указан через точку от имени таблицы: "ИмяТаблицы.ИмяКолонки".Чтобы программная таблица выглядела и вела себя как «родная», рассмотрим еще несколько важных аспектов.
Командная панель
По умолчанию у программно созданной таблицы может отсутствовать кнопочная панель (Добавить, Удалить и т.д.). Выясним, как ее включить. Для этого достаточно установить свойство ПоложениеКоманднойПанели:
ЭлементТаблица.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Верх;
Обработка событий
Зачастую нам нужно не просто вводить данные, но и реагировать на их изменение (например, пересчитывать сумму при изменении количества). Для этого используется метод УстановитьДействие. Рассмотрим пример привязки события ПриИзменении к колонке:
КолонкаЧисло.УстановитьДействие("ПриИзменении", "ПрограммнаяТаблицаКоличествоПриИзменении");
При этом в модуле формы обязательно должна существовать экспортная процедура с соответствующим именем:
&НаКлиенте
Процедура ПрограммнаяТаблицаКоличествоПриИзменении(Элемент)
// Ваша логика пересчета
ТекущиеДанные = Элементы.ПрограммнаяТаблица.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Выполняем действия
КонецЕсли;
КонецПроцедуры
Важно помнить, что программно созданная таблица на форме — это объект типа ДанныеФормыКоллекция, а не привычная ТаблицаЗначений. Хотя они очень похожи, у них есть различия в методах работы. Например, если вам нужно выгрузить данные из этой коллекции в обычную таблицу значений для обработки на сервере, используйте метод ЗначениеВРеквизитФормы или ДанныеФормыВЗначение.
Также проанализируем ситуацию с вложенностью. Если вы хотите добавить таблицу не в корень формы, а в определенную группу или на страницу, обязательно передавайте родительский элемент третьим параметром в метод Элементы.Добавить(Имя, Тип, Родитель). Если родитель не указан, таблица «улетит» в самый низ формы, что часто портит интерфейс.
Резюмируем: для создания полноценной редактируемой таблицы нам нужно правильно типизировать реквизиты, назначить колонкам вид ПолеВвода, корректно прописать пути к данным и не забыть разрешить изменение состава строк в свойствах самой таблицы. Следуя этим правилам, вы сможете динамически изменять интерфейс ваших решений под любые задачи бизнеса.