← Назад к вопросам

Формирование 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 (;, переводы строк)
  • Оборачиваем в кавычки строки с пробелами

Регламентное задание:

  • Автоматический запуск каждый час
  • Записывает логи в журнал регистрации
  • Обработка исключений при ошибках

Производительность:

  • Запрос оптимизирован с ВНУТРЕННЕЕ СОЕДИНЕНИЕ
  • Фильтруем по дате в самом запросе
  • Выгружаем один раз в таблицу
Формирование CSV-файла с данными закупок | PrepBro