Разработка и Конфигурация · 11 мин
Как сохранить таблицу значений в 1С
Как сохранить таблицу значений 1С: запись в файл, хранилище значения, XML и JSON. Примеры кода, типичные ошибки и проверка результата для разработчиков.
Таблица значений в 1С — это объект, который существует только в оперативной памяти: после завершения сеанса или закрытия обработки её содержимое теряется. Чтобы данные не пропали, таблицу нужно сохранить — в файл на диске, в реквизит объекта конфигурации через хранилище значения, в константу, регистр сведений или передать между сеансами через временное хранилище. Выбор способа зависит от того, зачем сохраняется таблица: для разового обмена, долговременного хранения или передачи между процедурами.
Универсального метода «Сохранить()» у таблицы значений нет — это частая причина путаницы у начинающих разработчиков. Сохранение всегда выполняется через промежуточный механизм: сериализацию в XML или JSON, упаковку в объект «ХранилищеЗначения», выгрузку в табличный документ или построчную запись в текстовый файл. Каждый вариант имеет свои ограничения по объёму данных, типам колонок и месту применения.
Ниже разобраны основные способы с примерами кода на встроенном языке, условия выбора каждого варианта, типичные ошибки и способы проверить, что данные действительно сохранились и корректно восстанавливаются.
Как определить, какой способ сохранения нужен
Прежде чем писать код, ответьте на три вопроса: где должны лежать данные (в базе или в файле), как долго они нужны (сеанс, дни, постоянно) и кто будет их читать (та же конфигурация, другая программа, человек). От ответов зависит механизм: хранилище значения подходит только для чтения той же конфигурацией, а CSV-файл откроется и в Excel.
Второй критерий — состав колонок. Если в таблице есть колонки с типами, которые не сериализуются напрямую (например, картинки, COM-объекты, результаты запросов), часть форматов отпадает. Хранилище значения через внутреннюю сериализацию переносит почти всё, а JSON и CSV — только простые типы: строки, числа, даты, булево.
Как выбрать способ сохранения
Сохранение в базу через хранилище значения
Самый надёжный способ сохранить таблицу значений внутри информационной базы — поместить её в реквизит с типом «ХранилищеЗначения». Такой реквизит можно добавить справочнику, документу, плану обмена или использовать константу с этим типом. Конструктор хранилища принимает таблицу напрямую, при необходимости со сжатием.
// Запись таблицы в реквизит объекта
ОбъектНастройки = Справочники.НастройкиОбмена.НайтиПоКоду("Основная").ПолучитьОбъект();
ОбъектНастройки.ДанныеТаблицы = Новый ХранилищеЗначения(ТаблицаРезультат, Новый СжатиеДанных(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С.
Передача таблицы между сеансами и процедурами
Отдельная задача — «сохранить» таблицу не на диск, а между вызовами: например, передать её с сервера на клиент в управляемой форме или между фоновым заданием и основным сеансом. Для этого служит временное хранилище. Метод ПоместитьВоВременноеХранилище возвращает адрес, по которому данные доступны в течение сеанса или времени жизни формы.
// На сервере: помещаем таблицу
АдресХранилища = ПоместитьВоВременноеХранилище(ТаблицаРезультат, УникальныйИдентификаторФормы);
// Позже: получаем обратно
ТЗ = ПолучитьИзВременногоХранилища(АдресХранилища);
Если второй параметр (идентификатор формы) не указан, данные живут до конца сеанса или до ближайшего серверного вызова из формы — в зависимости от контекста, и это частая причина ошибки «данные не найдены». Явно передавайте УникальныйИдентификатор формы, чтобы привязать время жизни хранилища к форме. После использования большие таблицы стоит удалять из хранилища явно, чтобы не расходовать память сервера.
Проверка результата и восстановление данных
Любое сохранение нужно проверять обратным чтением: запишите таблицу, тут же восстановите её и сравните количество строк, колонок и контрольные значения. Это единственный надёжный способ убедиться, что формат не «съел» типы данных — например, что дата не превратилась в строку, а число не потеряло дробную часть.
Для файловых форматов дополнительно проверьте файл внешними средствами: откройте JSON в текстовом редакторе, CSV — в Excel, XLSX — убедитесь, что шапка и данные на месте. Для хранилища значения полезно вывести в отладке тип восстановленного значения: если Получить() вернуло Неопределено, значит, запись не выполнилась или объект не был записан после изменения реквизита.
Как проверить результат
Совпадает с исходной таблицей
Строк меньше — часть данных потерялась при сериализации или записи
Даты остаются датами, числа — числами
Всё превратилось в строки — формат не сохраняет типы, нужно приведение при загрузке
JSON/CSV/XLSX читаются, кириллица корректна
Иероглифы или сбитые колонки — проблема кодировки или разделителя
Получить() возвращает ТаблицаЗначений
Возвращает Неопределено — объект не записан или реквизит не заполнен
Частые вопросы
Можно ли сохранить таблицу значений напрямую в регистр?
Напрямую — нет, регистры хранят записи построчно. Нужно перебрать строки таблицы и для каждой создать запись регистра сведений или движение регистра накопления. Альтернатива — сохранить всю таблицу целиком в реквизит типа ХранилищеЗначения какого-либо объекта, но тогда по ней нельзя будет строить запросы.
Как сохранить таблицу значений на тонком клиенте без доступа к диску сервера?
На клиенте используйте диалог выбора файла и методы работы с файлами, доступные на клиенте, либо передайте таблицу на сервер через временное хранилище и запишите файл там, а затем верните его пользователю через ПолучитьФайл. Прямая запись на диск сервера с клиента невозможна по соображениям безопасности.
Какой формат выбрать для обмена таблицей между двумя базами 1С?
Если базы на одной платформе, проще всего ЗначениеВСтрокуВнутр или сериализация XDTO — сохраняются типы колонок и значения. Если базы разнородные или нужен контроль структуры, используйте XML с явным описанием колонок. JSON подходит, когда приёмник — не 1С.
Почему после восстановления из JSON все значения стали строками?
JSON не хранит типы 1С: даты, ссылки и числа с особыми форматами сериализуются как строки или числа без привязки к типу колонки. При загрузке создайте таблицу с явным описанием типов колонок через ОписаниеТипов и приводите значения при заполнении строк.
Есть ли ограничение на размер таблицы в хранилище значения?
Жёсткого лимита на уровне платформы нет, но на практике большие таблицы (десятки мегабайт и больше) замедляют запись объекта, увеличивают размер базы и время выгрузки в DT. Для больших объёмов используйте сжатие (СжатиеДанных) или пересмотрите подход в пользу регистров либо внешних файлов.
Как сохранить таблицу значений вместе с настройкой колонок пользователя?
Настройки видимости, порядка и ширины колонок — это данные формы, а не самой таблицы. Их нужно сохранять отдельно: через ХранилищеПользовательскихНастроекОтчетов, системные настройки или собственную структуру в хранилище значения, а при открытии применять к колонкам таблицы программно.
Что важно запомнить
Таблица значений сохраняется только через промежуточный механизм: ХранилищеЗначения — для базы, временное хранилище — для передачи между сеансами, XML/JSON/CSV/табличный документ — для файлов. Выбирайте формат по тому, кто будет читать данные, и всегда проверяйте сохранение обратным чтением с контролем строк и типов.