К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как записать таблицу значений в файл в 1С

Как записать таблицу значений в файл в 1С: методы ЗначениеВФайл, выгрузка в CSV, MXL и XML. Примеры кода, типичные ошибки и проверка результата.

Таблица значений в 1С — универсальная коллекция для промежуточного хранения данных: результатов запросов, выборок из документов, данных для обмена. Рано или поздно возникает задача сохранить такую таблицу во внешний файл — для передачи в другую систему, архивации или отладки. Встроенный язык предлагает несколько способов: сериализацию через «ЗначениеВФайл», построчную выгрузку в CSV или текст, запись через табличный документ в MXL и Excel, а также универсальную выгрузку в XML.

Выбор метода зависит от цели. Если файл будет читать только другая база 1С, проще всего использовать внутренний формат «ЗначениеВФайл». Если данные нужны сторонней программе — подойдут CSV или XML. Для печатных форм и визуального просмотра удобен табличный документ. Ниже разобраны все основные варианты с рабочим кодом и ограничениями каждого подхода.

Способ 1. Метод ЗначениеВФайл — внутренний формат 1С

Глобальный метод ЗначениеВФайл(<ИмяФайла>, <Значение>) сохраняет произвольное значение, включая таблицу значений, в файл собственного формата платформы. Дополнительный третий параметр позволяет задать сжатие. Это самый короткий код для задачи «сохранить и потом прочитать обратно в 1С».

Процедура СохранитьТаблицу(Таблица) Экспорт

ИмяФайла = "C:\Обмен\ТаблицаДанных.dat";

ЗначениеВФайл(ИмяФайла, Таблица);

КонецПроцедуры

Процедура ЗагрузитьТаблицу() Экспорт

Таблица = ЗначениеИзФайла("C:\Обмен\ТаблицаДанных.dat");

// Таблица — снова полноценная ТаблицаЗначений

КонецПроцедуры

Главное ограничение: файл нечитаем ни для человека, ни для сторонних программ — формат бинарный и закрытый. Также стоит учитывать, что метод выполняется там, где выполняется код: в клиент-серверном режиме при вызове на сервере файл создастся на сервере, а не на компьютере пользователя. Для записи на клиентскую машину сначала передайте таблицу на клиента и выполните сохранение там, либо используйте временное хранилище и ПолучитьФайл.

Способ 2. Выгрузка в CSV или текстовый файл построчно

CSV — самый распространённый формат обмена табличными данными. В 1С его формируют вручную: перебирают строки таблицы, соединяют значения колонок через разделитель и пишут в объект Текст (в новых версиях синтаксиса — ТекстовыйДокумент через ЗаписьТекста).

Процедура ВыгрузитьВCSV(Таблица, ИмяФайла) Экспорт

Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);

// Заголовок из имён колонок

Заголовок = "";

Для Каждого Колонка Из Таблица.Колонки Цикл

Заголовок = Заголовок + ?(Заголовок = "", "", ";") + Колонка.Имя;

КонецЦикла;

Запись.ЗаписатьСтроку(Заголовок);

// Данные

Для Каждого СтрокаТЗ Из Таблица Цикл

СтрокаФайла = "";

Для Каждого Колонка Из Таблица.Колонки Цикл

Значение = Строка(СтрокаТЗ[Колонка.Имя]);

СтрокаФайла = СтрокаФайла + ?(СтрокаФайла = "", "", ";") + Значение;

КонецЦикла;

Запись.ЗаписатьСтроку(СтрокаФайла);

КонецЦикла;

Запись.Закрыть();

КонецПроцедуры

Обратите внимание на нюансы. Разделитель «;» стандартен для русской локали Excel, «,» — для английской. Если значения могут содержать разделитель или переводы строк, их нужно обрамлять кавычками и удваивать внутренние кавычки по правилам CSV. Кодировка UTF-8 с BOM обычно корректно открывается в Excel; без BOM кириллица может отображаться «кракозябрами».

Способ 3. Запись через табличный документ (MXL, Excel, HTML)

