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