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

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

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

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

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

Универсального метода «Сохранить()» у таблицы значений нет — это частая причина путаницы у начинающих разработчиков. Сохранение всегда выполняется через промежуточный механизм: сериализацию в XML или JSON, упаковку в объект «ХранилищеЗначения», выгрузку в табличный документ или построчную запись в текстовый файл. Каждый вариант имеет свои ограничения по объёму данных, типам колонок и месту применения.

Ниже разобраны основные способы с примерами кода на встроенном языке, условия выбора каждого варианта, типичные ошибки и способы проверить, что данные действительно сохранились и корректно восстанавливаются.

Как определить, какой способ сохранения нужен

Прежде чем писать код, ответьте на три вопроса: где должны лежать данные (в базе или в файле), как долго они нужны (сеанс, дни, постоянно) и кто будет их читать (та же конфигурация, другая программа, человек). От ответов зависит механизм: хранилище значения подходит только для чтения той же конфигурацией, а CSV-файл откроется и в Excel.

Второй критерий — состав колонок. Если в таблице есть колонки с типами, которые не сериализуются напрямую (например, картинки, COM-объекты, результаты запросов), часть форматов отпадает. Хранилище значения через внутреннюю сериализацию переносит почти всё, а JSON и CSV — только простые типы: строки, числа, даты, булево.

Маршрут решения

Как выбрать способ сохранения

Нужно хранить таблицу в базе данных долговременноИспользуйте реквизит типа ХранилищеЗначения у справочника, документа или константы
Нужно передать таблицу между клиентом и сервером или между сеансамиИспользуйте ПоместитьВоВременноеХранилище с уникальным идентификатором формы
Нужен файл для обмена с другой программой или человекомВыгружайте в CSV, табличный документ (MXL, Excel) или JSON
Нужна точная копия таблицы с типами колонок в файлеИспользуйте ЗначениеВСтрокуВнутр или сериализацию через XDTO

Сохранение в базу через хранилище значения

Самый надёжный способ сохранить таблицу значений внутри информационной базы — поместить её в реквизит с типом «ХранилищеЗначения». Такой реквизит можно добавить справочнику, документу, плану обмена или использовать константу с этим типом. Конструктор хранилища принимает таблицу напрямую, при необходимости со сжатием.

// Запись таблицы в реквизит объекта

ОбъектНастройки = Справочники.НастройкиОбмена.НайтиПоКоду("Основная").ПолучитьОбъект();

ОбъектНастройки.ДанныеТаблицы = Новый ХранилищеЗначения(ТаблицаРезультат, Новый СжатиеДанных(9));

ОбъектНастройки.Записать();

// Чтение обратно

СохраненнаяТЗ = ОбъектНастройки.ДанныеТаблицы.Получить();

Если ТипЗнч(СохраненнаяТЗ) = Тип("ТаблицаЗначений") Тогда

// работаем с восстановленной таблицей

КонецЕсли;

Сжатие данных уменьшает размер в базе, но замедляет запись и чтение — для небольших таблиц его можно опустить. Важно помнить: хранилище значения не индексируется и не участвует в запросах, поэтому поиск по содержимому таблицы возможен только после извлечения. Если по данным нужно строить отчёты и отборы, правильнее использовать регистр сведений, а не хранилище.

Сохранение в файл: XML, JSON и внутренний формат

Для выгрузки таблицы в файл есть несколько путей. Самый быстрый в реализации — функция ЗначениеВСтрокуВнутр, которая сериализует таблицу во внутренний формат 1С. Обратное восстановление выполняется функцией ЗначениеИзСтрокиВнутр. Минус очевиден: файл поймёт только платформа 1С, и формат официально не документирован для внешнего использования.

// Сохранение во внутреннем формате

СтрокаДанных = ЗначениеВСтрокуВнутр(ТаблицаРезультат);

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

Текст.УстановитьТекст(СтрокаДанных);

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

// Восстановление

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

Текст.Прочитать("C:\Обмен\таблица.txt", КодировкаТекста.UTF8);

ВосстановленнаяТЗ = ЗначениеИзСтрокиВнутр(Текст.ПолучитьТекст());

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

// Выгрузка в JSON через массив структур

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

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

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

Для Каждого Колонка Из ТаблицаРезультат.Колонки Цикл

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

КонецЦикла;

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

КонецЦикла;

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

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

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

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

Выгрузка в табличный документ и CSV

Когда результат должен увидеть человек, таблицу значений удобно выводить в табличный документ и сохранять в формате MXL, Excel (XLSX) или HTML. Это стандартный сценарий для печатных форм и выгрузок «для бухгалтера». Табличный документ сохраняет оформление, но не хранит типы колонок — при обратном чтении все ячейки придётся приводить к нужным типам вручную.

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

// шапка

Для НомерКолонки = 0 По ТаблицаРезультат.Колонки.Количество() - 1 Цикл

ТабДок.Область(1, НомерКолонки + 1).Текст = ТаблицаРезультат.Колонки[НомерКолонки].Имя;

КонецЦикла;

// данные

Для НомерСтроки = 0 По ТаблицаРезультат.Количество() - 1 Цикл

Для НомерКолонки = 0 По ТаблицаРезультат.Колонки.Количество() - 1 Цикл

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

Строка(ТаблицаРезультат[НомерСтроки][НомерКолонки]);

КонецЦикла;

