Как реализовать выгрузку данных в формат CSV в 1С:Предприятие?

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

Формат CSV (Comma-Separated Values) является одним из наиболее популярных, простых и легковесных форматов обмена данными между различными информационными системами. Его часто используют для интеграции со сторонними веб-сайтами, выгрузки клиентских баз (например, для импорта в контакты Google), передачи финансовых реестров в банки или обмена данными со складскими программами. В рамках этой статьи мы подробно разберем все способы выгрузки данных в CSV из «1С:Предприятие»: от стандартных пользовательских механизмов до продвинутого программирования с оптимизацией потребления оперативной памяти и обработкой сложных строк.

Способ 1. Использование встроенных инструментов в типовых конфигурациях (без программирования)

Прежде чем приступать к написанию собственного программного кода, давайте проанализируем возможности современных конфигураций, построенных на базе БСП (Библиотеки стандартных подсистем), таких как «1С:ERP», «Управление торговлей», «Комплексная автоматизация», «Бухгалтерия предприятия» и «Управление нашей фирмой». Разработчики фирмы 1С уже предусмотрели мощный функционал для работы с CSV:

  1. Рассылка отчетов: Этот инструмент позволяет настроить автоматическое формирование любого отчета в системе по расписанию и его отправку на электронную почту, выгрузку в сетевой каталог или на FTP-сервер. В настройках формата сохранения файла можно напрямую выбрать CSV.
  2. Загрузка данных из файла: Встроенный универсальный помощник БСП позволяет не только загружать данные (например, справочники номенклатуры или контрагентов) из файлов CSV и Excel, но и наглядно демонстрирует структуру полей, необходимую для успешной интеграции.
  3. Интерфейсный метод «Вывести список»: Любой пользователь в любом динамическом списке (например, в списке документов реализации или в справочнике партнеров) может нажать кнопку Еще — Вывести список. Сформированную таблицу можно сохранить в формате CSV стандартным путем через главное меню Файл — Сохранить как.

Способ 2. Автоматический экспорт через табличный документ

Если перед нами стоит задача выгрузить готовый отчет или табличную часть программно, но мы не хотим вручную собирать текстовые строки и следить за разделителями, мы можем воспользоваться мощным встроенным методом платформы «1С:Предприятие» для объекта ТабличныйДокумент. Платформа умеет самостоятельно преобразовывать ячейки таблицы в текстовый формат с разделителями.

Рассмотрим пример реализации такого подхода:


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

// Заполняем табличный документ данными (например, выводим области макета или результат запроса)
// Для примера просто запишем тестовые данные в ячейки
ТабДок.Область("R1C1").Текст = "Код";
ТабДок.Область("R1C2").Текст = "Наименование";
ТабДок.Область("R1C3").Текст = "Цена";

ТабДок.Область("R2C1").Текст = "00001";
ТабДок.Область("R2C2").Текст = "Товар ""Ходовой""";
ТабДок.Область("R2C3").Текст = "1500.50";

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

Преимущества этого подхода: платформа берет на себя рутину по формированию структуры документа, автоматически преобразует типы данных в строковый вид и записывает результирующий файл одной строчкой кода.

Способ 3. Ручное формирование файла с помощью объекта ТекстовыйДокумент

Бывают ситуации, когда структура файла должна строго подчиняться определенному регламенту, а выгружать нужно специфические данные напрямую из запроса или объектной выборки. На форуме разработчики часто предлагают использовать объект ТекстовыйДокумент.

Давайте подробно разберем практический пример выгрузки реестра лицевых счетов, основанный на коде участников обсуждения:


Процедура ВыгрузитьРеестрВCSV(СсылкаНаДокумент, ПутьДляСохранения) Экспорт

    ТекстДок = Новый ТекстовыйДокумент;
    Разделитель = ";"; // Укажем точку с запятой в качестве разделителя колонок
    
    // Формируем строку заголовков (шапку) файла
    СтрокаШапки = "НомерЛицевогоСчета" + Разделитель 
                + "ФИО" + Разделитель 
                + "Учреждение" + Разделитель 
                + "Сумма";
                
    ТекстДок.ДобавитьСтроку(СтрокаШапки);
    
    // Обходим строки табличной части документа
    Для каждого ТекСтрока Из СсылкаНаДокумент.Начисления Цикл
        
        Если ТекСтрока.Всего = 0 Тогда
            Продолжить; // Пропускаем строки с нулевой суммой
        КонецЕсли;
        
        // Собираем ФИО из отдельных полей
        ФИО = СокрЛП(ТекСтрока.Ребенок.Контрагент.Фамилия) + " " 
            + СокрЛП(ТекСтрока.Ребенок.Контрагент.Имя) + " " 
            + СокрЛП(ТекСтрока.Ребенок.Контрагент.Отчество);
            
        // Форматируем числовые значения, убирая неразрывные пробелы триад чисел
        ФорматированнаяСумма = Формат(ТекСтрока.Всего, "ЧДЦ=2; ЧРД=.; ЧГ=");
        
        // Собираем результирующую строку
        СтрокаФайла = СокрЛП(ТекСтрока.НомерЛицевогоСчета) + Разделитель 
                    + ВРег(ФИО) + Разделитель 
                    + СокрЛП(СсылкаНаДокумент.Учреждение.НаименованиеСокращенное) + Разделитель 
                    + ФорматированнаяСумма;
                    
        ТекстДок.ДобавитьСтроку(СтрокаФайла);
        
    КонецЦикла;
    
    // Записываем файл на диск в кодировке Windows-1251 (ANSI)
    ТекстДок.Записать(ПутьДляСохранения, "windows-1251");
    Сообщить("Файл успешно сформирован: " + ПутьДляСохранения);

