Как настроить автоматическую рассылку отчетов на почту в 1С:УПП 1.3?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

В этой статье мы подробно разберем, почему автоматизация рассылки стандартных отчетов в УПП 1.3 вызывает серьезные технические сложности, проанализируем архитектурные ограничения платформы и рассмотрим практические варианты решения этой задачи.

Ограничение штатных механизмов и архитектурные барьеры

Прежде чем приступать к реализации, выясним причину, почему стандартные отборы и настройки отчетов в УПП 1.3 нельзя просто так взять и отправить по расписанию через регламентное задание.

Большая часть стандартных отчетов в УПП 1.3 (например, "Ведомость по товарам на складах", "Продажи" и другие) построена на базе Универсального отчета. В основе этого механизма лежит технология ПостроительОтчета (предшественник современной СКД).

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

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

Вариант 1. Разработка отчетов строго на СКД (Система компоновки данных)

Если вам необходимо рассылать конкретные (пусть даже сложные) отчеты, самым стабильным, производительным и правильным решением будет их разработка или перенос на Систему компоновки данных (СКД). В отличие от ПостроительОтчета, СКД великолепно работает на стороне сервера без вызова клиентских процедур.

Разберем по шагам, как реализовать этот вариант:

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

Посмотрим на пример кода, реализующий серверное формирование отчета на СКД:


Функция СформироватьОтчетНаСервере(ИмяОтчета) Экспорт
    
    // Получаем схему компоновки данных из метаданных отчета
    ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
    СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
    
    // Получаем настройки по умолчанию или сохраненные настройки
    Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
    
    // Выполняем компоновку макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
    
    // Процессор компоновки осуществляет выборку данных
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
    
    // Выводим результат в табличный документ
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
    ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
    
    // Сохраняем во временный файл в формате Excel
    ПутьКФайлу = ПолучитьИмяВременногоФайла("xlsx");
    ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
    
    Возврат ПутьКФайлу;
    
КонецФункции

После успешного формирования файла его необходимо отправить адресатам. Для этого воспользуемся стандартным почтовым профилем платформы:


Процедура ОтправитьОтчетНаПочту(ПутьКФайлу, АдресПолучателя) Экспорт
    
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP = "smtp.mail.ru";
    Профиль.ПортSMTP = 465;
    Профиль.ИспользоватьSSLSMTP = Истина;
    Профиль.ПользовательSMTP = "robot@mycompany.ru";
    Профиль.ПарольSMTP = "MySecretPassword";
    
    Сообщение = Новый ИнтернетПочтовоеСообщение;
    Сообщение.Отправитель.Адрес = "robot@mycompany.ru";
    Сообщение.Получатели.Добавить(АдресПолучателя);
    Сообщение.Тема = "Автоматическая рассылка: Отчет по продажам";
    
    ТекстСообщения = Сообщение.Тексты.Добавить("Во вложении актуальный отчет.");
    ТекстСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
    
    // Прикрепляем сформированный ранее файл xlsx
    Сообщение.Вложения.Добавить(ПутьКФайлу, "Sales_Report.xlsx");
    
    Почта = Новый ИнтернетПочта;
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Сообщение);
        Почта.Отключиться();
    Исключение
        ЗаписьЖурналаРегистрации("РассылкаОтчетов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Преимущества этого подхода: Абсолютная стабильность работы, высокая скорость формирования, отсутствие необходимости в дополнительных клиентских лицензиях 1С и стороннем софте.

Вариант 2. Использование COM-соединения (Automation)

Если вам критически важно отправлять именно стандартные отчети на обычных формах (на базе ПостроительОтчета) и переписывать их на СКД не представляется возможным, придется использовать механизм Automation.

Суть метода заключается в том, что регламентное задание на сервере программно запускает скрытую сессию клиентского приложения 1С под служебным пользователем через COM-соединение (V83.Application). В запущенном клиентском сеансе без проблем отрабатывает любой интерактивный код, формируется "проблемный" универсальный отчет, сохраняется в файл и отправляется по почте.

Проанализируем пример запуска такого сеанса:


// Пример создания COM-соединения для генерации отчетов
СтрокаПодключения = "Srvr=""MyServer1C"";Ref=""UPP_Base"";Usr=""Robot_Report"";Pwd=""Password123"";";
Попытка
    COMПодключение = Новый COMОбъект("V83.Application");
    УспешноеПодключение = COMПодключение.Connect(СтрокаПодключения);
Исключение
    ЗаписьЖурналаРегистрации("РассылкаОтчетов", УровеньЖурналаРегистрации.Ошибка,,, "Не удалось создать COM-соединение: " + ОписаниеОшибки());
    Возврат;
КонецПопытки;

// Через COM-объект вызываем экспортную процедуру формирования и отправки отчета
COMПодключение.СформироватьИОтправитьВсеРассылки();
COMПодключение.Exit(Ложь); // Завершаем работу сеанса

Важное предупреждение о недостатках COM-метода:

Вариант 3. Использование планировщика задач Windows и внешних скриптов

Для того чтобы обезопасить службу сервера 1С от падений и зависаний COM-процессов, автоматизацию запуска клиентских сеансов переносят на уровень операционной системы. Это наиболее надежный способ "клиентской" генерации отчетов.

Рассмотрим схему реализации этого метода:

  1. Создается специальная внешняя обработка 1С (файл .epf), которая при открытии автоматически считывает настройки рассылки, формирует нужный универсальный отчет, отправляет письмо и сразу закрывает программу методом ЗавершитьРаботуСистемы().
  2. В планировщике задач Windows (Task Scheduler) на сервере настраивается запуск командной строки со специальными параметрами.

Пример командной строки для планировщика Windows:


"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" ENTERPRISE /S "MyServer1C\UPP_Base" /N "Robot_Report" /P "Password123" /Execute "C:\1C_Scripts\MailingReport.epf"

В этом сценарии запуск клиента 1С полностью изолирован. Даже в случае критического сбоя, операционная система принудительно закроет задачу по таймауту, не нарушая стабильность работы сервера приложений 1С.

Сложности при использовании готовых модулей рассылки

На рынке и профильных ресурсах (например, Инфостарт) существует множество готовых подсистем рассылок отчетов для УПП 1.3. При покупке или самостоятельном внедрении подобных решений вы неизбежно столкнетесь со следующими нюансами:

Конфликт архитектуры настроек: В УПП 1.3 пользовательские настройки отчетов сохраняются в стандартный справочник СохраненныеНастройки. Готовые модули рассылки, особенно адаптированные из Библиотеки Стандартных Подсистем (БСП) новых редакций, ориентированы на современные системные хранилища настроек СКД. В результате "из коробки" такая рассылка не сможет корректно прочитать и применить отборы, сохраненные пользователями в интерфейсе обычных форм УПП. Разработчику придется вручную дорабатывать механизм интеграции настроек.

Поддержка шаблонов отчетов: Поставляемые в УПП 1.3 СКД-отчеты зачастую созданы на различных, исторически отличающихся шаблонах оформления ИТС. Сторонние подсистемы рассылки могут некорректно обрабатывать такие структуры, что потребует индивидуальной ручной доработки кода под каждый отчет.

Резюме и рекомендации

Выбор оптимального пути реализации рассылки в УПП 1.3 зависит от масштабности вашей задачи:

← На главную