Разработка и Конфигурация · 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, и в сторонних программах.
Способ 5. Сохранение в Excel через табличный документ
Если файл нужен пользователю «для просмотра», таблицу значений выводят в объект ТабличныйДокумент и сохраняют его методом Записать с типом файла ТипФайлаТабличногоДокумента.XLSX:
ТабДок = Новый ТабличныйДокумент;
// Шапка
НомерСтроки = 1;
НомерКолонки = 1;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ТабДок.Область(НомерСтроки, НомерКолонки).Текст = Колонка.Имя;
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
// Данные
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
НомерСтроки = НомерСтроки + 1;
НомерКолонки = 1;
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ТабДок.Область(НомерСтроки, НомерКолонки).Текст = Строка(СтрокаТЗ[Колонка.Имя]);
НомерКолонки = НомерКолонки + 1;
КонецЦикла;
КонецЦикла;
ТабДок.Записать("D:\Обмен\Таблица.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Записывать значения через свойство Текст удобно, но все данные окажутся строками. Если в Excel нужны числа для дальнейших расчётов, используйте параметр области или выводите через Параметры макета с сохранением типа значения. Учтите, что на сервере без установленного офисного пакета запись XLSX всё равно работает — платформа формирует файл самостоятельно.
Сравнение вариантов
Быстро и сохраняет типы, но файл читается только платформой 1С
Подходит для обмена между базами 1С и внешними системами, объём файла больше
Оптимален для веб-интеграций, требует ручного преобразования типов
Простой и компактный для Excel, но без типов данных и с риском проблем разделителей
Готовый вид для пользователя, медленнее на больших таблицах
Клиент-серверные особенности и диалог выбора файла
В клиент-серверном режиме код выполняется на сервере, а файл часто нужен на компьютере пользователя. Прямая запись в путь вида 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 через табличный документ. В клиент-серверном режиме передавайте файл клиенту через временное хранилище. Всегда проверяйте результат: существование файла, кодировку, количество строк и возможность обратного чтения.