Разработка и Конфигурация · 10 мин
Как сохранить таблицу значений в файл в 1С 8.3
Способы сохранения таблицы значений в файл в 1С 8.3: ЗначениеВФайл, XML, CSV, табличный документ. Примеры кода, ошибки и проверка результата.
Таблица значений в 1С 8.3 — это объект в памяти, который исчезает после завершения сеанса или процедуры. Чтобы передать данные между базами, отладить обработку или выгрузить результат пользователю, таблицу нужно сохранить в файл. Встроенный язык предлагает несколько способов: сериализацию через ЗначениеВФайл, запись в XML и JSON, выгрузку в табличный документ (MXL, Excel) и формирование CSV вручную.
Выбор способа зависит от того, кто будет читать файл. Если это другая база 1С — удобнее всего внутренний формат или XML. Если бухгалтер или аналитик — нужен Excel или CSV. Если внешняя система — JSON или XML по согласованной схеме.
Ниже разобраны рабочие примеры кода для каждого варианта, ограничения платформы, типичные ошибки и способы проверить, что файл записался корректно.
Выбор формата файла под задачу
Прежде чем писать код, определите потребителя файла. От этого зависит и формат, и место выполнения кода (клиент или сервер), и необходимость преобразования типов.
Сравнение вариантов
Подходит для обмена между базами 1С и отладки. Ограничение: файл читается только платформой 1С.
Подходит для интеграции с внешними системами и обмена между базами. Требует описания структуры записи.
Подходит для выгрузки пользователю. Ограничение: типы данных теряются, всё становится текстом или числами представления.
Подходит для простых выгрузок в Excel и сторонние программы. Требует ручной обработки разделителей и кавычек.
Важный нюанс: если код выполняется на сервере (а в управляемых формах это типичная ситуация), файл будет записан на диск сервера 1С, а не на компьютер пользователя. Чтобы передать файл пользователю, его нужно сформировать на сервере, поместить во временное хранилище и затем сохранить на клиенте.
Сохранение через ЗначениеВФайл
Самый простой способ сохранить таблицу значений «как есть» — метод ЗначениеВФайл(ИмяФайла, ТаблицаЗначений). Платформа сериализует объект во внутренний формат, и позже его можно полностью восстановить методом ЗначениеИзФайла() с сохранением всех типов колонок.
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Номенклатура");
ТЗ.Колонки.Добавить("Количество");
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Номенклатура = "Товар 1";
НоваяСтрока.Количество = 10;
ЗначениеВФайл("C:\Temp\Таблица.dat", ТЗ);
Чтение выполняется зеркально: ТЗ = ЗначениеИзФайла("C:\Temp\Таблица.dat"). Типы колонок, включая ссылки на справочники, восстанавливаются полностью — но ссылки будут корректны только в той же базе, где файл создавался.
Метод удобен для отладки: сохранили промежуточную таблицу в файл, а потом загрузили её в тестовой обработке и продолжили эксперименты без повторного выполнения тяжёлого запроса.
Выгрузка в табличный документ (Excel, MXL)
Если файл нужен пользователю, таблицу значений выгружают в объект ТабличныйДокумент через метод Вывести() области из таблицы. Проще всего использовать встроенную механику: заполнить табличный документ построчно.
ТабДок = Новый ТабличныйДокумент;
// Шапка
НомерКолонки = 0;
Для Каждого Колонка Из ТЗ.Колонки Цикл
НомерКолонки = НомерКолонки + 1;
Область = ТабДок.Область(1, НомерКолонки);
Область.Текст = Колонка.Имя;
КонецЦикла;
// Данные
НомерСтроки = 1;
Для Каждого СтрокаТЗ Из ТЗ Цикл
НомерСтроки = НомерСтроки + 1;
НомерКолонки = 0;
Для Каждого Колонка Из ТЗ.Колонки Цикл
НомерКолонки = НомерКолонки + 1;
Область = ТабДок.Область(НомерСтроки, НомерКолонки);
Область.Текст = Строка(СтрокаТЗ[Колонка.Имя]);
КонецЦикла;
КонецЦикла;
ТабДок.Записать("C:\Temp\Выгрузка.xlsx", ТипФайлаТабличногоДокумента.XLSX);
Метод Записать() табличного документа поддерживает форматы MXL, XLSX, ODS, HTML, PDF и другие. Для Excel используйте ТипФайлаТабличногоДокумента.XLSX — файл откроется без установленного Excel на компьютере, где выполнялся код.
Учтите: все значения записываются как представления. Если в колонке лежит ссылка на справочник, в файл попадёт её наименование. Если нужна точная идентификация — выводите дополнительную колонку с кодом или GUID.
Сохранение в CSV
CSV — универсальный текстовый формат для обмена с Excel и сторонними программами. Встроенного метода записи таблицы значений в CSV нет, поэтому файл формируют через ТекстовыйДокумент или ЗаписьТекста.
Запись = Новый ЗаписьТекста("C:\Temp\export.csv", КодировкаТекста.UTF8);
// Заголовок
ИменаКолонок = Новый Массив;
Для Каждого Колонка Из ТЗ.Колонки Цикл
ИменаКолонок.Добавить(Колонка.Имя);
КонецЦикла;
Запись.ЗаписатьСтроку(СтрСоединить(ИменаКолонок, ";"));
// Данные
Для Каждого СтрокаТЗ Из ТЗ Цикл
Значения = Новый Массив;
Для Каждого Колонка Из ТЗ.Колонки Цикл
Значения.Добавить(Строка(СтрокаТЗ[Колонка.Имя]));
КонецЦикла;
Запись.ЗаписатьСтроку(СтрСоединить(Значения, ";"));
КонецЦикла;
Запись.Закрыть();
Разделитель «;» выбран не случайно: русская локаль Excel по умолчанию ожидает точку с запятой, а не запятую. Если значения могут содержать разделитель или кавычки, их нужно обрамлять кавычками и удваивать внутренние кавычки — иначе структура строки «поедет».
Excel часто открывает CSV в кодировке ANSI и показывает «кракозябры» вместо кириллицы. Записывайте файл в UTF-8 с BOM: ЗаписьТекста поддерживает параметр записи BOM, либо используйте КодировкаТекста.UTF8 и предупредите пользователей открывать файл через «Данные → Из текста».
Сохранение в XML и JSON
Для интеграций используют ЗаписьXML и ЗаписьJSON. Эти объекты дают полный контроль над структурой файла: имена узлов, вложенность, формат значений.
Запись = Новый ЗаписьJSON;
Запись.ОткрытьФайл("C:\Temp\table.json");
Запись.ЗаписатьНачалоМассива();
Для Каждого СтрокаТЗ Из ТЗ Цикл
Запись.ЗаписатьНачалоОбъекта();
Для Каждого Колонка Из ТЗ.Колонки Цикл
Запись.ЗаписатьИмяСвойства(Колонка.Имя);
Запись.ЗаписатьЗначение(Строка(СтрокаТЗ[Колонка.Имя]));
КонецЦикла;
Запись.ЗаписатьКонецОбъекта();
КонецЦикла;
Запись.ЗаписатьКонецМассива();
Запись.Закрыть();
Для XML логика аналогична: ЗаписатьНачалоЭлемента(), ЗаписатьАтрибут(), ЗаписатьТекст(), ЗаписатьКонецЭлемента(). Также доступна сериализация через СериализаторXDTO, который умеет записывать таблицу значений в XML одним вызовом ЗаписатьXML() — но полученный файл будет содержать служебные типы платформы и пригоден в первую очередь для чтения обратно в 1С.
Даты в JSON и XML записывайте в формате ISO (например, через Формат(Дата, "ДФ=yyyy-MM-dd")), иначе принимающая система может не распознать значение.
Проверка результата и типичные ошибки
После записи файла убедитесь, что он действительно создан и читается. Минимальная проверка — существование файла и его ненулевой размер, для табличных форматов — открытие файла и сверка количества строк.
Как проверить результат
Файл.Существует() возвращает Истина, размер больше нуля
Файла нет — проверьте путь, права и то, на клиенте или сервере выполнялся код
Число строк данных совпадает с ТЗ.Количество()
Строк меньше — возможно, цикл прервался или часть данных содержала недопустимые символы
Кириллица отображается корректно при открытии
Кракозябры — неверная кодировка или отсутствует BOM
Отдельная группа проблем — права доступа. Учётная запись, под которой работает сервер 1С (обычно USR1CV8), должна иметь право записи в целевой каталог. При ошибке «Ошибка доступа к файлу» первым делом проверяйте права каталога и корректность пути.
- 1Определите потребителя файла: 1С, пользователь или внешняя система
- 2Выберите формат: внутренний, XLSX, CSV, XML или JSON
- 3Убедитесь, что каталог назначения существует и доступен для записи
- 4Выполните запись с учётом места исполнения кода (клиент/сервер)
- 5Проверьте существование файла, его размер и корректность содержимого
Часто задаваемые вопросы
Можно ли сохранить таблицу значений в файл без диалога выбора у пользователя?
Да, если путь известен заранее и код выполняется там, где этот путь доступен. На тонком клиенте прямой доступ к файловой системе ограничен — используйте расширение работы с файлами или передавайте данные через временное хранилище с сервера.
Как сохранить таблицу значений в Excel на сервере без установленного Excel?
Через объект ТабличныйДокумент: заполните его данными и вызовите Записать() с типом файла XLSX. Платформа формирует файл самостоятельно, установленный офисный пакет не требуется.
Почему после ЗначениеИзФайла ссылки в таблице «битые»?
Файл загружен в другую базу, где этих объектов нет или у них другие внутренние идентификаторы. Для межбазового обмена сохраняйте не сами ссылки, а их GUID или коды, а при загрузке восстанавливайте ссылки поиском.
Какой формат выбрать для большой таблицы в сотни тысяч строк?
Табличный документ на больших объёмах потребляет много памяти. Для крупных выгрузок используйте потоковую запись в CSV или XML через ЗаписьТекста/ЗаписьXML — данные пишутся построчно без накопления в памяти.
Как передать сохранённый на сервере файл пользователю в управляемом приложении?
Сформируйте файл на сервере, поместите его двоичные данные во временное хранилище функцией ПоместитьВоВременноеХранилище(), верните адрес на клиент и сохраните файл методом ПолучитьФайл() или через НачатьПолучениеФайлов() с диалогом выбора пути.
Что важно запомнить
Способ сохранения таблицы значений выбирается под потребителя файла: ЗначениеВФайл — для 1С, табличный документ — для пользователя, CSV/XML/JSON — для внешних систем. Всегда учитывайте место выполнения кода, проверяйте каталог и права записи, а результат контролируйте по существованию файла и числу строк.