Как в 1С автоматически рассчитать валовую прибыль за день и отправить её руководителю на почту?

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

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

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

Шаг 1. Особенности и нюансы расчета валовой прибыли за день

Прежде чем приступать к коду выборки данных, проанализируем учетную специфику конфигурации:

  1. Современные конфигурации (УТ 11, КА, ERP): в этих системах итоговая себестоимость и точная валовая прибыль фиксируются только после выполнения процедуры закрытия месяца и расчета себестоимости. Для оперативного суточного отчета данные берутся из регистра накопления ВыручкаИСебестоимостьПродаж с учетом предварительной себестоимости, иначе прибыль будет равна сумме выручки.
  2. Классические конфигурации (УТ 10.3, УПП): если в информационной базе применяется списание партий регламентным документом, перед запросом к регистру ПродажиСебестоимость необходимо убедиться, что проведение по партиям за текущую дату выполнено.

Рассмотрим пример функции на встроенном языке 1С, которая рассчитывает сумму валовой прибыли за определенный период:


Функция ПолучитьВаловуюПрибыльЗаДень(ДатаОтчета) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ЕСТЬNULL(СУММА(Продажи.СуммаВыручкиОборот - Продажи.СебестоимостьОборот), 0) КАК ВаловаяПрибыль
        |ИЗ
        |	РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты(&НачалоДня, &КонецДня, День, ) КАК Продажи";
    
    Запрос.УстановитьПараметр("НачалоДня", НачалоДня(ДатаОтчета));
    Запрос.УстановитьПараметр("КонецДня", КонецДня(ДатаОтчета));
    
    РезультатЗапроса = Запрос.Выполнить();
    Выборка = РезультатЗапроса.Выбрать();
    
    Если Выборка.Следующий() Тогда
        Возврат Выборка.ВаловаяПрибыль;
    КонецЕсли;
    
    Возврат 0;
    
КонецФункции

Шаг 2. Выбор способа отправки email-сообщений

В обсуждении на форуме предлагался вариант взаимодействия через COM-объект Outlook.Application. Проанализируем, почему этот метод не рекомендуется для серверных задач:

  1. Ограничение серверной среды: COM-объекты офисных приложений Microsoft требуют интерактивного рабочего стола пользователя. При выполнении в регламентном или фоновом задании на стороне 1С:Предприятие (сервер) такой вызов либо завершится критической ошибкой, либо приведет к зависанию серверного процесса.
  2. Кроссплатформенность: COM-технологии недоступны, если сервер 1С работает под управлением операционной системы Linux.

Правильным и надежным решением является использование штатного механизма платформы — объекта ИнтернетПочта, либо подсистемы РаботаСПочтовымиСообщениями из Библиотеки стандартных подсистем (БСП).

Посмотрим на пример процедуры отправки письма через встроенный объект ИнтернетПочта:


Процедура ОтправитьПисьмоРуководителю(СуммаПрибыли, АдресПолучателя) Экспорт
    
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервера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";
    Письмо.Тема = ТемаПисьма;
    Письмо.Получатели.Добавить(АдресПолучателя);
    Письмо.Тексты.Добавить(ТемаПисьма, ТипТекстаПочтовогоСообщения.ПростойТекст);
    
    Почта = Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Письмо);
        Почта.Отключиться();
    Исключение
        ЗаписьЖурналаРегистрации("ОтправкаПочтыПрибыль", УровеньЖурналаРегистрации.Ошибка, , , ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Шаг 3. Использование функционала БСП и типовых механизмов

Если конфигурация разработана на основе БСП, задачу можно решить еще проще:

  1. Программная отправка через модуль БСП: используем процедуру РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(), настроив предварительно учетную запись электронной почты в режиме предприятия.
  2. Типовая подсистема «Рассылка отчетов»: если в дальнейшем потребуется добавить расшифровку или прикрепленный файл, можно создать предопределенный или настроенный отчет «Валовая прибыль» и настроить рассылку по расписанию в конце рабочего дня. В параметрах рассылки БСП позволяет настраивать пользовательские шаблоны темы и текста письма.

Шаг 4. Настройка регламентного задания

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

  1. В конфигураторе добавим новое РегламентноеЗадание (или создадим расширение конфигурации).
  2. В модуле регламентного задания вызовем процедуру расчета валовой прибыли за ТекущаяДата() и передадим полученное значение в процедуру отправки почты.
  3. Настроим расписание выполнения (например, каждый рабочий день в 20:00).

Альтернативные способы оперативного оповещения

Помимо отправки классических email-сообщений, рассмотрим и другие каналы оперативной доставки данных руководству:

  1. Telegram-бот: с помощью объектов HTTPСоединение и HTTPЗапрос можно отправлять короткие сводки напрямую в мессенджер руководителя, что ускоряет получение информации и не засоряет почтовый ящик.
  2. Система взаимодействия 1С: отправка push-уведомлений и сообщений во внутренний чат 1С на мобильное или настольное приложение.
← На главную