Как преобразовать ПолеТабличногоДокумента в ТабличныйДокумент в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов и обработок в среде 1С:Предприятие (особенно при работе с классическими Обычными формами) программисты часто сталкиваются с техническим ограничением интерфейса. Элемент управления ПолеТабличногоДокумента, расположенный на форме, является визуальным представлением данных и привязан к клиентскому контексту. Его невозможно напрямую передать в серверные процедуры (например, для отправки по почте, сохранения в базу данных или конвертации в PDF) из-за ошибки передачи мутабельного значения.

Для решения этой задачи необходимо быстро и корректно преобразовать экранное поле в независимый прикладной объект типа ТабличныйДокумент. Давайте подробно разберем, какими способами можно выполнить это преобразование, проанализируем их особенности, плюсы и минусы.

Способ 1. Получение области всей таблицы (Самый простой и быстрый метод)

Наиболее лаконичным и производительным решением является использование стандартного метода ПолучитьОбласть() без передачи параметров.

Согласно синтакс-помощнику платформы 1С, если метод ПолучитьОбласть() вызывается у табличного документа (или его экранного поля) без указания координат конкретных ячеек, то система автоматически принимает за область всю таблицу целиком. Возвращаемым значением при этом является новый, чистый объект типа ТабличныйДокумент.

Посмотрим, как выглядит этот способ на практике:


// Получаем готовый табличный документ в одну строку кода
ТабДок = ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.ПолучитьОбласть();

Преимущества: не нужно предварительно инициализировать пустой объект через конструктор Новый, код выполняется мгновенно и не задействует дисковую подсистему для создания временных файлов.

Способ 2. Перенос данных через метод Вывести()

Еще один классический и надежный способ — программный вывод содержимого поля формы в новый объект. Этот метод часто используется, когда требуется не просто скопировать один документ, а последовательно объединить несколько таблиц в одну финальную печатную форму.

Разберем этот процесс по шагам:

  1. Создаем новый экземпляр объекта ТабличныйДокумент с помощью конструктора.
  2. Вызываем метод Вывести() у вновь созданного объекта и передаем в него наше поле формы.

// Инициализируем чистый табличный документ
ТабДок = Новый ТабличныйДокумент; 

// Заполняем его данными из экранного поля формы
ТабДок.Вывести(ЭлементыФормы.ПолеТабличногоТоварыНаСкладах);

Способ 3. Запись во временный файл (С сохранением настроек печати)

Иногда разработчики используют запись табличного документа во временный файл формата .mxl на диске с последующим его чтением. На первый взгляд, этот подход кажется избыточным и медленным, однако у него есть одно неоспоримое преимущество.

Важный нюанс: методы ПолучитьОбласть() и Вывести() копируют структуру ячеек, шрифты, цвета, рисунки и текст, но они не переносят параметры печати самого документа (такие как имя параметров печати, масштаб, поля страницы, альбомную/портретную ориентацию и колонтитулы). Если пользователь интерактивно настроил параметры печати в поле формы, и вам нужно передать документ на сервер «один в один» с сохранением этих настроек, то запись во временный файл решит эту задачу наиболее полно.

Давайте проанализируем правильную реализацию этого подхода (без жестко прописанных путей к дискам, используя системную временную директорию):


// Получаем путь к уникальному временному файлу на диске
ВременныйФайл = ПолучитьИмяВременногоФайла("mxl");

// Записываем поле формы в файл
ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.Записать(ВременныйФайл);
    
// Создаем объект и считываем данные назад уже с настройками печати
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ВременныйФайл);

// Удаляем временный файл после использования
Попытка
    УдалитьФайлы(ВременныйФайл);
Исключение
    // Обработка возможного исключения блокировки файла
КонецПопытки;

Если вы не хотите использовать медленные операции с файловой системой, но вам необходимо перенести параметры печати, то при использовании Способа 1 или Способа 2 скопируйте нужные свойства вручную через код:


ТабДок = ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.ПолучитьОбласть();

// Копируем ключевые параметры печати
ТабДок.АвтоМасштаб       = ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.АвтоМасштаб;
ТабДок.ОриентацияСтраницы = ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.ОриентацияСтраницы;
ТабДок.ИмяПараметровПечати = ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.ИмяПараметровПечати;
ТабДок.ПолеСлева          = ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.ПолеСлева;
ТабДок.ПолеСправа         = ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.ПолеСправа;

Обратное преобразование: из ТабличногоДокумента в ПолеТабличногоДокумента

Если перед вами стоит обратная задача — отобразить на форме в элементе управления готовый сформированный на сервере ТабличныйДокумент, вы можете воспользоваться методом Вывести() непосредственно у элемента формы:


// Очищаем текущее содержимое поля формы
ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.Очистить();

// Выводим полученный из серверной функции документ
ЭлементыФормы.ПолеТабличногоТоварыНаСкладах.Вывести(ПолученныйТабличныйДокумент);

Как эта проблема решена на Управляемых формах (1С 8.3)?

Рассмотренная нами проблема актуальна исключительно для устаревших Обычных форм платформы 1С. В современной концепции Управляемых форм (УФ) архитектура элементов интерфейса была полностью переработана:

Таким образом, на управляемых формах реквизит формы Результат уже изначально является полноценным объектом типа ТабличныйДокумент. Разработчик может напрямую взаимодействовать с ним на сервере без каких-либо промежуточных преобразований.

← На главную