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

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

1С: как сохранить таблицу значений в файл

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

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

Выбор способа зависит от того, кто будет читать файл. Если это другая база 1С — подойдут внутренние форматы, если внешняя система или пользователь — нужны универсальные форматы вроде CSV, XML или Excel. Ниже разобраны все рабочие варианты с примерами кода и ограничениями каждого подхода.

Способ 1. Сохранение через ЗначениеВФайл

Самый простой встроенный механизм — функция ЗначениеВФайл. Она сериализует практически любой объект 1С, включая таблицу значений, в специальный внутренний формат и записывает его на диск. Обратное чтение выполняется функцией ЗначениеИзФайла, которая восстанавливает таблицу со всеми типами колонок и данными.

ТаблицаЗначений = Новый ТаблицаЗначений;

ТаблицаЗначений.Колонки.Добавить("Номенклатура");

ТаблицаЗначений.Колонки.Добавить("Количество");

// ... заполнение таблицы ...

ЗначениеВФайл("D:\Обмен\ТаблицаДанных.tmp", ТаблицаЗначений);

Чтение из файла:

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

Главное ограничение способа: файл читается только платформой 1С, причём желательно той же версии. Внешние программы такой файл не откроют. Также при чтении нужно убедиться, что файл существует, — иначе возникнет исключение. Перед вызовом ЗначениеИзФайла проверяйте наличие файла объектом Файл и методом Существует().

Способ 2. Выгрузка в XML

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

Сериализация через XDTO

Метод ЗаписатьXML объекта СериализаторXDTO записывает таблицу значений целиком, включая описание типов колонок:

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

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

СериализаторXDTO.ЗаписатьXML(ЗаписьXML, ТаблицаЗначений);

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

Обратное чтение выполняется через ЧтениеXML и СериализаторXDTO.ПрочитатьXML. Способ удобен тем, что не нужно описывать структуру вручную, но результирующий XML содержит много служебных пространств имён и неудобен для разбора внешними программами.

Ручная запись через ЗаписьXML

Если файл должен читаться сторонней системой, структуру XML формируют вручную — узел на строку таблицы, вложенные элементы на колонки:

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

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

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

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

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

ЗаписьXML.ЗаписатьАтрибут("Номенклатура", Строка(СтрокаТЗ.Номенклатура));

ЗаписьXML.ЗаписатьАтрибут("Количество", Формат(СтрокаТЗ.Количество, "ЧГ="));

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

КонецЦикла;

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

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

Способ 3. Сохранение в JSON

JSON подходит для интеграции с веб-сервисами и внешними приложениями. Таблицу значений нельзя сериализовать в JSON напрямую — сначала её преобразуют в массив структур, а затем записывают через ЗаписьJSON:

МассивСтрок = Новый Массив;

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

СтруктураСтроки = Новый Структура;

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

СтруктураСтроки.Вставить(Колонка.Имя, СтрокаТЗ[Колонка.Имя]);

КонецЦикла;

МассивСтрок.Добавить(СтруктураСтроки);

КонецЦикла;

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

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

ЗаписатьJSON(ЗаписьJSON, МассивСтрок);

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

Учтите ограничения: типы данных 1С, не имеющие прямого аналога в JSON (ссылки на объекты, значения перечислений), нужно преобразовывать в строки заранее, иначе получите ошибку сериализации. Даты записываются через параметр ФорматДатыJSON или преобразуются в строку вручную.

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

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

Текст = Новый ТекстовыйДокумент;

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

Текст.ДобавитьСтроку(СтрокаТЗ.Номенклатура + ";" + Формат(СтрокаТЗ.Количество, "ЧГ="));

КонецЦикла;

Текст.Записать("D:\Обмен\Таблица.csv", КодировкаТекста.UTF8);

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

Типичные ошибки
01
Использование запятой как разделителя CSV без учёта локали — Excel склеивает все колонки в одну
02
Числа выводятся с разделителем групп (1 000), и при импорте значение превращается в текст или дату
03
Забытая кодировка: файл в ANSI открывается в Excel с кракозябрами вместо кириллицы
04
В значениях встречается сам разделитель, и структура строки разваливается при чтении

Способ 5. Сохранение в Excel через табличный документ

Если файл нужен пользователю «для просмотра», таблицу значений выводят в объект ТабличныйДокумент и сохраняют его методом Записать с типом файла ТипФайлаТабличногоДокумента.XLSX:

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

// Шапка

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

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

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

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

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

КонецЦикла;

// Данные

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

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

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

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

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

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

КонецЦикла;

КонецЦикла;

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

Записывать значения через свойство Текст удобно, но все данные окажутся строками. Если в Excel нужны числа для дальнейших расчётов, используйте параметр области или выводите через Параметры макета с сохранением типа значения. Учтите, что на сервере без установленного офисного пакета запись XLSX всё равно работает — платформа формирует файл самостоятельно.

Сравнение вариантов

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

Быстро и сохраняет типы, но файл читается только платформой 1С

XML / XDTO

Подходит для обмена между базами 1С и внешними системами, объём файла больше

JSON

Оптимален для веб-интеграций, требует ручного преобразования типов

CSV

Простой и компактный для Excel, но без типов данных и с риском проблем разделителей

XLSX

Готовый вид для пользователя, медленнее на больших таблицах

Клиент-серверные особенности и диалог выбора файла

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

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

Проверка результата и отладка

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

ФайлРезультата = Новый Файл("D:\Обмен\Таблица.xml");

Если Не ФайлРезультата.Существует() Тогда

ВызватьИсключение "Файл не был создан";

КонецЕсли;

Для CSV и Excel откройте файл вручную и проверьте первую и последнюю строки, количество колонок и отображение кириллицы. При больших объёмах замеряйте время записи: вывод сотен тысяч строк в табличный документ может занимать заметное время, и для таких случаев CSV или XML окажутся быстрее.

Контрольные точки

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

Файл создан
Норма

Файл существует, размер больше нуля

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

Файл отсутствует или нулевого размера — ошибка в пути или правах

Содержимое
Норма

Количество строк совпадает с таблицей, кириллица читается

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

Кракозябры, съехавшие колонки, пропущенные строки

Обратное чтение
Норма

Файл читается той же или целевой системой без ошибок

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

Ошибка парсинга — нарушена структура или экранирование

Часто задаваемые вопросы

Можно ли сохранить таблицу значений в файл на клиенте без сервера?

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

Какой формат выбрать для обмена между двумя базами 1С?

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

Почему при открытии CSV в Excel вместо русских букв кракозябры?

Excel по умолчанию открывает CSV в локальной кодировке ANSI. Записывайте файл в UTF-8 с BOM или открывайте его в Excel через мастер импорта данных с явным указанием кодировки 65001 (UTF-8).

Как сохранить в файл только часть колонок таблицы значений?

Создайте новую таблицу методом Копировать() с указанием списка колонок: ТаблицаЗначений.Скопировать(, "Номенклатура,Количество"). Либо при ручной записи в XML, JSON или CSV просто выводите только нужные поля.

Что делать, если таблица очень большая и файл формируется долго?

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

Можно ли защитить сохранённый файл паролем?

Штатных средств шифрования файлов выгрузки в платформе нет. Если данные конфиденциальны, упаковывайте файл в защищённый архив внешними средствами или передавайте по защищённым каналам, а на диске храните только временно.

Итог

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

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