← Назад к вопросам
Формирование CSV-файла с данными закупок
2.0 Middle🔥 111 комментариев
#Интеграции и обмены#Стандарты разработки
Условие
Напишите обработку, которая формирует CSV-файл с данными закупок за текущий день по всем юридическим лицам.
Структура CSV:
- Articul (артикул)
- Name (наименование)
- Kol (количество)
- Price (цена)
- CompanyName (организация)
Дополнительные требования:
- Автозапуск каждый час через регламентное задание
- Кодировка UTF-8
- Разделитель — точка с запятой
Пример выходного файла
Articul;Name;Kol;Price;CompanyName
ART001;Товар 1;10;1500;ООО Ромашка
ART002;Товар 2;5;2000;ООО Ромашка
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Решение
Это задача требует два компонента: обработка для формирования CSV и регламентное задание для автозапуска.
Часть 1: Обработка (ОбработкаЭкспортЗакупок)
// Модуль объекта обработки
Процедура ФормироватьCSVЗакупок() Экспорт
// Получаем данные закупок за текущий день
Закупки = ПолучитьДанныеЗакупок();
// Формируем CSV
CSVДанные = ФормироватьCSV(Закупки);
// Сохраняем в файл
СохранитьFail(CSVДанные);
КонецПроцедуры
Функция ПолучитьДанныеЗакупок()
Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ДатаНачала", Начало(ТекущаяДата()));
Запрос.УстановитьПараметр("ДатаОкончания", Конец(ТекущаяДата()));
Запрос.Текст =
"""ВЫБРАТЬ
Номенклатура.Артикул КАК Articul,
Номенклатура.Наименование КАК Name,
ДокументыДетали.Количество КАК Kol,
ДокументыДетали.Цена КАК Price,
Организация.Наименование КАК CompanyName
ИЗ
Документ.ПокупкаТовара КАК Документы
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПокупкаТовара.Товары КАК ДокументыДетали
ПО Документы.Ссылка = ДокументыДетали.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура
ПО ДокументыДетали.Номенклатура = Номенклатура.Ссылка
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Организации КАК Организация
ПО Документы.Организация = Организация.Ссылка
ГДЕ
Документы.Дата >= @ДатаНачала
И Документы.Дата <= @ДатаОкончания
И НЕ Документы.ПометкаУдаления
ПОРЯДОКПО
CompanyName,
Name
""";
Таблица = Запрос.Выполнить().Выгрузить();
Возврат Таблица;
КонецФункции
Функция ФормироватьCSV(Таблица)
Текст = "";
// Заголовок
Текст = Текст + "Articul;Name;Kol;Price;CompanyName" + Символы.ПереводСтроки;
// Строки данных
Для Каждого Строка Из Таблица Цикл
Articul = ОчиститьДляCSV(Строка.Articul);
Name = ОчиститьДляCSV(Строка.Name);
Kol = Строка.Kol;
Price = Строка.Price;
CompanyName = ОчиститьДляCSV(Строка.CompanyName);
СтрокаCSV = Articul + ";" + Name + ";" + Kol + ";" + Price + ";" + CompanyName;
Текст = Текст + СтрокаCSV + Символы.ПереводСтроки;
КонецЦикла;
Возврат Текст;
КонецФункции
Функция ОчиститьДляCSV(Значение)
// Удаляем точку с запятой и переводы строк
Результат = СтрЗаменить(Значение, ";", ",");
Результат = СтрЗаменить(Результат, Символы.ПереводСтроки, " ");
Результат = СтрЗаменить(Результат, Символы.ВозвратКаретки, " ");
// Если содержит пробелы — оборачиваем в кавычки
Если СтрНайти(Результат, " ") > 0 Тогда
Результат = """" + Результат + """";
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура СохранитьФайл(Текст)
// Путь для сохранения файла
ДирФайлов = Новый Файл(ПолучитьИмяВременногоФайла());
ДирПапка = ДирФайлов.ПолноеИмя;
// Генерируем имя файла
ИмяФайла = "Закупки_" + Формат(ТекущаяДата(), "ДФ=ггггммдд_ччммсс") + ".csv";
ПолноеИмяФайла = ДирПапка + ДирСепаратор + ИмяФайла;
// Записываем файл
ЗаписьТекста = Новый ЗаписьТекста(ПолноеИмяФайла, "UTF-8");
ЗаписьТекста.Написать(Текст);
ЗаписьТекста.Закрыть();
// Логируем результат
ЖурналРегистрации("ЭкспортЗакупок", УровеньЖурналаРегистрации.Информация,
, , "Файл сформирован: " + ПолноеИмяФайла);
КонецПроцедуры
Часть 2: Регламентное задание
В метаданных создаём регламентное задание:
// В управляемом приложении или через метаданные:
// Регламентные задания
// - ЭкспортЗакупкиЕжечасно
// - Использование: Включено
// - Периодичность: Ежечасно
// - Метод: ОбработкаЭкспортЗакупок.ФормироватьCSVЗакупок
Или программно (в обработчике события при запуске конфигурации):
Процедура УстановитьРегламентноеЗадание()
Задания = РегламентныеЗадания.ПолучитьРегламентныеЗадания();
Найдено = Ложь;
Для Каждого Задание Из Задания Цикл
Если Задание.Имя = "ЭкспортЗакупкиЕжечасно" Тогда
Найдено = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если НЕ Найдено Тогда
НовоеЗадание = РегламентныеЗадания.СоздатьРегламентноеЗадание();
НовоеЗадание.Имя = "ЭкспортЗакупкиЕжечасно";
НовоеЗадание.Метод = ОбработкаЭкспортЗакупок.ФормироватьCSVЗакупок;
НовоеЗадание.Периодичность = РегламентноеЗаданиеПериодичность.ЕжечасноВ();
НовоеЗадание.Использование = Истина;
НовоеЗадание.Запись();
КонецЕсли;
КонецПроцедуры
Часть 3: Улучшенная версия (с обработкой ошибок)
Процедура ФормироватьCSVЗакупокБезопасно() Экспорт
Попытка
ФормироватьCSVЗакупок();
Исключение
ЖурналРегистрации("ЭкспортЗакупок", УровеньЖурналаРегистрации.Ошибка,
, , ОписаниеОшибки());
// Отправить уведомление администратору
ОтправитьУведомлениеОбОшибке();
КонецПопытки;
КонецПроцедуры
Процедура ОтправитьУведомлениеОбОшибке()
// Можно отправить email или сообщение
Сообщение = Новый СообщениеПользователю();
Сообщение.Текст = "Ошибка при формировании CSV закупок";
Сообщение.Сообщить();
КонецПроцедуры
Ключевые моменты:
UTF-8 кодировка:
- Используем
ЗаписьТекста(..., "UTF-8")для корректного экспорта - Гарантирует совместимость с Excel и другими приложениями
Разделитель точка с запятой:
- Используется точка с запятой (
;) вместо запятой - Это стандарт для русской локали Excel
Очистка данных:
- Удаляем символы, которые могут сломать CSV (
;, переводы строк) - Оборачиваем в кавычки строки с пробелами
Регламентное задание:
- Автоматический запуск каждый час
- Записывает логи в журнал регистрации
- Обработка исключений при ошибках
Производительность:
- Запрос оптимизирован с ВНУТРЕННЕЕ СОЕДИНЕНИЕ
- Фильтруем по дате в самом запросе
- Выгружаем один раз в таблицу