Если таблицу нужно не только сохранить, но и красиво показать пользователю, удобно перенести её в ТабличныйДокумент, а затем вызвать метод Записать с нужным типом файла: MXL (родной формат 1С), XLSX, ODS, HTML или PDF.

ТабДок = Новый ТабличныйДокумент;

// Шапка

НомерКолонки = 1;

Для Каждого Колонка Из Таблица.Колонки Цикл

ТабДок.Область(1, НомерКолонки).Текст = Колонка.Имя;

НомерКолонки = НомерКолонки + 1;

КонецЦикла;

// Данные

НомерСтроки = 2;

Для Каждого СтрокаТЗ Из Таблица Цикл

НомерКолонки = 1;

Для Каждого Колонка Из Таблица.Колонки Цикл

ТабДок.Область(НомерСтроки, НомерКолонки).Текст =

Строка(СтрокаТЗ[Колонка.Имя]);

НомерКолонки = НомерКолонки + 1;

КонецЦикла;

НомерСтроки = НомерСтроки + 1;

КонецЦикла;

ТабДок.Записать("C:\Обмен\Отчет.xlsx", ТипФайлаТабличногоДокумента.XLSX);

Этот способ даёт готовый к печати и просмотру результат, но при больших объёмах (десятки тысяч строк) работает медленнее построчной записи текста, потому что каждая ячейка — объект с оформлением. Для «сырого» обмена данными CSV эффективнее, для отчёта пользователю — табличный документ.

Сравнение способов записи

ЗначениеВФайл

Одна строка кода, полное сохранение типов. Только для чтения из 1С, закрытый формат.

CSV построчно

Читается Excel и любыми системами. Типы теряются, нужно экранировать разделители.

Табличный документ → XLSX/MXL/PDF

Готовое оформление для пользователя. Медленнее на больших объёмах.

XML / XDTO

Строгая структура, валидация по схеме. Больше кода, нужна фабрика XDTO или ручная запись.

Способ 4. Сериализация в XML

Для интеграций с другими системами часто требуется XML. Простой путь — объект ЗаписьXML с ручным обходом таблицы. Строгий путь — описать структуру пакетом XDTO и сериализовать через фабрику, тогда файл можно валидировать по схеме.

Запись = Новый ЗаписьXML;

Запись.ОткрытьФайл("C:\Обмен\Таблица.xml");

Запись.ЗаписатьНачалоЭлемента("Таблица");

Для Каждого СтрокаТЗ Из Таблица Цикл

Запись.ЗаписатьНачалоЭлемента("Строка");

Для Каждого Колонка Из Таблица.Колонки Цикл

Запись.ЗаписатьНачалоЭлемента(Колонка.Имя);

Запись.ЗаписатьТекст(XMLСтрока(СтрокаТЗ[Колонка.Имя]));

Запись.ЗаписатьКонецЭлемента();

КонецЦикла;

Запись.ЗаписатьКонецЭлемента();

КонецЦикла;

Запись.ЗаписатьКонецЭлемента();

Запись.Закрыть();

Имена колонок должны быть допустимыми именами XML-элементов: без пробелов и спецсимволов, не начинаться с цифры. Если колонки таблицы создавались динамически и их имена не контролируются, безопаснее писать пары «имя-значение» в атрибуты или фиксированные элементы <Колонка Имя="...">.

Клиент-серверный режим: где физически создаётся файл

Частая причина «файл записался, но его нет» — путаница между сервером и клиентом. Код, выполняющийся в серверной процедуре, пишет файл в файловую систему сервера 1С, а не на диск пользователя. Пользователь затем ищет файл у себя и не находит.

Типовой шаблон обмена файлом с клиента выглядит так: на сервере таблица записывается во временный файл, его содержимое помещается во временное хранилище, а на клиенте данные из хранилища сохраняются через ПолучитьФайл или диалог сохранения. В тонком и веб-клиенте прямая запись на диск без диалога ограничена — используйте НачатьПолучениеФайлов или диалоги ДиалогСохраненияФайла.

