Как выгрузить счета-фактуры из 1С в CSV с отборами и сохранением лидирующих нулей

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

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

Разберем, как реализовать прямую и надежную выгрузку счетов-фактур из конфигурации «1С:Бухгалтерия предприятия 3.0» с учетом отборов и специфики хранения данных.

Базовый способ: прямая построчная выгрузка через объект ЗаписьТекста

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

Посмотрим на пример базовой реализации:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	СчетФактура.Номер КАК Номер,
    |	СчетФактура.Дата КАК Дата,
    |	СчетФактура.Контрагент.ИНН КАК ИНН,
    |	СчетФактура.СуммаДокумента КАК Сумма
    |ИЗ
    |	Документ.СчетФактураВыданный КАК СчетФактура
    |ГДЕ
    |	СчетФактура.Проведен = ИСТИНА
    |	И СчетФактура.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";

Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ПериодРегистрации));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ПериодРегистрации));

ТаблицаЗначений = Запрос.Выполнить().Выгрузить();

ИмяВременногоФайла = ПолучитьИмяВременногоФайла("csv");
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.ANSI);

Колонки = ТаблицаЗначений.Колонки;
СтрокаШапки = "";
Сч = 1;

Для Каждого Колонка Из Колонки Цикл
	СтрокаШапки = СтрокаШапки + Колонка.Имя + ?(Сч = Колонки.Количество(), "", ";");
	Сч = Сч + 1;
КонецЦикла;

ЗаписьТекста.ЗаписатьСтроку(СтрокаШапки);

Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
	Сч = 1;
	СтрокаДанных = "";
	Для Каждого Колонка Из Колонки Цикл
		ЗначениеКолонки = XMLЗначение(СтрокаТЗ[Колонка.Имя]);
		СтрокаДанных = СтрокаДанных + ЗначениеКолонки + ?(Сч = Колонки.Количество(), "", ";");
		Сч = Сч + 1;
	КонецЦикла;
	ЗаписьТекста.ЗаписатьСтроку(СтрокаДанных);
КонецЦикла;

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

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

  1. Использование XMLЗначение преобразует даты в формат ISO (с буквой T и временем), что часто не соответствует требованиям принимающей стороны.
  2. Если строковое поле (например, наименование контрагента) содержит точку с запятой или кавычки, структура CSV нарушится со сдвигом столбцов.

Штатный механизм платформы: использование объекта ЗаписьCSV

Для корректного формирования файлов по стандарту RFC 4180 в платформе 1С:Предприятие предназначен специализированный объект ЗаписьCSV совместно с ПараметрыЗаписиCSV. Этот механизм автоматически экранирует кавычки и оборачивает значения с разделителями и переносами строк.

Разберем по шагам создание надежной выгрузки с явным форматированием данных:


ПараметрыCSV = Новый ПараметрыЗаписиCSV;
ПараметрыCSV.РазделительПолей = ";";
ПараметрыCSV.СимволКавычек = """";
ПараметрыCSV.СимволПереводаСтрок = Символы.CRLF;

ЗаписьCSV = Новый ЗаписьCSV;
ЗаписьCSV.ОткрытьФайл(ИмяФайлаВыгрузки, ПараметрыCSV, , КодировкаТекста.UTF8, Истина);

// Записываем заголовки колонок
ЗаписьCSV.ЗаписатьСтроку(Новый Массив); // очистка буфера при необходимости
МассивШапки = Новый Массив;
МассивШапки.Добавить("Номер");
МассивШапки.Добавить("Дата");
МассивШапки.Добавить("ИНН");
МассивШапки.Добавить("Сумма");
ЗаписьCSV.ЗаписатьСтроку(МассивШапки);

// Обходим результат запроса через Выборку (экономит оперативную память)
Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
	МассивДанных = Новый Массив;
	
	// Сохраняем номер с лидирующими нулями в виде чистой строки
	МассивДанных.Добавить(Строка(Выборка.Номер));
	
	// Явный формат даты без времени
	МассивДанных.Добавить(Формат(Выборка.Дата, "ДФ=dd.MM.yyyy"));
	
	// ИНН как текст
	МассивДанных.Добавить(Строка(Выборка.ИНН));
	
	// Суммы без разделителя групп разрядов (ЧГ=0) и с точкой в качестве дроби
	МассивДанных.Добавить(Формат(Выборка.Сумма, "ЧДЦ=2; ЧРД=.; ЧГ=0"));
	
	ЗаписьCSV.ЗаписатьСтроку(МассивДанных);
КонецЦикла;

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

Особенности структуры данных счетов-фактур в БП 3.0

При подготовке запроса для конфигурации «Бухгалтерия предприятия 3.0» важно учитывать специфику метаданных:

  1. Документы-основания: В документе СчетФактураВыданный реквизит основания может отсутствовать в шапке, так как связь хранится в табличной части ДокументыОснования (актуально при выписке одного счета-фактуры на несколько реализаций).
  2. Виды операций: Документ имеет реквизит ВидСчетаФактуры (на реализацию, на аванс, корректировочный, налоговый агент). Запрос должен учитывать различие в заполнении реквизитов для разных видов.
  3. Обращение к регистрам: Если принимающей стороне требуются суммы ставок НДС, коды видов операций (КВО) и события, надежнее строить выборку не по шапке документа, а по движениям регистра накопления НДСПродажи или данным регистра сведений ЖурналУчетаСчетовФактур. Это гарантирует совпадение данных с книгой продаж.

Гибкий подход: использование СКД с программной выгрузкой в файл

Если требования к отборам часто меняются (пользователю требуется выбирать произвольные организации, контрагентов, договоры или диапазоны сумм), жестко кодировать параметры запроса нерационально. Оптимально спроектировать отчет на Системе компоновки данных (СКД), но программно перехватить вывод:

  1. Создаем схему компоновки данных с полями счетов-фактур и регистра НДСПродажи.
  2. Предоставляем пользователю стандартную форму настроек СКД с отборами.
  3. Инициализируем процессор компоновки и направляем результат в ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.
  4. Полученную ТаблицуЗначений передаем в алгоритм записи через ЗаписьCSV с нужными настройками форматирования.

Такое решение полностью исключает искажение данных офисными пакетами, поддерживает произвольные отборы типового интерфейса 1С и гарантирует корректную структуру выгружаемого файла.

← На главную