В процессе эксплуатации 1С часто возникает необходимость автоматизировать регулярные действия: например, ежедневно в определенное время собирать данные по именинникам, формировать отчет и отправлять его по электронной почте. Если исходный алгоритм реализован во внешней обработке, его выполнение можно полностью автоматизировать без участия пользователя.
Рассмотрим подробно основные варианты решения этой задачи в серверной базе, а также проанализируем критические особенности выполнения кода на стороне сервера.
В современных конфигурациях 1С на базе Библиотеки Стандартных Подсистем (БСП) предусмотрен штатный механизм запуска внешних обработок по расписанию. Это наиболее удобный и безопасный метод, так как он не требует изменения конфигурации и позволяет настраивать расписание прямо в пользовательском режиме.
Чтобы обработка могла запускаться в фоновом режиме по расписанию, проанализируем необходимые шаги по ее доработке:
ПриОткрытии не исполняются. Все процедуры забора данных и отправки должны быть экспортными и находиться в модуле объекта обработки.СведенияОВнешнейОбработке(). В описании команды указывается тип ВызовСерверногоМетода.Рассмотрим пример формирования структуры сведений для регистрации обработки в БСП:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиВызовСервера.ВидОбработкиДополнительнаяОбработка();
ПараметрыРегистрации.Наименование = "Автоматическая рассылка именинников";
ПараметрыРегистрации.Версия = "1.0";
ПараметрыРегистрации.БезопасныйРежим = Ложь; // Задается Ложь, если требуется доступ к файлам или почте
Команда = ПараметрыРегистрации.Команды.Добавить();
Команда.Представление = "Запустить рассылку";
Команда.Идентификатор = "ВыполнитьРассылку";
Команда.Использование = ДополнительныеОтчетыИОбработкиВызовСервера.ТипКомандыВызовСерверногоМетода();
Команда.ПоказыватьОповещение = Ложь;
Возврат ПараметрыРегистрации;
КонецФункции
Процедура ВыполнитьРассылку() Экспорт
// Вызов внутренних экспортных методов модуля объекта
ЗаполнитьДанные(ТекущаяДатаСеанса());
ОтправитьПочту();
КонецПроцедуры
После добавления этой функции обработка регистрируется в разделе Администрирование — Печатные формы, отчеты и обработки — Дополнительные отчеты и обработки. В карточке подключенной обработки настраивается расписание (например, каждый день в 08:00), после чего платформа создает фоновое задание в автоматическом режиме.
Если конфигурация дорабатывается или не использует БСП, вызов внешней обработки можно привязать к регламентному заданию, созданному в конфигураторе.
Разберем по шагам реализацию этого подхода:
Посмотрим на пример кода в общем модуле:
Процедура ВыполнитьАвтоматическуюОбработку() Экспорт
ПутьКФайлу = "C:\Services\Automat.epf"; // Или UNC путь: \\server\share\Automat.epf
// Подключение внешней обработки на сервере
ИмяОбъекта = ВнешниеОбработки.Подключить(ПутьКФайлу, , Ложь);
ОбъектОбработки = ВнешниеОбработки.Создать(ИмяОбъекта);
// Последовательный вызов экспортных методов модуля объекта
ОбъектОбработки.ВыполнитьЗаполнение();
ОбъектОбработки.ОтправитьОтчет();
КонецПроцедуры
Затем в дерево метаданных добавляется Регламентное задание, в качестве имени метода указывается ИмяМодуля.ВыполнитьАвтоматическуюОбработку, и задается требуемое расписание выполнения.
Этот вариант подходит для ситуации, когда необходимо запустить обработку в отдельном сеансе платформы 1С без настройки регламентных заданий внутри конфигурации.
Для реализации используется командный файл (bat-файл) и Планировщик задач Windows (Task Scheduler).
Создадим командный файл со следующим содержимым:
rem Стартер внешней обработки 1С
"C:\Program Files\1cv8\8.3.XX.XXXX\bin\1cv8.exe" ENTERPRISE /S"server1c\InfoBase" /N"Robot" /P"Password" /DisableStartupMessages /execute "E:\Automat\Automat.epf" /Out "E:\Automat\log.txt" -NoTruncate
Выясним критически важные нюансы этого способа:
/execute передает путь к исполняемому файлу обработки.ПриОткрытии() модуля формы. В конце ее выполнения обязательно должен вызывать метод завершения сеанса, иначе процесс 1С останется висеть в памяти.Пример кода в модуле формы внешней обработки для автономного завершения работы:
Процедура ПриОткрытии()
// Логика обработки данных и отправки
ВыполнитьНажатие();
ОтправитьНажатие();
// Завершаем работу сеанса 1С после выполнения задач
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
При переносе кода внешней обработки в фоновый режим необходимо учесть ограничения серверного контекста:
COMОбъект("Outlook.Application") или метода ЗапуститьПриложение("mailto:...") завершится ошибкой. Для отправки почты следует использовать штатные объекты платформы ИнтернетПочта, ИнтернетПочтовыйПрофиль и ИнтернетПочтовоеСообщение.C:\Users\User\Desktop\... недоступны серверному процессу. Файлы вложений (например, картинки или шаблоны) нужно размещать либо в сетевых папках по UNC-пути (\\server\share\...), либо хранить в макетах самой обработки.ВнешниеОбработки.Подключить() необходимо явно отключать безопасный режим (БезопасныйРежим = Ложь).