В процессе разработки в среде 1С часто возникает необходимость сохранения временных данных, хранящихся в объекте ТаблицаЗначений, во внешний файл. Это может потребоваться для обмена данными между базами, создания резервных копий промежуточных расчетов или анализа данных во внешних редакторах. В этой статье мы подробно разберем все доступные способы — от классических методов платформы 7.7 до современных стандартов 8.3.
Рассмотрим исторически первый и самый простой способ, который пришел из платформы 1С 7.7, но продолжает работать и в современных версиях для обеспечения обратной совместимости. Для быстрой выгрузки всей структуры таблицы без использования циклов перебора строк применяются команды ЗначениеВФайл и ЗначениеИзФайла.
Проанализируем пример кода для выгрузки:
ПутьКФайлу = "C:\temp\table_data.txt";
ЗначениеВФайл(ПутьКФайлу, МояТаблицаЗначений);
И для последующего восстановления данных:
МояТаблицаЗначений = ""; // Очищаем переменную
ЗначениеИзФайла(ПутьКФайлу, МояТаблицаЗначений);
Важно помнить о критических нюансах этого метода. Во-первых, файлы сохраняются во внутреннем формате 1С, который практически невозможно прочитать или отредактировать в сторонних программах (например, в Блокноте или Excel). Во-вторых, как показывает практика, метод ЗначениеИзФайла может иногда не загрузить данные без вывода каких-либо сообщений об ошибках, особенно если структура колонок таблицы была изменена или типы данных не определены жестко. Также стоит учитывать, что при больших объемах данных (десятки и сотни тысяч строк) время загрузки растет нелинейно, что может привести к существенным задержкам в работе системы.
Начиная с версии платформы 8.3.6, наиболее эффективным и «человекочитаемым» способом выгрузки является использование формата JSON. В отличие от внутреннего формата 1С, JSON является общепризнанным стандартом, что позволяет легко передавать данные в веб-сервисы или мобильные приложения.
Разберем по шагам процесс выгрузки таблицы значений в JSON:
ЗаписьJSON и откроем файл для записи.СериализаторXDTO, который умеет корректно преобразовывать типы 1С в формат JSON.Пример реализации:
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("C:\temp\data.json");
СериализаторXDTO.ЗаписатьJSON(Запись, МояТаблицаЗначений);
Запись.Закрыть();
Этот метод значительно быстрее и надежнее устаревших функций. Однако помните, что при выгрузке ссылочных данных (например, ссылок на справочники или документы) в файл попадают только уникальные идентификаторы (GUID). При загрузке в другую информационную базу эти ссылки могут превратиться в «Объект не найден», если объекты с такими UID там отсутствуют.
Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), мы можем воспользоваться готовыми инструментами из общего модуля ОбщегоНазначения. Это позволяет свернуть написание кода до одной строки.
Рассмотрим пример использования функций БСП:
// Выгрузка в строку XML
СтрокаXML = ОбщегоНазначения.ЗначениеВСтрокуXML(МояТаблицаЗначений);
// Загрузка из строки XML
МояТаблицаЗначений = ОбщегоНазначения.ЗначениеИзСтрокиXML(СтрокаXML);
Преимущество XML заключается в строгой типизации данных. Однако стоит учитывать, что XML-файлы обычно имеют больший объем по сравнению с JSON или текстовыми файлами с разделителями.
Если ваша задача — выгрузить таблицу значений так, чтобы ее мог открыть пользователь в программе Excel, то стандартные методы сериализации не подойдут. В этом случае нам поможет объект ТабличныйДокумент. Это «хитрый» и очень быстрый способ избежать ручного перебора строк в цикле.
Выясним, как это реализовать эффективно:
// Создаем временный табличный документ
ТабДок = Новый ТабличныйДокумент;
// Используем построитель отчета для быстрого вывода ТЗ в таблицу
Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(МояТаблицаЗначений);
Построитель.Вывести(ТабДок);
// Сохраняем результат в текстовый файл с разделителями (CSV)
ТабДок.Записать("C:\temp\report.csv", ТипФайлаТабличногоДокумента.CSV);
Этот метод работает значительно быстрее, чем программное формирование текстовой строки через объект ЗаписьТекста, так как механизмы платформы по выводу данных в табличный документ оптимизированы на уровне ядра.
Проанализируем несколько критических моментов, о которых часто забывают разработчики при выгрузке таблиц:
МояТаблицаЗначений.Индексы.Добавить("КолонкаПоиска"). Без этого операции поиска (НайтиСтроки) будут выполняться крайне медленно.ЗначениеВФайл и СериализаторXDTO крайне желательно, чтобы колонки таблицы значений имели явно заданные типы. Если колонка имеет тип Произвольный, при загрузке могут возникнуть сложности с восстановлением исходного типа данных.Подводя итог, можно сказать: для внутренних нужд 1С 8.3 лучше всего использовать JSON или ХранилищеЗначения, для обмена с внешними системами — CSV через табличный документ, а для старых систем на базе 7.7 — классический метод ЗначениеВФайл с учетом его ограничений.