В практике разработчика 1С часто встречается задача автоматизации рассылок. Например, руководителю может потребоваться оперативная информация о крупных заказах за определенный период. Рассмотрим, как реализовать внешнюю обработку, которая позволит пользователю задать параметры (период и минимальную сумму), сформирует выборку данных и отправит красиво оформленный отчет на почту.
Разберем эту задачу по шагам: от создания интерфейса до нюансов работы с почтовыми серверами.
Для начала создадим внешнюю обработку. Нам понадобятся три основных реквизита на форме, чтобы пользователь мог управлять процессом:
Дата) — дата начала отбора заказов.Дата) — дата окончания отбора.Число) — порог, свыше которого заказ считается «крупным».Расположим эти поля на форме и добавим команду ОтправитьОтчет. Проанализируем ситуацию: код отправки почты должен выполняться на сервере, так как работа с базой данных и объектами ИнтернетПочта требует серверного контекста.
Чтобы отчет содержал актуальные данные, нам необходимо обратиться к таблице документов Документ.ЗаказКлиента. Мы воспользуемся механизмом запросов. Выясним причину, почему важно использовать параметры: это защищает от ошибок и позволяет системе кэшировать план запроса.
Рассмотрим пример правильного текста запроса:
ВЫБРАТЬ
ЗаказКлиента.Номер КАК Номер,
ЗаказКлиента.Дата КАК Дата,
ЗаказКлиента.Партнер КАК Клиент,
ЗаказКлиента.СуммаДокумента КАК Сумма,
ЗаказКлиента.Менеджер КАК Менеджер
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ГДЕ
ЗаказКлиента.Дата МЕЖДУ &НачДата И &КонДата
И ЗаказКлиента.СуммаДокумента >= &МинимальнаяСумма
И ЗаказКлиента.Проведен = ИСТИНА
УПОРЯДОЧИТЬ ПО
Дата
Важный нюанс: при работе с датами в 1С время имеет значение. Если пользователь ввел дату «13.09.2023», то по умолчанию это начало дня (00:00:00). Если мы не обработаем дату конца периода, заказы, созданные днем 13 сентября, не попадут в отчет. Проанализируем, как правильно устанавливать параметры в коде:
Запрос = Новый Запрос;
Запрос.Текст = "...(текст запроса)...";
Запрос.УстановитьПараметр("НачДата", НачалоДня(Объект.НачалоПериода));
Запрос.УстановитьПараметр("КонДата", КонецДня(Объект.КонецПериода));
Запрос.УстановитьПараметр("МинимальнаяСумма", Объект.МинимальнаяСумма);
После выполнения запроса нам нужно преобразовать результат в читаемый текст. Посмотрим на пример формирования тела письма. Мы будем использовать цикл Пока Выборка.Следующий(), чтобы обойти все найденные заказы и составить строку.
Для того чтобы итоговая сумма выглядела профессионально, используем встроенную функцию ЧислоПрописью(). Рассмотрим подробнее реализацию функции на сервере:
&НаСервере
Функция СформироватьТекстПисьма(РезультатЗапроса, ПараметрыОтчета)
Выборка = РезультатЗапроса.Выбрать();
Текст = "Здравствуйте, Иван Иванович!" + Символы.ПС;
Текст = Текст + "Список заказов с суммой от " + ПараметрыОтчета.Сумма + " руб. за период с " +
Формат(ПараметрыОтчета.Начало, "ДЛФ=DD") + " по " + Формат(ПараметрыОтчета.Конец, "ДЛФ=DD") + ":" + Символы.ПС + Символы.ПС;
ОбщаяСумма = 0;
КоличествоЗаказов = 0;
Пока Выборка.Следующий() Цикл
СтрокаЗаказа = СтрШаблон("%1 от %2 | Клиент: %3 | Сумма: %4 руб. | Менеджер: %5",
Выборка.Номер, Формат(Выборка.Дата, "ДЛФ=D"), Выборка.Клиент, Выборка.Сумма, Выборка.Менеджер);
Текст = Текст + СтрокаЗаказа + Символы.ПС;
ОбщаяСумма = ОбщаяСумма + Выборка.Сумма;
КоличествоЗаказов = КоличествоЗаказов + 1;
КонецЦикла;
Текст = Текст + Символы.ПС + "Всего " + КоличествоЗаказов + " заказа(ов) на сумму " +
ОбщаяСумма + " (" + ЧислоПрописью(ОбщаяСумма, "L=ru_RU", "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2") + ").";
Возврат Текст;
КонецФункции
Для отправки письма необходимо настроить ИнтернетПочтовыйПрофиль. Проанализируем основные параметры. Большинство современных сервисов (Яндекс, Mail.ru, Gmail) требуют использования защищенного соединения SSL и специальных паролей приложений. Обычный пароль от почты, скорее всего, не подойдет.
Разберем по шагам создание процедуры отправки:
ИнтернетПочтовыйПрофиль и заполняем данные сервера SMTP.ИнтернетПочтовоеСообщение, куда записываем тему, текст и получателя.ИнтернетПочта для подключения и передачи сообщения.
&НаСервере
Процедура ВыполнитьОтправку(ТекстПисьма)
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "reports@yandex.ru";
Профиль.ПарольSMTP = "vash_parol_prilozheniya"; // Не основной пароль!
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель.Адрес = "reports@yandex.ru";
Сообщение.Получатели.Добавить("director@company.com");
Сообщение.Тема = "Отчет по крупным заказам";
Сообщение.Тексты.Добавить(ТекстПисьма);
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Сообщить("Отчет успешно отправлен!");
Исключение
Сообщить("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Чтобы ваше тестовое задание или реальная обработка выглядели более качественно, учтем следующие моменты:
Использование HTML-разметки: В простом текстовом письме колонки таблицы могут смещаться. Проанализируем вариант с использованием HTML. Для этого при добавлении текста сообщения укажите тип: ТипТекстаПочтовогоСообщения.HTML. Это позволит использовать теги <table>, <tr> и <td>, что сделает отчет наглядным.
Проверка на пустой результат: Обязательно добавьте проверку Если РезультатЗапроса.Пустой() Тогда. Нет смысла отправлять письмо руководителю, если за выбранный период крупных заказов не зафиксировано. В этом случае лучше вывести предупреждение пользователю на форму.
Обработка ошибок подключения: Всегда оборачивайте блок подключения к почте в конструкцию Попытка...Исключение. Это позволит избежать аварийного завершения программы, если у пользователя пропал интернет или почтовый сервис временно недоступен.
Мы проанализировали полный цикл создания задачи: от сбора параметров на форме до программной отправки сообщения. Использование Формат(), ЧислоПрописью() и правильная работа с контекстами (Клиент/Сервер) являются ключевыми навыками для любого разработчика 1С.