Разработка и Конфигурация · 12 мин
1С: как обойти табличный документ при работе с данными
Как в 1С получить и обработать данные без вывода в табличный документ: прямые запросы, СКД без макета, программный вывод и типичные ошибки разработчиков.
Табличный документ в 1С — удобный инструмент для печатных форм и визуальных отчётов, но во многих задачах он становится лишним промежуточным звеном. Построение табличного документа расходует память и время, а если данные нужны только для обмена, расчёта или выгрузки в файл, вывод через «ТабличныйДокумент» замедляет обработку в разы. Разработчики часто сталкиваются с этим при массовой печати, формировании файлов Excel, передаче данных в веб-сервисы и при работе регламентных заданий на сервере.
Обойти табличный документ можно несколькими способами: получать данные напрямую запросом и обрабатывать выборку, использовать СКД с выводом в таблицу значений или дерево, формировать файлы без промежуточного макета, а для печати — применять альтернативные механизмы вроде HTML или прямой записи в форматы Office. Выбор зависит от конечной цели: ускорить обработку, уменьшить потребление памяти или избавиться от ограничений табличного документа на сервере и в веб-клиенте.
Ниже разобраны рабочие сценарии с примерами кода, условия выбора каждого подхода, способы проверки результата и типичные ошибки, которые приводят к потере данных или падению производительности.
Когда табличный документ действительно не нужен
Главный критерий — наличие визуального результата. Табличный документ оправдан, когда пользователь должен увидеть отчёт на экране, отредактировать его перед печатью или сохранить как mxl-файл. Если же результат обработки уходит в файл обмена, в другую информационную базу, в письмо или в расчёт, визуальный слой только мешает.
Типичные ситуации, где табличный документ создаётся по привычке, хотя не нужен: выгрузка прайса в Excel, формирование данных для сайта, расчёт показателей для регистра, массовая рассылка, подготовка XML-файлов. Во всех этих случаях данные логично получать выборкой запроса или таблицей значений и сразу сериализовать в нужный формат.
Отдельная категория — серверные и фоновые процессы. В регламентных заданиях и при вызове с тонкого или веб-клиента работа с табличным документом ограничена или невозможна без передачи на клиента. Попытка сформировать табличный документ в фоновом задании и показать его пользователю требует дополнительной механики (временное хранилище, ожидание завершения), тогда как прямая обработка данных решает задачу проще.
Как выбрать действие
Получение данных запросом без промежуточного вывода
Самый прямой способ обойти табличный документ — вообще не связываться с макетами и областями, а выполнить запрос и обойти результат в цикле. Метод Выгрузить() результата запроса возвращает таблицу значений, с которой удобно работать программно: обращаться к колонкам по именам, фильтровать, сворачивать, искать строки.
Для больших выборок выгрузка всей таблицы в память может быть избыточной. В этом случае используйте обход выборки через Выбрать() — данные читаются порциями, и потребление памяти остаётся низким даже при сотнях тысяч строк. Это особенно важно при формировании файлов выгрузки на сервере с ограниченными ресурсами.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Товар,
| Номенклатура.Артикул КАК Артикул
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
// Прямая обработка: запись в файл, расчёт, обмен
СтрокаФайла = Выборка.Артикул + ";" + Строка(Выборка.Товар);
КонецЦикла;
Признак правильно выбранного подхода: обработка не обращается к объектам ТабличныйДокумент, ПолеТабличногоДокумента и не вызывает методы Вывести() или Присоединить(). Если в коде обмена или расчёта встречаются эти вызовы — это сигнал к рефакторингу.
СКД с выводом в таблицу значений вместо табличного документа
Если отчёт построен на СКД и его логику (отборы, группировки, ресурсы) хочется сохранить, но результат нужен для программной обработки, используйте ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений. Он выводит результат компоновки в таблицу значений или дерево значений, минуя табличный документ полностью.
Такой подход сохраняет все преимущества СКД: пользовательские настройки, параметры, вычисляемые поля, итоги по группировкам. При этом результат доступен как обычная таблица — его можно выгрузить в файл, передать в другую процедуру или использовать для заполнения документов.
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,
Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
РезультатТаблица = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(РезультатТаблица);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
Ключевая деталь — тип генератора макета: ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений. Если оставить стандартный генератор (для табличного документа), вывод в коллекцию значений завершится ошибкой. Это одна из самых частых причин «неработающего» кода у тех, кто переносит пример из типового отчёта.
Формирование файлов напрямую: Excel, CSV, HTML
Частая задача — «напечатать» документ в Excel, минуя табличный документ. Прямая запись в файл через COM-объект Excel (на Windows-сервере с установленным Office) или через формирование CSV/HTML даёт результат быстрее и без ограничений платформы. CSV подходит для простых табличных данных, HTML — когда нужно минимальное форматирование, понятное браузеру и Excel.
Для CSV достаточно текстового документа: построчно записывайте значения через разделитель, экранируя кавычки и переводы строк внутри полей. Учтите кодировку: для корректного открытия кириллицы в Excel обычно используют UTF-8 с BOM или Windows-1251 — выбор зависит от того, кем и как будет открываться файл.
HTML-вариант удобен тем, что один и тот же файл можно открыть в браузере, отправить письмом как тело сообщения и открыть в Excel с сохранением базового форматирования (жирный шрифт, цвет, границы через inline-стили). При этом не требуется ни табличный документ, ни внешние компоненты.
Массовая печать и фоновые задания без табличного документа
При массовой печати сотен документов формирование табличного документа для каждого объекта — основной источник накладных расходов. Если печать всё же нужна, но показ пользователю не требуется, сформируйте один общий файл (например, многостраничный HTML или объединённый xlsx) вместо набора табличных документов. Это сокращает и время формирования, и объём передаваемых между сервером и клиентом данных.
В фоновых заданиях табличный документ технически можно создать на сервере, но показать его пользователю напрямую нельзя — приходится помещать во временное хранилище и извлекать на клиенте. Если конечная цель задания — файл или обновление данных в базе, обход табличного документа убирает целый слой проблем: не нужно хранилище, не нужна синхронизация состояния, меньше риск превышения таймаута.
- 1Определите, что является конечным результатом: файл, запись в базу, сообщение, расчёт
- 2Замените обход областей макета на запрос или СКД с выводом в таблицу значений
- 3Перенесите логику форматирования в сериализацию (CSV, HTML, XML) или уберите её совсем
- 4Удалите создание ТабличныйДокумент и вызовы Вывести()/Присоединить()
- 5Протестируйте на большом объёме данных и сравните время выполнения и результат со старой версией
Проверка результата после отказа от табличного документа
Главный риск при обходе табличного документа — потеря данных, которые раньше «вычислялись» при выводе: итоги по группам, номера строк, склеенные представления. После рефакторинга сравните результат новой обработки со старой на одном и том же наборе данных: количество строк, суммы по ключевым полям, состав колонок. Расхождение хотя бы в одном итоге — признак того, что часть логики осталась в макете и не была перенесена.
Проверяйте также граничные случаи: пустой результат запроса (файл должен создаться пустым или обработка должна корректно сообщить об отсутствии данных), значения NULL в полях (при конкатенации строк они дают ошибку — приводите через ЕСТЬNULL в запросе или проверяйте в коде), спецсимволы в строковых полях при выгрузке в CSV и XML.
Как проверить результат
Совпадает с числом строк старой обработки или контрольного запроса
Строк меньше — вероятно, потеряна часть данных при замене макета
Итоги по числовым полям совпадают с отчётом-эталоном
Суммы расходятся — не перенесены группировки или ресурсы СКД
CSV/HTML/xlsx открывается в целевой программе, кириллица читается
Кракозябры или битая структура — неверная кодировка или экранирование
Обработка выполняется быстрее прежней версии или сопоставимо
Стало медленнее — вероятно, запрос в цикле вместо одного пакетного запроса
Типичные ошибки и ограничения
Самая распространённая ошибка — заменить табличный документ на запрос в цикле. Разработчик убирает макет, но внутри обхода выборки выполняет отдельный запрос для каждой строки (например, получает цену или остаток по каждому товару). Производительность падает катастрофически, хотя формально табличного документа больше нет. Все данные нужно получать одним или несколькими пакетными запросами с соединениями и виртуальными таблицами.
Вторая группа ошибок связана с форматами: неэкранированные кавычки и точки с запятой ломают CSV, незакрытые теги ломают HTML, а запись XML через конкатенацию строк вместо объекта ЗаписьXML приводит к невалидным файлам при первом же спецсимволе в данных. Для XML всегда используйте штатные объекты записи — они гарантируют корректное экранирование.
FAQ
Что важно запомнить
Табличный документ нужен только для визуального результата. Для обмена, расчётов и файлов получайте данные запросом или СКД с выводом в коллекцию значений, сериализуйте напрямую и проверяйте итоги на контрольном наборе данных.
Можно ли сформировать печатную форму, вообще не создавая табличный документ?
Да, если печать означает файл. Сформируйте HTML или xlsx программно и отправьте на печать средствами ОС или отдайте пользователю файл. Но если требуется стандартный предпросмотр 1С с возможностью редактирования перед печатью, табличный документ остаётся штатным инструментом.
Что быстрее: обход выборки запроса или выгрузка в таблицу значений?
Для больших объёмов обход выборки экономичнее по памяти, так как данные читаются порциями. Таблица значений удобнее, когда нужен повторный обход, сортировка или поиск, но весь результат загружается в память. На малых объёмах разница незаметна.
Как вывести СКД в дерево значений, а не в таблицу?
Используйте тот же процессор вывода в коллекцию значений, но передайте в УстановитьОбъект() дерево значений. Группировки схемы сформируют иерархию дерева. Это удобно для данных с вложенностью: заказы с составом, иерархические справочники.
Работает ли формирование Excel через COM-объект на сервере Linux?
Нет, COM-технология доступна только в Windows и требует установленного Office. Для сервера на Linux формируйте CSV, HTML или используйте внешние библиотеки генерации xlsx, не зависящие от Office.
Почему после отказа от табличного документа пропали итоги по группам?
В макете табличного документа итоги часто выводились отдельными областями или считались параметрами макета. При прямой обработке их нужно вычислять явно: итогами в запросе (ИТОГИ ПО), ресурсами СКД или накоплением в коде при обходе выборки.
Можно ли показать пользователю результат фонового задания без табличного документа?
Да. Поместите таблицу значений или сформированный файл во временное хранилище, а на клиенте извлеките и выведите в таблицу на форме или предложите сохранить файл. Табличный документ для этого не обязателен.