Автоматизация оперативной отчетности для руководства — одна из частых задач при сопровождении торговых систем на платформе 1С:Предприятие. Нередко руководителю требуется получать ключевой показатель бизнеса (например, валовую прибыль за прошедший рабочий день) прямо в теме или теле электронного письма, без необходимости открывать громоздкие файлы вложений или заходить в базу данных.
Разберем по шагам, как реализовать подобный функционал: от получения правильных учетных данных запросом до настройки регламентного фонового задания и отправки почты штатными средствами платформы.
Прежде чем приступать к коду выборки данных, проанализируем учетную специфику конфигурации:
ВыручкаИСебестоимостьПродаж с учетом предварительной себестоимости, иначе прибыль будет равна сумме выручки.ПродажиСебестоимость необходимо убедиться, что проведение по партиям за текущую дату выполнено.Рассмотрим пример функции на встроенном языке 1С, которая рассчитывает сумму валовой прибыли за определенный период:
Функция ПолучитьВаловуюПрибыльЗаДень(ДатаОтчета) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЕСТЬNULL(СУММА(Продажи.СуммаВыручкиОборот - Продажи.СебестоимостьОборот), 0) КАК ВаловаяПрибыль
|ИЗ
| РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоДня, &КонецДня, День, ) КАК Продажи";
Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ДатаОтчета));
Запрос.УстановитьПараметр("КонецДня", КонецДня(ДатаОтчета));
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.ВаловаяПрибыль;
КонецЕсли;
Возврат 0;
КонецФункции
В обсуждении на форуме предлагался вариант взаимодействия через COM-объект Outlook.Application. Проанализируем, почему этот метод не рекомендуется для серверных задач:
1С:Предприятие (сервер) такой вызов либо завершится критической ошибкой, либо приведет к зависанию серверного процесса.Правильным и надежным решением является использование штатного механизма платформы — объекта ИнтернетПочта, либо подсистемы РаботаСПочтовымиСообщениями из Библиотеки стандартных подсистем (БСП).
Посмотрим на пример процедуры отправки письма через встроенный объект ИнтернетПочта:
Процедура ОтправитьПисьмоРуководителю(СуммаПрибыли, АдресПолучателя) Экспорт
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "bot@company.ru";
Профиль.ПарольSMTP = "app_specific_password";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
ТемаПисьма = СтрШаблон("Валовая прибыль за рабочий день: %1 рублей", Формат(СуммаПрибыли, "ЧЦ=15; ЧДЦ=2; ЧГ=3,0"));
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.ИмяОтправителя = "Робот 1С";
Письмо.Отправитель.Адрес = "bot@company.ru";
Письмо.Тема = ТемаПисьма;
Письмо.Получатели.Добавить(АдресПолучателя);
Письмо.Тексты.Добавить(ТемаПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Исключение
ЗаписьЖурналаРегистрации("ОтправкаПочтыПрибыль", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Если конфигурация разработана на основе БСП, задачу можно решить еще проще:
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(), настроив предварительно учетную запись электронной почты в режиме предприятия.Чтобы отправка выполнялась автоматически каждый день без участия человека, выполним следующие действия:
РегламентноеЗадание (или создадим расширение конфигурации).ТекущаяДата() и передадим полученное значение в процедуру отправки почты.Помимо отправки классических email-сообщений, рассмотрим и другие каналы оперативной доставки данных руководству:
HTTPСоединение и HTTPЗапрос можно отправлять короткие сводки напрямую в мессенджер руководителя, что ускоряет получение информации и не засоряет почтовый ящик.