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