Разработка и Конфигурация · 10 мин
Как выгрузить таблицу значений в файл в 1С
Способы выгрузки таблицы значений в файл в 1С: ТабличныйДокумент, текстовый CSV, COM соединение с Excel. Примеры кода, ошибки и проверка результата.
Таблица значений в 1С — это объект в оперативной памяти, у которого нет встроенного метода «сохранить в файл». Чтобы выгрузить её наружу, разработчик выбирает один из промежуточных механизмов: табличный документ (MXL, Excel, PDF), текстовый файл с разделителями (CSV), сериализацию через ЗначениеВФайл или передачу данных через COM-соединение в Excel. Выбор зависит от того, кто будет читать файл — человек или другая программа.
Ниже разобраны рабочие способы с примерами кода на встроенном языке 1С, ограничения каждого подхода, типичные ошибки и способы проверить, что выгрузка прошла корректно. Примеры ориентированы на управляемые формы и толстый клиент, отличия указаны отдельно.
Как выбрать формат выгрузки под задачу
Прежде чем писать код, определите потребителя файла. Если файл откроет бухгалтер в Excel — нужен ТабличныйДокумент с сохранением в формате XLSX или ODS. Если файл заберёт другая информационная система (сайт, кассовое ПО, сторонняя учётная программа) — надёжнее CSV с явной кодировкой и разделителем. Если файл нужен только самой 1С для промежуточного хранения — подойдёт сериализация через ЗначениеВФайл.
Второй критерий — объём. Табличный документ при большом числе строк (десятки тысяч и больше) потребляет много памяти и сохраняется медленно. CSV пишется построчно и практически не ограничен по объёму. Третий критерий — нужно ли сохранять форматирование (цвета, ширину колонок, объединённые ячейки): его даёт только табличный документ.
Сравнение способов выгрузки
Для человека: печатные формы, отчёты, файлы для Excel. Ограничение — высокий расход памяти на больших таблицах.
Для обмена между системами и больших объёмов. Ограничение — нет типов данных и форматирования, всё становится текстом.
Для служебного хранения и передачи между базами 1С. Ограничение — файл читается только платформой 1С.
Когда нужны формулы, листы, автофильтры в готовом файле. Ограничение — требуется установленный Excel на машине, работает медленно и только на Windows.
Выгрузка через табличный документ в Excel и MXL
Самый распространённый способ: перенести таблицу значений в объект ТабличныйДокумент построчно, а затем вызвать метод Записать с указанием типа файла. Так вы получаете файл, который открывается в Excel, и можете задать заголовки колонок, ширину и оформление.
Базовый вариант кода выглядит так:
ТабДок = Новый ТабличныйДокумент;
// Заголовки колонок
НомерКолонки = 1;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ТабДок.Область(1, НомерКолонки).Текст = Колонка.Имя;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Данные
НомерСтроки = 2;
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
НомерКолонки = 1;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ТабДок.Область(НомерСтроки, НомерКолонки).Текст =
Строка(СтрокаТЗ[Колонка.Имя]);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
ТабДок.Записать("C:\Выгрузка\Данные.xlsx",
ТипФайлаТабличногоДокумента.XLSX);
Обратите внимание: значения приводятся к строке явно. Если записать в область дату или число как есть, в Excel они могут попасть в текстовом виде и не участвовать в формулах. Для чисел и дат используйте параметр области СодержитЗначение и присваивайте значение без преобразования в строку.
Выгрузка в CSV построчно
CSV — самый надёжный формат для обмена: файл читается и Excel, и любой другой программой. Суть метода — сформировать строки с разделителем (точка с запятой для русской локали Excel, запятая для английской) и записать их через объект ТекстовыйДокумент или ЗаписьТекста.
Запись = Новый ЗаписьТекста("C:\Выгрузка\Данные.csv",
КодировкаТекста.UTF8);
// Заголовок
МассивЗаголовков = Новый Массив;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
МассивЗаголовков.Добавить(Колонка.Имя);
КонецЦикла;
Запись.ЗаписатьСтроку(
СтрСоединить(МассивЗаголовков, ";"));
// Строки данных
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
МассивЗначений = Новый Массив;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
МассивЗначений.Добавить(
Строка(СтрокаТЗ[Колонка.Имя]));
КонецЦикла;
Запись.ЗаписатьСтроку(
СтрСоединить(МассивЗначений, ";"));
КонецЦикла;
Запись.Закрыть();
Три тонких места. Первое — кодировка: UTF-8 с BOM корректно открывается в Excel, ANSI может «сломать» кириллицу у получателя. Второе — разделитель внутри данных: если в значениях встречается точка с запятой или перевод строки, такие значения нужно обрамлять кавычками, иначе колонки «поедут». Третье — даты и числа: приводите их к нужному виду через Формат(), иначе получите представление по умолчанию, которое зависит от региональных настроек.
Сериализация через ЗначениеВФайл
Если файл нужен только для хранения или передачи между базами 1С, используйте функцию ЗначениеВФайл(ИмяФайла, ТаблицаЗначений). Таблица сохраняется во внутреннем формате платформы вместе с типами колонок, и обратно восстанавливается одной строкой: ТЗ = ЗначениеИзФайла(ИмяФайла).
Способ удобен для кэширования промежуточных расчётов и отладки, но у него жёсткое ограничение: файл не откроет ничто, кроме платформы 1С совместимой версии. Передавать такой файл контрагенту или загружать в стороннюю систему нельзя. Также проверяйте права на каталог: на сервере 1С запись выполняется от имени служебной учётной записи агента, и у неё может не быть доступа к сетевым папкам пользователя.
Выгрузка через COM-соединение с Excel
Когда готовый файл должен содержать несколько листов, автофильтр, формулы или закреплённые строки, используют прямое обращение к Excel через COM-объект Excel.Application. Платформа создаёт экземпляр Excel, заполняет ячейки и сохраняет книгу.
Этот путь оправдан только при реальной необходимости: он работает заметно медленнее табличного документа, требует установленного Excel на том компьютере, где выполняется код (на сервере 1С под Linux его нет), и при аварийном завершении кода процесс EXCEL.EXE может остаться висеть в памяти. Всегда оборачивайте работу в Попытка/Исключение и в блоке исключения вызывайте Quit() у приложения Excel.
Проверка результата выгрузки
После записи файла не ограничивайтесь отсутствием ошибок — проверьте содержимое. Откройте файл и сравните число строк с количеством строк таблицы значений (в CSV не забудьте про строку заголовка). Проверьте первую и последнюю строки: первая покажет корректность заголовков, последняя — что цикл не оборвался раньше времени.
Для CSV дополнительно откройте файл в «Блокноте» или другом текстовом редакторе: так вы увидите реальные разделители и кодировку, которые Excel скрывает. Для XLSX проверьте типы данных: встаньте на ячейку с числом — если она выровнена влево и помечена как текст, значение записано строкой.
Как проверить результат
Совпадает с числом строк таблицы значений плюс заголовок
Строк меньше — цикл прервался или часть данных не выгрузилась
Текст читается в Excel и в текстовом редакторе
Крякозябры — несовпадение кодировки записи и открытия
Числа выровнены вправо, участвуют в формулах
Значения с зелёным треугольником — записаны как текст
Больше нуля и соответствует объёму данных
Нулевой размер — файл создан, но запись не выполнена или не закрыта
Частые вопросы
Можно ли выгрузить таблицу значений в файл без программирования?
Да, если таблица выведена в табличный документ отчёта: в пользовательском режиме используйте «Файл → Сохранить как» и выберите формат Excel, PDF или MXL. Для таблиц, которые видны только в коде (например, результат запроса в обработке), потребуется либо вывести их в табличный документ, либо написать процедуру выгрузки.
Почему Excel открывает CSV в одной колонке?
Разделитель в файле не совпадает с разделителем из региональных настроек Windows. В русской локали Excel по умолчанию ждёт точку с запятой. Либо пишите в файл «;», либо открывайте CSV через «Данные → Из текста» с явным указанием разделителя.
Как выгрузить таблицу значений на клиенте в тонком или веб-клиенте?
Прямая запись в произвольный путь на клиенте ограничена. Сформируйте файл на сервере, поместите данные во временное хранилище (ПоместитьВоВременноеХранилище), а на клиенте сохраните через ПолучитьФайл или диалог сохранения. Для табличного документа доступен метод Записать с интерактивным выбором имени файла.
Что делать, если таблица содержит миллион строк?
Табличный документ и COM исключаются из-за памяти и скорости. Используйте построчную запись CSV через ЗаписьТекста — память при этом почти не растёт. При необходимости разбейте выгрузку на несколько файлов по диапазонам строк.
Как сохранить типы данных при передаче таблицы в другую базу 1С?
Используйте ЗначениеВФайл/ЗначениеИзФайла или сериализацию через СериализаторXDTO с записью в XML. Оба способа сохраняют типы колонок и значения, включая ссылки, если они существуют в базе-приёмнике. CSV и Excel типы не сохраняют.
Файл создаётся, но пустой — в чём причина?
Чаще всего объект ЗаписьТекста или ТекстовыйДокумент не был закрыт или не вызван метод Записать, и буфер не сброшен на диск. Проверьте, что в конце кода вызывается Закрыть() или Записать(), и что между созданием файла и записью не возникло исключения, прервавшего выполнение.
Что важно запомнить
Прямого метода «выгрузить в файл» у таблицы значений нет — выбирайте промежуточный механизм под потребителя файла: табличный документ для Excel и печати, CSV для обмена и больших объёмов, ЗначениеВФайл для служебных задач. Контролируйте кодировку, разделитель, типы значений и права на каталог, а после записи проверяйте файл по числу строк и содержимому.