КонецЦикла;

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

CSV — самый лёгкий формат для обмена: файл пишется построчно через ТекстовыйДокумент, значения разделяются точкой с запятой или запятой. Главные подводные камни — разделитель внутри самих значений, переносы строк в текстовых полях и кодировка. Для Excel обычно используют разделитель «;» и кодировку UTF-8 с BOM, иначе кириллица может отобразиться некорректно.

При выгрузке в CSV экранируйте значения, содержащие разделитель или кавычки: оберните поле в двойные кавычки и удвойте внутренние кавычки. Без этого строки «поедут», и файл не откроется корректно ни в Excel, ни при обратной загрузке в 1С.
ПЗ
Практическое замечание

Передача таблицы между сеансами и процедурами

Отдельная задача — «сохранить» таблицу не на диск, а между вызовами: например, передать её с сервера на клиент в управляемой форме или между фоновым заданием и основным сеансом. Для этого служит временное хранилище. Метод ПоместитьВоВременноеХранилище возвращает адрес, по которому данные доступны в течение сеанса или времени жизни формы.

// На сервере: помещаем таблицу

АдресХранилища = ПоместитьВоВременноеХранилище(ТаблицаРезультат, УникальныйИдентификаторФормы);

// Позже: получаем обратно

ТЗ = ПолучитьИзВременногоХранилища(АдресХранилища);

Если второй параметр (идентификатор формы) не указан, данные живут до конца сеанса или до ближайшего серверного вызова из формы — в зависимости от контекста, и это частая причина ошибки «данные не найдены». Явно передавайте УникальныйИдентификатор формы, чтобы привязать время жизни хранилища к форме. После использования большие таблицы стоит удалять из хранилища явно, чтобы не расходовать память сервера.

Типичные ошибки
01
Попытка вызвать несуществующий метод ТаблицаЗначений.Сохранить() — такого метода нет, нужна сериализация через хранилище или файл
02
Помещение таблицы во временное хранилище без идентификатора формы — данные теряются при следующем серверном вызове
03
Выгрузка ссылочных колонок в JSON или CSV — ссылки превращаются в строки и не восстанавливаются
04
Запись CSV в кодировке по умолчанию — кириллица в Excel отображается иероглифами, нужна UTF-8 с BOM
05
Хранение больших таблиц в хранилище значения без сжатия — база разрастается, чтение замедляется

Проверка результата и восстановление данных

Любое сохранение нужно проверять обратным чтением: запишите таблицу, тут же восстановите её и сравните количество строк, колонок и контрольные значения. Это единственный надёжный способ убедиться, что формат не «съел» типы данных — например, что дата не превратилась в строку, а число не потеряло дробную часть.

Для файловых форматов дополнительно проверьте файл внешними средствами: откройте JSON в текстовом редакторе, CSV — в Excel, XLSX — убедитесь, что шапка и данные на месте. Для хранилища значения полезно вывести в отладке тип восстановленного значения: если Получить() вернуло Неопределено, значит, запись не выполнилась или объект не был записан после изменения реквизита.

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

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

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

Совпадает с исходной таблицей

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

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

Типы значений в колонках
Норма

Даты остаются датами, числа — числами

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

Всё превратилось в строки — формат не сохраняет типы, нужно приведение при загрузке

Открытие файла внешней программой
Норма

JSON/CSV/XLSX читаются, кириллица корректна

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

Иероглифы или сбитые колонки — проблема кодировки или разделителя

Хранилище значения
Норма

Получить() возвращает ТаблицаЗначений

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

Возвращает Неопределено — объект не записан или реквизит не заполнен

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

Можно ли сохранить таблицу значений напрямую в регистр?

Напрямую — нет, регистры хранят записи построчно. Нужно перебрать строки таблицы и для каждой создать запись регистра сведений или движение регистра накопления. Альтернатива — сохранить всю таблицу целиком в реквизит типа ХранилищеЗначения какого-либо объекта, но тогда по ней нельзя будет строить запросы.

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

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

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

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

Почему после восстановления из JSON все значения стали строками?

JSON не хранит типы 1С: даты, ссылки и числа с особыми форматами сериализуются как строки или числа без привязки к типу колонки. При загрузке создайте таблицу с явным описанием типов колонок через ОписаниеТипов и приводите значения при заполнении строк.

Есть ли ограничение на размер таблицы в хранилище значения?

Жёсткого лимита на уровне платформы нет, но на практике большие таблицы (десятки мегабайт и больше) замедляют запись объекта, увеличивают размер базы и время выгрузки в DT. Для больших объёмов используйте сжатие (СжатиеДанных) или пересмотрите подход в пользу регистров либо внешних файлов.

Как сохранить таблицу значений вместе с настройкой колонок пользователя?

Настройки видимости, порядка и ширины колонок — это данные формы, а не самой таблицы. Их нужно сохранять отдельно: через ХранилищеПользовательскихНастроекОтчетов, системные настройки или собственную структуру в хранилище значения, а при открытии применять к колонкам таблицы программно.

Итог

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

Таблица значений сохраняется только через промежуточный механизм: ХранилищеЗначения — для базы, временное хранилище — для передачи между сеансами, XML/JSON/CSV/табличный документ — для файлов. Выбирайте формат по тому, кто будет читать данные, и всегда проверяйте сохранение обратным чтением с контролем строк и типов.