Порядок действий при выгрузке с сервера на клиент
  1. 1
    На сервере: сформируйте таблицу и запишите её во временный файл (ПолучитьИмяВременногоФайла)
  2. 2
    Поместите файл во временное хранилище: ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификаторФормы)
  3. 3
    Удалите временный файл на сервере
  4. 4
    На клиенте: вызовите ПолучитьФайл(АдресХранилища, ИмяФайла, Истина) и покажите диалог сохранения
  5. 5
    Проверьте, что файл открылся и содержит все строки

Проверка результата и типичные ошибки

После записи всегда проверяйте результат: откройте файл тем инструментом, которым его будут читать. Для CSV — в Excel или текстовом редакторе с явным указанием кодировки, для XML — в браузере (он покажет ошибку разбора, если структура нарушена), для MXL — открыв файл в 1С через «Файл → Открыть».

Типичные ошибки
01
Запись на сервере при ожидании файла на клиенте — пользователь не находит файл у себя
02
Кодировка ANSI вместо UTF-8 — кириллица в CSV отображается нечитаемо
03
Значения с разделителем внутри без кавычек — в CSV съезжают колонки
04
Запись ссылки на объект вместо представления — в файле оказывается служебная строка вместо понятного значения
05
Не закрыт объект ЗаписьТекста/ЗаписьXML — файл оказывается пустым или обрезанным из-за буферизации
Контрольные точки

Как проверить результат

Размер файла
Норма

Больше нуля и растёт пропорционально числу строк

Тревожный признак

0 байт или подозрительно маленький файл

Количество строк
Норма

Число строк файла = строки таблицы + заголовок

Тревожный признак

Строк меньше — обрыв записи или фильтрация в коде

Кодировка
Норма

Кириллица читается в целевой программе

Тревожный признак

Иероглифы — несовпадение кодировок

Структура XML
Норма

Браузер открывает файл без ошибок

Тревожный признак

Сообщение об ошибке разбора — незакрытые элементы

Если таблица большая (сотни тысяч строк), формируйте файл порциями и сбрасывайте буфер, а не собирайте весь текст в одну строковую переменную — конкатенация длинных строк в 1С резко замедляет выполнение и расходует память.
ПЗ
Практическое замечание

Частые вопросы

Как записать таблицу значений в Excel без табличного документа?

Можно сформировать CSV и открыть его в Excel — это проще и быстрее. Если нужен именно XLSX с форматированием, используйте ТабличныйДокумент с типом файла XLSX: других штатных способов создать настоящий XLSX в платформе нет.

Чем отличается ЗначениеВФайл от СохранитьЗначениеВФайл?

Это два имени одного механизма: в разных версиях синтакс-помощника встречается оба варианта, работают они одинаково — сохраняют значение во внутреннем формате платформы для последующего чтения функцией ЗначениеИзФайла.

Почему в CSV вместо значения колонки попадает «СправочникСсылка...»?

Функция Строка() для ссылочных типов возвращает представление, но при неявном преобразовании может попасть служебное значение. Явно выгружайте нужные реквизиты: наименование, код или GUID — в зависимости от того, как файл будет загружаться обратно.

Как записать таблицу в файл на веб-клиенте?

Прямая запись на диск недоступна. Сформируйте файл на сервере, поместите двоичные данные во временное хранилище и на клиенте вызовите ПолучитьФайл с диалогом сохранения — пользователь сам выберет папку.

Можно ли записать таблицу значений сразу в XML через СериализаторXDTO?

Напрямую таблица значений не сериализуется стандартным СериализаторXDTO — это не объект данных конфигурации. Нужно либо описать собственную структуру пакетом XDTO и заполнить её из таблицы, либо формировать XML вручную через ЗаписьXML.

Какой формат выбрать для передачи таблицы в другую базу 1С?

Если обе базы под вашим контролем, проще всего ЗначениеВФайл — сохраняются типы и структура колонок без дополнительного кода. Если обмен должен быть прозрачным и отлаживаемым, используйте XML с явной структурой.

Итог

Что важно запомнить

Для обмена между базами 1С используйте ЗначениеВФайл, для внешних программ — CSV или XML, для пользователя — табличный документ с записью в XLSX или MXL. Всегда учитывайте, где выполняется код (сервер или клиент), и проверяйте файл после записи: размер, число строк и кодировку.