При передаче счетов-фактур во внешние информационные системы часто выдвигается жесткое требование: данные должны формироваться напрямую из учетной системы в формате CSV, минуя промежуточное открытие или редактирование в табличных процессорах. Причина проста: офисные редакторы при открытии текстовых файлов нередко удаляют лидирующие нули в номерах документов, ИНН и кодах, а также трансформируют длинные числовые идентификаторы в экспоненциальный формат с плавающей точкой.
Разберем, как реализовать прямую и надежную выгрузку счетов-фактур из конфигурации «1С:Бухгалтерия предприятия 3.0» с учетом отборов и специфики хранения данных.
Рассмотрим простейший подход, предложенный на практике. В этом сценарии мы формируем запрос к документам, выгружаем результат в коллекцию значений и построчно записываем данные в файл с разделителями (например, точкой с запятой), используя объект ЗаписьТекста.
Посмотрим на пример базовой реализации:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СчетФактура.Номер КАК Номер,
| СчетФактура.Дата КАК Дата,
| СчетФактура.Контрагент.ИНН КАК ИНН,
| СчетФактура.СуммаДокумента КАК Сумма
|ИЗ
| Документ.СчетФактураВыданный КАК СчетФактура
|ГДЕ
| СчетФактура.Проведен = ИСТИНА
| И СчетФактура.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания";
Запрос.УстановитьПараметр("ДатаНачала", НачалоДня(ПериодРегистрации));
Запрос.УстановитьПараметр("ДатаОкончания", КонецДня(ПериодРегистрации));
ТаблицаЗначений = Запрос.Выполнить().Выгрузить();
ИмяВременногоФайла = ПолучитьИмяВременногоФайла("csv");
ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, КодировкаТекста.ANSI);
Колонки = ТаблицаЗначений.Колонки;
СтрокаШапки = "";
Сч = 1;
Для Каждого Колонка Из Колонки Цикл
СтрокаШапки = СтрокаШапки + Колонка.Имя + ?(Сч = Колонки.Количество(), "", ";");
Сч = Сч + 1;
КонецЦикла;
ЗаписьТекста.ЗаписатьСтроку(СтрокаШапки);
Для Каждого СтрокаТЗ Из ТаблицаЗначений Цикл
Сч = 1;
СтрокаДанных = "";
Для Каждого Колонка Из Колонки Цикл
ЗначениеКолонки = XMLЗначение(СтрокаТЗ[Колонка.Имя]);
СтрокаДанных = СтрокаДанных + ЗначениеКолонки + ?(Сч = Колонки.Количество(), "", ";");
Сч = Сч + 1;
КонецЦикла;
ЗаписьТекста.ЗаписатьСтроку(СтрокаДанных);
КонецЦикла;
ЗаписьТекста.Закрыть();
Проанализируем этот код. Он компактен и решает базовую задачу, однако в промышленной эксплуатации содержит несколько узких мест:
XMLЗначение преобразует даты в формат ISO (с буквой T и временем), что часто не соответствует требованиям принимающей стороны.Для корректного формирования файлов по стандарту 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» важно учитывать специфику метаданных:
СчетФактураВыданный реквизит основания может отсутствовать в шапке, так как связь хранится в табличной части ДокументыОснования (актуально при выписке одного счета-фактуры на несколько реализаций).ВидСчетаФактуры (на реализацию, на аванс, корректировочный, налоговый агент). Запрос должен учитывать различие в заполнении реквизитов для разных видов.НДСПродажи или данным регистра сведений ЖурналУчетаСчетовФактур. Это гарантирует совпадение данных с книгой продаж.Если требования к отборам часто меняются (пользователю требуется выбирать произвольные организации, контрагентов, договоры или диапазоны сумм), жестко кодировать параметры запроса нерационально. Оптимально спроектировать отчет на Системе компоновки данных (СКД), но программно перехватить вывод:
НДСПродажи.ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений.ТаблицуЗначений передаем в алгоритм записи через ЗаписьCSV с нужными настройками форматирования.Такое решение полностью исключает искажение данных офисными пакетами, поддерживает произвольные отборы типового интерфейса 1С и гарантирует корректную структуру выгружаемого файла.