Выгрузка данных в текстовые форматы, такие как CSV, является одной из классических задач программиста 1С. Несмотря на кажущуюся простоту, новички часто сталкиваются с рядом ошибок: от неправильного преобразования типов до неоптимальной работы с памятью и запросами. В этой статье мы подробно разберем процесс создания обработки для выгрузки данных, проанализируем типичные ошибки и рассмотрим способы оптимизации кода.
Прежде чем записывать данные в файл, их необходимо извлечь из базы данных. Рассмотрим пример запроса к документу ЗаявкаНаОткрытиеСчетов. На начальном этапе важно правильно определить поля и их псевдонимы.
Типичная ошибка: Часто начинающие разработчики обращаются к реквизитам через несколько «точек» (например, Заявка.Организация.Наименование). Как справедливо отмечено в обсуждении, это создает неявные левые соединения в SQL-запросе, что может негативно сказаться на производительности при больших объемах данных.
Разберем пример кода для получения данных:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заявка.Дата КАК ДатаДокумента,
| Заявка.Номер КАК НомерДокумента,
| Заявка.Организация.Наименование КАК ОрганизацияНаименование,
| Заявка.Организация.ИНН КАК ОрганизацияИНН
|ИЗ
| Документ.ЗаявкаНаОткрытиеСчетов КАК Заявка";
Результат = Запрос.Выполнить();
// Для небольших объемов данных можно использовать Выгрузить(),
// но для больших лучше использовать выборку.
Выборка = Результат.Выбрать();
Обратите внимание на использование псевдонимов (КАК ОрганизацияНаименование). Это позволяет избежать путаницы при дальнейшем обращении к полям в цикле обхода данных.
Для создания текстового файла в 1С чаще всего используется объект ТекстовыйДокумент. Он удобен тем, что позволяет легко добавлять строки и записывать результат на диск в нужной кодировке.
Важный нюанс: Метод ДобавитьСтроку() автоматически добавляет символ переноса строки в конце. Если вы вручную добавляете Символы.ПС или Символы.ВК в конце каждой строки текста, в итоговом файле могут появиться лишние пустые строки.
Рассмотрим подготовку шапки файла:
ТД = Новый ТекстовыйДокумент;
Разделитель = ";";
СтрокаШапки = "Дата;Номер;Организация;ИНН";
ТД.ДобавитьСтроку(СтрокаШапки);
Самая распространенная ошибка при формировании строки — это попытка сложить дату или число со строкой-разделителем напрямую. В 1С это приводит к ошибке «Преобразование значения к типу Число не может быть выполнено», так как система пытается привести все слагаемые к типу первого операнда.
Чтобы избежать этой ошибки, всегда начинайте формирование строки с пустых кавычек или используйте функцию Строка(). Проанализируем правильный подход:
Пока Выборка.Следующий() Цикл
// Используем явное преобразование и пустую строку в начале
СтрокаТекста = "" + Выборка.ДатаДокумента + Разделитель
+ Выборка.НомерДокумента + Разделитель
+ Выборка.ОрганизацияНаименование + Разделитель
+ Выборка.ОрганизацияИНН;
ТД.ДобавитьСтроку(СтрокаТекста);
КонецЦикла;
Стандартное преобразование Строка(Дата) выдает результат в формате "ДД.ММ.ГГГГ ЧЧ:ММ:СС". Для CSV-файлов, которые в дальнейшем импортируются в другие системы, часто требуются специфические форматы. Выясним, как сделать выгрузку более профессиональной с помощью функции Формат().
Формат(Выборка.Дата, "ДФ=yyyy-MM-dd").Формат(Выборка.Сумма, "ЧГ=0"). Это критично, так как многие системы не смогут прочитать число «1 000,00» с пробелом.При записи файла важно учитывать кодировку. Традиционно для ОС Windows используется КодировкаТекста.ANSI (Windows-1251), но современные системы все чаще требуют UTF-8.
Также разберем ситуацию с выбором каталога. Использование жестко прописанных путей вроде "E:\Desktop\test.csv" неудобно для пользователя. Правильнее использовать ДиалогВыбораФайла.
Режим = РежимДиалогаВыбораФайла.Сохранение;
Диалог = Новый ДиалогВыбораФайла(Режим);
Диалог.Фильтр = "Текст CSV (*.csv)|*.csv";
Диалог.Заголовок = "Выберите путь для сохранения выгрузки";
Если Диалог.Выбрать() Тогда
ПутьКФайлу = Диалог.ПолноеИмяФайла;
ТД.Записать(ПутьКФайлу, КодировкаТекста.ANSI);
Сообщить("Файл успешно сохранен: " + ПутьКФайлу);
КонецЕсли;
Если в вашем запросе десятки или сотни тысяч строк, объект ТекстовыйДокумент может «съесть» всю оперативную память, так как он хранит весь текст в памяти до момента вызова метода Записать(). В таких случаях мы рекомендуем использовать объект ЗаписьТекста, который записывает данные порциями сразу на диск.
Посмотрим на пример использования ЗаписьТекста:
Запись = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);
Запись.ЗаписатьСтроку("Дата;Номер;Организация"); // Шапка
Пока Выборка.Следующий() Цикл
ТекСтрока = Формат(Выборка.ДатаДокумента, "ДФ=dd.MM.yyyy") + ";"
+ Выборка.НомерДокумента + ";"
+ Выборка.ОрганизацияНаименование;
Запись.ЗаписатьСтроку(ТекСтрока);
КонецЦикла;
Запись.Закрыть();
Проанализируем еще несколько важных моментов, которые сделают вашу обработку надежной:
""" + Наименование + """.НомерДоговора не заполнен в базе, в файл попадет пустая строка. Используйте ЗначениеЗаполнено() для логирования таких случаев.ДиалогВыбораФайла работает только на клиенте. Если формирование файла происходит в серверном модуле, файл нужно сначала создать во временном хранилище на сервере, а затем передать его клиенту.Соблюдение этих правил позволит вам создавать надежные и быстрые инструменты для обмена данными между 1С и сторонними информационными системами.