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