Разработка и Конфигурация · 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С, закрытый формат.
Читается Excel и любыми системами. Типы теряются, нужно экранировать разделители.
Готовое оформление для пользователя. Медленнее на больших объёмах.
Строгая структура, валидация по схеме. Больше кода, нужна фабрика XDTO или ручная запись.
Способ 4. Сериализация в XML
Для интеграций с другими системами часто требуется XML. Простой путь — объект ЗаписьXML с ручным обходом таблицы. Строгий путь — описать структуру пакетом XDTO и сериализовать через фабрику, тогда файл можно валидировать по схеме.
Запись = Новый ЗаписьXML;
Запись.ОткрытьФайл("C:\Обмен\Таблица.xml");
Запись.ЗаписатьНачалоЭлемента("Таблица");
Для Каждого СтрокаТЗ Из Таблица Цикл
Запись.ЗаписатьНачалоЭлемента("Строка");
Для Каждого Колонка Из Таблица.Колонки Цикл
Запись.ЗаписатьНачалоЭлемента(Колонка.Имя);
Запись.ЗаписатьТекст(XMLСтрока(СтрокаТЗ[Колонка.Имя]));
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
КонецЦикла;
Запись.ЗаписатьКонецЭлемента();
Запись.Закрыть();
Имена колонок должны быть допустимыми именами XML-элементов: без пробелов и спецсимволов, не начинаться с цифры. Если колонки таблицы создавались динамически и их имена не контролируются, безопаснее писать пары «имя-значение» в атрибуты или фиксированные элементы <Колонка Имя="...">.
Клиент-серверный режим: где физически создаётся файл
Частая причина «файл записался, но его нет» — путаница между сервером и клиентом. Код, выполняющийся в серверной процедуре, пишет файл в файловую систему сервера 1С, а не на диск пользователя. Пользователь затем ищет файл у себя и не находит.
Типовой шаблон обмена файлом с клиента выглядит так: на сервере таблица записывается во временный файл, его содержимое помещается во временное хранилище, а на клиенте данные из хранилища сохраняются через ПолучитьФайл или диалог сохранения. В тонком и веб-клиенте прямая запись на диск без диалога ограничена — используйте НачатьПолучениеФайлов или диалоги ДиалогСохраненияФайла.
- 1На сервере: сформируйте таблицу и запишите её во временный файл (ПолучитьИмяВременногоФайла)
- 2Поместите файл во временное хранилище: ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайла), УникальныйИдентификаторФормы)
- 3Удалите временный файл на сервере
- 4На клиенте: вызовите ПолучитьФайл(АдресХранилища, ИмяФайла, Истина) и покажите диалог сохранения
- 5Проверьте, что файл открылся и содержит все строки
Проверка результата и типичные ошибки
После записи всегда проверяйте результат: откройте файл тем инструментом, которым его будут читать. Для CSV — в Excel или текстовом редакторе с явным указанием кодировки, для XML — в браузере (он покажет ошибку разбора, если структура нарушена), для MXL — открыв файл в 1С через «Файл → Открыть».
Как проверить результат
Больше нуля и растёт пропорционально числу строк
0 байт или подозрительно маленький файл
Число строк файла = строки таблицы + заголовок
Строк меньше — обрыв записи или фильтрация в коде
Кириллица читается в целевой программе
Иероглифы — несовпадение кодировок
Браузер открывает файл без ошибок
Сообщение об ошибке разбора — незакрытые элементы
Если таблица большая (сотни тысяч строк), формируйте файл порциями и сбрасывайте буфер, а не собирайте весь текст в одну строковую переменную — конкатенация длинных строк в 1С резко замедляет выполнение и расходует память.
Частые вопросы
Как записать таблицу значений в Excel без табличного документа?
Можно сформировать CSV и открыть его в Excel — это проще и быстрее. Если нужен именно XLSX с форматированием, используйте ТабличныйДокумент с типом файла XLSX: других штатных способов создать настоящий XLSX в платформе нет.
Чем отличается ЗначениеВФайл от СохранитьЗначениеВФайл?
Это два имени одного механизма: в разных версиях синтакс-помощника встречается оба варианта, работают они одинаково — сохраняют значение во внутреннем формате платформы для последующего чтения функцией ЗначениеИзФайла.
Почему в CSV вместо значения колонки попадает «СправочникСсылка...»?
Функция Строка() для ссылочных типов возвращает представление, но при неявном преобразовании может попасть служебное значение. Явно выгружайте нужные реквизиты: наименование, код или GUID — в зависимости от того, как файл будет загружаться обратно.
Как записать таблицу в файл на веб-клиенте?
Прямая запись на диск недоступна. Сформируйте файл на сервере, поместите двоичные данные во временное хранилище и на клиенте вызовите ПолучитьФайл с диалогом сохранения — пользователь сам выберет папку.
Можно ли записать таблицу значений сразу в XML через СериализаторXDTO?
Напрямую таблица значений не сериализуется стандартным СериализаторXDTO — это не объект данных конфигурации. Нужно либо описать собственную структуру пакетом XDTO и заполнить её из таблицы, либо формировать XML вручную через ЗаписьXML.
Какой формат выбрать для передачи таблицы в другую базу 1С?
Если обе базы под вашим контролем, проще всего ЗначениеВФайл — сохраняются типы и структура колонок без дополнительного кода. Если обмен должен быть прозрачным и отлаживаемым, используйте XML с явной структурой.
Что важно запомнить
Для обмена между базами 1С используйте ЗначениеВФайл, для внешних программ — CSV или XML, для пользователя — табличный документ с записью в XLSX или MXL. Всегда учитывайте, где выполняется код (сервер или клиент), и проверяйте файл после записи: размер, число строк и кодировку.