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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Использование встроенных функций ЗначениеВФайл и ЗначениеИзФайла

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

Проанализируем пример кода для выгрузки:


ПутьКФайлу = "C:\temp\table_data.txt";
ЗначениеВФайл(ПутьКФайлу, МояТаблицаЗначений);

И для последующего восстановления данных:


МояТаблицаЗначений = ""; // Очищаем переменную
ЗначениеИзФайла(ПутьКФайлу, МояТаблицаЗначений);

Важно помнить о критических нюансах этого метода. Во-первых, файлы сохраняются во внутреннем формате 1С, который практически невозможно прочитать или отредактировать в сторонних программах (например, в Блокноте или Excel). Во-вторых, как показывает практика, метод ЗначениеИзФайла может иногда не загрузить данные без вывода каких-либо сообщений об ошибках, особенно если структура колонок таблицы была изменена или типы данных не определены жестко. Также стоит учитывать, что при больших объемах данных (десятки и сотни тысяч строк) время загрузки растет нелинейно, что может привести к существенным задержкам в работе системы.

Современный стандарт: Сериализация в JSON

Начиная с версии платформы 8.3.6, наиболее эффективным и «человекочитаемым» способом выгрузки является использование формата JSON. В отличие от внутреннего формата 1С, JSON является общепризнанным стандартом, что позволяет легко передавать данные в веб-сервисы или мобильные приложения.

Разберем по шагам процесс выгрузки таблицы значений в JSON:

  1. Создадим объект ЗаписьJSON и откроем файл для записи.
  2. Используем СериализаторXDTO, который умеет корректно преобразовывать типы 1С в формат JSON.
  3. Запишем данные и закроем файл.

Пример реализации:


Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("C:\temp\data.json");
СериализаторXDTO.ЗаписатьJSON(Запись, МояТаблицаЗначений);
Запись.Закрыть();

Этот метод значительно быстрее и надежнее устаревших функций. Однако помните, что при выгрузке ссылочных данных (например, ссылок на справочники или документы) в файл попадают только уникальные идентификаторы (GUID). При загрузке в другую информационную базу эти ссылки могут превратиться в «Объект не найден», если объекты с такими UID там отсутствуют.

Выгрузка через XML (использование БСП)

Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), мы можем воспользоваться готовыми инструментами из общего модуля ОбщегоНазначения. Это позволяет свернуть написание кода до одной строки.

Рассмотрим пример использования функций БСП:


// Выгрузка в строку XML
СтрокаXML = ОбщегоНазначения.ЗначениеВСтрокуXML(МояТаблицаЗначений);

// Загрузка из строки XML
МояТаблицаЗначений = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML);

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

Выгрузка в формат CSV с помощью Табличного Документа

Если ваша задача — выгрузить таблицу значений так, чтобы ее мог открыть пользователь в программе Excel, то стандартные методы сериализации не подойдут. В этом случае нам поможет объект ТабличныйДокумент. Это «хитрый» и очень быстрый способ избежать ручного перебора строк в цикле.

Выясним, как это реализовать эффективно:


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

// Используем построитель отчета для быстрого вывода ТЗ в таблицу
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(МояТаблицаЗначений);
Построитель.Вывести(ТабДок);

// Сохраняем результат в текстовый файл с разделителями (CSV)
ТабДок.Записать("C:\temp\report.csv", ТипФайлаТабличногоДокумента.CSV);

Этот метод работает значительно быстрее, чем программное формирование текстовой строки через объект ЗаписьТекста, так как механизмы платформы по выводу данных в табличный документ оптимизированы на уровне ядра.

Важные замечания по работе с данными

Проанализируем несколько критических моментов, о которых часто забывают разработчики при выгрузке таблиц:

  1. Потеря индексов: При любой выгрузке и последующей загрузке таблицы значений (будь то через JSON, XML или файл), индексы не сохраняются. После того как вы загрузили таблицу из файла, необходимо заново программно создать индексы с помощью метода МояТаблицаЗначений.Индексы.Добавить("КолонкаПоиска"). Без этого операции поиска (НайтиСтроки) будут выполняться крайне медленно.
  2. Ссылочная целостность: Если вы планируете переносить данные между разными базами, перед выгрузкой рекомендуется преобразовать ссылки в строковые представления (например, в Артикул, Код или Наименование), иначе в целевой базе вы получите битые ссылки.
  3. Типизация колонок: Для корректной работы методов ЗначениеВФайл и СериализаторXDTO крайне желательно, чтобы колонки таблицы значений имели явно заданные типы. Если колонка имеет тип Произвольный, при загрузке могут возникнуть сложности с восстановлением исходного типа данных.

Подводя итог, можно сказать: для внутренних нужд 1С 8.3 лучше всего использовать JSON или ХранилищеЗначения, для обмена с внешними системами — CSV через табличный документ, а для старых систем на базе 7.7 — классический метод ЗначениеВФайл с учетом его ограничений.

← На главную