Как в 1С сформировать отчет по заказам и отправить его по электронной почте?

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

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

Разберем эту задачу по шагам: от создания интерфейса до нюансов работы с почтовыми серверами.

Шаг 1. Проектирование интерфейса и реквизитов

Для начала создадим внешнюю обработку. Нам понадобятся три основных реквизита на форме, чтобы пользователь мог управлять процессом:

  1. НачалоПериода (Тип: Дата) — дата начала отбора заказов.
  2. КонецПериода (Тип: Дата) — дата окончания отбора.
  3. МинимальнаяСумма (Тип: Число) — порог, свыше которого заказ считается «крупным».

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

Шаг 2. Получение данных с помощью запроса

Чтобы отчет содержал актуальные данные, нам необходимо обратиться к таблице документов Документ.ЗаказКлиента. Мы воспользуемся механизмом запросов. Выясним причину, почему важно использовать параметры: это защищает от ошибок и позволяет системе кэшировать план запроса.

Рассмотрим пример правильного текста запроса:


ВЫБРАТЬ
    ЗаказКлиента.Номер КАК Номер,
    ЗаказКлиента.Дата КАК Дата,
    ЗаказКлиента.Партнер КАК Клиент,
    ЗаказКлиента.СуммаДокумента КАК Сумма,
    ЗаказКлиента.Менеджер КАК Менеджер
ИЗ
    Документ.ЗаказКлиента КАК ЗаказКлиента
ГДЕ
    ЗаказКлиента.Дата МЕЖДУ &НачДата И &КонДата
    И ЗаказКлиента.СуммаДокумента >= &МинимальнаяСумма
    И ЗаказКлиента.Проведен = ИСТИНА
УПОРЯДОЧИТЬ ПО
    Дата

Важный нюанс: при работе с датами в 1С время имеет значение. Если пользователь ввел дату «13.09.2023», то по умолчанию это начало дня (00:00:00). Если мы не обработаем дату конца периода, заказы, созданные днем 13 сентября, не попадут в отчет. Проанализируем, как правильно устанавливать параметры в коде:


Запрос = Новый Запрос;
Запрос.Текст = "...(текст запроса)...";
Запрос.УстановитьПараметр("НачДата", НачалоДня(Объект.НачалоПериода));
Запрос.УстановитьПараметр("КонДата", КонецДня(Объект.КонецПериода));
Запрос.УстановитьПараметр("МинимальнаяСумма", Объект.МинимальнаяСумма);

Шаг 3. Формирование текста письма

После выполнения запроса нам нужно преобразовать результат в читаемый текст. Посмотрим на пример формирования тела письма. Мы будем использовать цикл Пока Выборка.Следующий(), чтобы обойти все найденные заказы и составить строку.

Для того чтобы итоговая сумма выглядела профессионально, используем встроенную функцию ЧислоПрописью(). Рассмотрим подробнее реализацию функции на сервере:


&НаСервере
Функция СформироватьТекстПисьма(РезультатЗапроса, ПараметрыОтчета)
    
    Выборка = РезультатЗапроса.Выбрать();
    
    Текст = "Здравствуйте, Иван Иванович!" + Символы.ПС;
    Текст = Текст + "Список заказов с суммой от " + ПараметрыОтчета.Сумма + " руб. за период с " + 
            Формат(ПараметрыОтчета.Начало, "ДЛФ=DD") + " по " + Формат(ПараметрыОтчета.Конец, "ДЛФ=DD") + ":" + Символы.ПС + Символы.ПС;
    
    ОбщаяСумма = 0;
    КоличествоЗаказов = 0;
    
    Пока Выборка.Следующий() Цикл
        СтрокаЗаказа = СтрШаблон("%1 от %2 | Клиент: %3 | Сумма: %4 руб. | Менеджер: %5",
            Выборка.Номер, Формат(Выборка.Дата, "ДЛФ=D"), Выборка.Клиент, Выборка.Сумма, Выборка.Менеджер);
        Текст = Текст + СтрокаЗаказа + Символы.ПС;
        
        ОбщаяСумма = ОбщаяСумма + Выборка.Сумма;
        КоличествоЗаказов = КоличествоЗаказов + 1;
    КонецЦикла;
    
    Текст = Текст + Символы.ПС + "Всего " + КоличествоЗаказов + " заказа(ов) на сумму " + 
            ОбщаяСумма + " (" + ЧислоПрописью(ОбщаяСумма, "L=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2") + ").";
            
    Возврат Текст;
КонецФункции

Шаг 4. Настройка почтового профиля и отправка

Для отправки письма необходимо настроить ИнтернетПочтовыйПрофиль. Проанализируем основные параметры. Большинство современных сервисов (Яндекс, Mail.ru, Gmail) требуют использования защищенного соединения SSL и специальных паролей приложений. Обычный пароль от почты, скорее всего, не подойдет.

Разберем по шагам создание процедуры отправки:

  1. Создаем объект ИнтернетПочтовыйПрофиль и заполняем данные сервера SMTP.
  2. Создаем объект ИнтернетПочтовоеСообщение, куда записываем тему, текст и получателя.
  3. Используем объект ИнтернетПочта для подключения и передачи сообщения.

&НаСервере
Процедура ВыполнитьОтправку(ТекстПисьма)
    
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP = "smtp.yandex.ru";
    Профиль.ПортSMTP = 465;
    Профиль.ИспользоватьSSLSMTP = Истина;
    Профиль.ПользовательSMTP = "reports@yandex.ru";
    Профиль.ПарольSMTP = "vash_parol_prilozheniya"; // Не основной пароль!
    
    Сообщение = Новый ИнтернетПочтовоеСообщение;
    Сообщение.Отправитель.Адрес = "reports@yandex.ru";
    Сообщение.Получатели.Добавить("director@company.com");
    Сообщение.Тема = "Отчет по крупным заказам";
    Сообщение.Тексты.Добавить(ТекстПисьма);
    
    Почта = Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Сообщение);
        Почта.Отключиться();
        Сообщить("Отчет успешно отправлен!");
    Исключение
        Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Советы по улучшению (Best Practices)

Чтобы ваше тестовое задание или реальная обработка выглядели более качественно, учтем следующие моменты:

Использование HTML-разметки: В простом текстовом письме колонки таблицы могут смещаться. Проанализируем вариант с использованием HTML. Для этого при добавлении текста сообщения укажите тип: ТипТекстаПочтовогоСообщения.HTML. Это позволит использовать теги <table>, <tr> и <td>, что сделает отчет наглядным.

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

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

Мы проанализировали полный цикл создания задачи: от сбора параметров на форме до программной отправки сообщения. Использование Формат(), ЧислоПрописью() и правильная работа с контекстами (Клиент/Сервер) являются ключевыми навыками для любого разработчика 1С.

← На главную