КонецПроцедуры

Этот метод прост в понимании и отлично подходит для небольших документов или справочников. Однако при проектировании крупных систем или работе с большими массивами данных такой подход скрывает в себе серьезные архитектурные проблемы.

Способ 4. Оптимизация работы с оперативной памятью (ЗаписьТекста)

Основной недостаток объекта ТекстовыйДокумент заключается в том, что он накапливает весь формируемый текст непосредственно в оперативной памяти вашего сервера или клиентского компьютера. Если вам понадобится выгрузить миллион строк номенклатуры или проводок, система может аварийно завершить работу с ошибкой «Нехватка памяти».

Для оптимизации и потоковой записи больших объемов данных мы рекомендуем использовать специализированный объект ЗаписьТекста. Он сбрасывает данные на жесткий диск порциями, сохраняя минимальное потребление системных ресурсов:


Процедура ОптимизированнаяВыгрузкаВCSV(ПутьКФайлу)

    // Инициализируем объект для потоковой записи текста с кодировкой UTF-8
    Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
    Разделитель = ",";
    
    // Записываем шапку
    Запись.ЗаписатьСтроку("Код" + Разделитель + "Наименование" + Разделитель + "Артикул");
    
    // Получаем данные с помощью быстрого запроса
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   Номенклатура.Код КАК Код,
        |   Номенклатура.Наименование КАК Наименование,
        |   Номенклатура.Артикул КАК Артикул
        |ИЗ
        |   Справочник.Номенклатура КАК Номенклатура
        |ГДЕ
        |   НЕ Номенклатура.ЭтоГруппа";
        
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        // Готовим значения, избегая возможных ошибок структуры CSV
        Код = СокрЛП(Выборка.Код);
        Наименование = ПодготовитьЗначениеДляCSV(Выборка.Наименование, Разделитель);
        Артикул = ПодготовитьЗначениеДляCSV(Выборка.Артикул, Разделитель);
        
        СтрокаВыгрузки = Код + Разделитель + Наименование + Разделитель + Артикул;
        Запись.ЗаписатьСтроку(СтрокаВыгрузки);
        
    КонецЦикла;
    
    // Обязательно закрываем файл, чтобы освободить дескриптор в ОС
    Запись.Закрыть();
    Сообщить("Экспорт завершен успешно!");

КонецПроцедуры

Способ 5. Соблюдение стандартов формата CSV (RFC 4180) и экранирование данных

Большинство начинающих разработчиков допускают критическую ошибку: они просто соединяют строки через запятую или точку с запятой. Но что произойдет, если в наименовании товара или организации уже содержится этот разделитель? Например, название организации: ООО "Рога, Копыта и Со". При чтении такого файла принимающая система посчитает запятую за границу новой колонки, и вся структура таблицы «съедет».

Согласно общепринятому международному стандарту RFC 4180, при формировании CSV-файлов необходимо соблюдать следующие жесткие правила:

Для автоматизации этой рутинной задачи разработаем универсальную функцию подготовки полей перед записью в файл:


Функция ПодготовитьЗначениеДляCSV(Значение, Разделитель) Экспорт

    Текст = Строка(Значение);
    
    // Проверим, содержит ли строка спецсимволы, требующие экранирования
    СодержитКавычки = (Найти(Текст, """") > 0);
    СодержитРазделитель = (Найти(Текст, Разделитель) > 0);
    СодержитПереносСтроки = (Найти(Текст, Символы.ПС) > 0 Или Найти(Текст, Символы.ВК) > 0);
    
    // Если в тексте есть кавычки, мы должны удвоить каждую из них
    Если СодержитКавычки Тогда
        Текст = СтрЗаменить(Текст, """", """""");
    КонецЕсли;
    
    // Если встретился любой спецсимвол, оборачиваем всю строку в двойные кавычки
    Если СодержитКавычки Или СодержитРазделитель Или СодержитПереносСтроки Тогда
        Текст = """" + Текст + """";
    КонецЕсли;
    
    Возврат Текст;

КонецФункции

Способ 6. Тонкости работы с кодировками (UTF-8 без BOM)

При обмене данными с внешними веб-серверами, скриптами на Python, PHP или Node.js часто возникает проблема несовместимости кодировок. По умолчанию метод Записать() объекта ТекстовыйДокумент при указании кодировки UTF-8 сохраняет файл с сигнатурой BOM (Byte Order Mark) — специальным невидимым маркером в начале файла (три байта EF BB BF). Многие современные парсеры на стороне получателя из-за этого маркера выдают ошибку чтения.

Для того чтобы записать чистый файл в кодировке UTF-8 без BOM, мы должны явно инициализировать ЗаписьТекста, передавая кодировку в виде строкового параметра, а не системного перечисления:


// Передача строки "UTF-8" гарантирует запись БЕЗ сигнатуры BOM
Запись = Новый ЗаписьТекста(ИмяФайла, "UTF-8");
// ... Запись строк ...
Запись.Закрыть();

Если же файл предназначен для импорта в устаревшие учетные системы или локальный MS Excel версии ниже 365, лучше использовать стандартную ANSI-кодировку Windows. Для этого при инициализации записи укажите кодировку "windows-1251".

Применяйте описанные методики, правильно экранируйте спецсимволы и всегда отдавайте предпочтение потоковым методам работы с файлами для поддержания высокой стабильности и скорости работы ваших баз данных на платформе 1С!

← На главную