В современных типовых конфигурациях 1С, построенных на базе управляемых форм (таких как 1С:ERP, Комплексная автоматизация 2 или Управление торговлей 11), механизм рассылки отчетов является стандартной сервисной функцией. Пользователю достаточно зайти в специальный справочник, выбрать отчет, указать получателей, настроить расписание — и система сама начнет отправлять данные на электронную почту. Однако в конфигурации 1С:Управление производственным предприятием 1.3 (УПП 1.3), которая использует обычные формы, такого встроенного функционала "из коробки" нет. Для перехода на современные программы с готовым сервисным функционалом можно использовать подбор решений для переноса данных из УПП 1.3 в новые системы.
В этой статье мы подробно разберем, почему автоматизация рассылки стандартных отчетов в УПП 1.3 вызывает серьезные технические сложности, проанализируем архитектурные ограничения платформы и рассмотрим практические варианты решения этой задачи.
Прежде чем приступать к реализации, выясним причину, почему стандартные отборы и настройки отчетов в УПП 1.3 нельзя просто так взять и отправить по расписанию через регламентное задание.
Большая часть стандартных отчетов в УПП 1.3 (например, "Ведомость по товарам на складах", "Продажи" и другие) построена на базе Универсального отчета. В основе этого механизма лежит технология ПостроительОтчета (предшественник современной СКД).
Главная проблема заключается в том, что ПостроительОтчета жестко завязан на клиентский контекст. При попытке запустить формирование такого отчета в фоновом или регламентном задании на сервере приложений 1С система выдаст критическую ошибку. На сервере отсутствует графический интерфейс, и процесс не может инициализировать элементы оформления табличного документа. Следовательно, стандартный универсальный отчет невозможно сгенерировать напрямую в серверном коде регламентного задания.
Рассмотрим подробнее три основных технических сценария, которые позволяют обойти это ограничение и настроить рассылку.
Если вам необходимо рассылать конкретные (пусть даже сложные) отчеты, самым стабильным, производительным и правильным решением будет их разработка или перенос на Систему компоновки данных (СКД). В отличие от ПостроительОтчета, СКД великолепно работает на стороне сервера без вызова клиентских процедур.
Разберем по шагам, как реализовать этот вариант:
ИнтернетПочта.Посмотрим на пример кода, реализующий серверное формирование отчета на СКД:
Функция СформироватьОтчетНаСервере(ИмяОтчета) Экспорт
// Получаем схему компоновки данных из метаданных отчета
ОтчетОбъект = Отчеты[ИмяОтчета].Создать();
СхемаКомпоновкиДанных = ОтчетОбъект.СхемаКомпоновкиДанных;
// Получаем настройки по умолчанию или сохраненные настройки
Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию;
// Выполняем компоновку макета
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки);
// Процессор компоновки осуществляет выборку данных
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);
// Выводим результат в табличный документ
ТабличныйДокумент = Новый ТабличныйДокумент;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
// Сохраняем во временный файл в формате Excel
ПутьКФайлу = ПолучитьИмяВременногоФайла("xlsx");
ТабличныйДокумент.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Возврат ПутьКФайлу;
КонецФункции
После успешного формирования файла его необходимо отправить адресатам. Для этого воспользуемся стандартным почтовым профилем платформы:
Процедура ОтправитьОтчетНаПочту(ПутьКФайлу, АдресПолучателя) Экспорт
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "robot@mycompany.ru";
Профиль.ПарольSMTP = "MySecretPassword";
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель.Адрес = "robot@mycompany.ru";
Сообщение.Получатели.Добавить(АдресПолучателя);
Сообщение.Тема = "Автоматическая рассылка: Отчет по продажам";
ТекстСообщения = Сообщение.Тексты.Добавить("Во вложении актуальный отчет.");
ТекстСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// Прикрепляем сформированный ранее файл xlsx
Сообщение.Вложения.Добавить(ПутьКФайлу, "Sales_Report.xlsx");
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Исключение
ЗаписьЖурналаРегистрации("РассылкаОтчетов", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Преимущества этого подхода: Абсолютная стабильность работы, высокая скорость формирования, отсутствие необходимости в дополнительных клиентских лицензиях 1С и стороннем софте.
Если вам критически важно отправлять именно стандартные отчети на обычных формах (на базе ПостроительОтчета) и переписывать их на СКД не представляется возможным, придется использовать механизм 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-метода:
Для того чтобы обезопасить службу сервера 1С от падений и зависаний COM-процессов, автоматизацию запуска клиентских сеансов переносят на уровень операционной системы. Это наиболее надежный способ "клиентской" генерации отчетов.
Рассмотрим схему реализации этого метода:
.epf), которая при открытии автоматически считывает настройки рассылки, формирует нужный универсальный отчет, отправляет письмо и сразу закрывает программу методом ЗавершитьРаботуСистемы().Пример командной строки для планировщика 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 зависит от масштабности вашей задачи: