Как выгрузить данные из запроса 1С в файл CSV и исправить типичные ошибки

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

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

Шаг 1. Формирование запроса и получение данных

Прежде чем записывать данные в файл, их необходимо извлечь из базы данных. Рассмотрим пример запроса к документу ЗаявкаНаОткрытиеСчетов. На начальном этапе важно правильно определить поля и их псевдонимы.

Типичная ошибка: Часто начинающие разработчики обращаются к реквизитам через несколько «точек» (например, Заявка.Организация.Наименование). Как справедливо отмечено в обсуждении, это создает неявные левые соединения в SQL-запросе, что может негативно сказаться на производительности при больших объемах данных.

Разберем пример кода для получения данных:


Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ
    |	Заявка.Дата КАК ДатаДокумента,
    |	Заявка.Номер КАК НомерДокумента,
    |	Заявка.Организация.Наименование КАК ОрганизацияНаименование,
    |	Заявка.Организация.ИНН КАК ОрганизацияИНН
    |ИЗ
    |	Документ.ЗаявкаНаОткрытиеСчетов КАК Заявка";

Результат = Запрос.Выполнить();
// Для небольших объемов данных можно использовать Выгрузить(), 
// но для больших лучше использовать выборку.
Выборка = Результат.Выбрать();

Обратите внимание на использование псевдонимов (КАК ОрганизацияНаименование). Это позволяет избежать путаницы при дальнейшем обращении к полям в цикле обхода данных.

Шаг 2. Инициализация файла и работа с объектом ТекстовыйДокумент

Для создания текстового файла в 1С чаще всего используется объект ТекстовыйДокумент. Он удобен тем, что позволяет легко добавлять строки и записывать результат на диск в нужной кодировке.

Важный нюанс: Метод ДобавитьСтроку() автоматически добавляет символ переноса строки в конце. Если вы вручную добавляете Символы.ПС или Символы.ВК в конце каждой строки текста, в итоговом файле могут появиться лишние пустые строки.

Рассмотрим подготовку шапки файла:


ТД = Новый ТекстовыйДокумент;
Разделитель = ";";
СтрокаШапки = "Дата;Номер;Организация;ИНН";
ТД.ДобавитьСтроку(СтрокаШапки);

Шаг 3. Обработка типов данных и формирование строк CSV

Самая распространенная ошибка при формировании строки — это попытка сложить дату или число со строкой-разделителем напрямую. В 1С это приводит к ошибке «Преобразование значения к типу Число не может быть выполнено», так как система пытается привести все слагаемые к типу первого операнда.

Чтобы избежать этой ошибки, всегда начинайте формирование строки с пустых кавычек или используйте функцию Строка(). Проанализируем правильный подход:


Пока Выборка.Следующий() Цикл
    // Используем явное преобразование и пустую строку в начале
    СтрокаТекста = "" + Выборка.ДатаДокумента + Разделитель 
                      + Выборка.НомерДокумента + Разделитель 
                      + Выборка.ОрганизацияНаименование + Разделитель 
                      + Выборка.ОрганизацияИНН;
    
    ТД.ДобавитьСтроку(СтрокаТекста);
КонецЦикла;

Шаг 4. Работа с форматами дат и чисел

Стандартное преобразование Строка(Дата) выдает результат в формате "ДД.ММ.ГГГГ ЧЧ:ММ:СС". Для CSV-файлов, которые в дальнейшем импортируются в другие системы, часто требуются специфические форматы. Выясним, как сделать выгрузку более профессиональной с помощью функции Формат().

  1. Форматирование даты: Для формата ГГГГ-ММ-ДД используйте Формат(Выборка.Дата, "ДФ=yyyy-MM-dd").
  2. Форматирование чисел: Чтобы исключить неразрывный пробел в качестве разделителя групп разрядов, используйте Формат(Выборка.Сумма, "ЧГ=0"). Это критично, так как многие системы не смогут прочитать число «1 000,00» с пробелом.

Шаг 5. Запись файла и выбор пути

При записи файла важно учитывать кодировку. Традиционно для ОС Windows используется КодировкаТекста.ANSI (Windows-1251), но современные системы все чаще требуют UTF-8.

Также разберем ситуацию с выбором каталога. Использование жестко прописанных путей вроде "E:\Desktop\test.csv" неудобно для пользователя. Правильнее использовать ДиалогВыбораФайла.


Режим = РежимДиалогаВыбораФайла.Сохранение;
Диалог = Новый ДиалогВыбораФайла(Режим);
Диалог.Фильтр = "Текст CSV (*.csv)|*.csv";
Диалог.Заголовок = "Выберите путь для сохранения выгрузки";

Если Диалог.Выбрать() Тогда
    ПутьКФайлу = Диалог.ПолноеИмяФайла;
    ТД.Записать(ПутьКФайлу, КодировкаТекста.ANSI);
    Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
КонецЕсли;

Шаг 6. Оптимизация для больших объемов (ЗаписьТекста)

Если в вашем запросе десятки или сотни тысяч строк, объект ТекстовыйДокумент может «съесть» всю оперативную память, так как он хранит весь текст в памяти до момента вызова метода Записать(). В таких случаях мы рекомендуем использовать объект ЗаписьТекста, который записывает данные порциями сразу на диск.

Посмотрим на пример использования ЗаписьТекста:


Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Дата;Номер;Организация"); // Шапка

Пока Выборка.Следующий() Цикл
    ТекСтрока = Формат(Выборка.ДатаДокумента, "ДФ=dd.MM.yyyy") + ";"
              + Выборка.НомерДокумента + ";"
              + Выборка.ОрганизацияНаименование;
    Запись.ЗаписатьСтроку(ТекСтрока);
КонецЦикла;

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

Дополнительные рекомендации по качеству кода

Проанализируем еще несколько важных моментов, которые сделают вашу обработку надежной:

Соблюдение этих правил позволит вам создавать надежные и быстрые инструменты для обмена данными между 1С и сторонними информационными системами.

← На главную