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