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