Автоматизация рутинных задач — одна из ключевых обязанностей разработчика и системного администратора 1С. Часто возникает необходимость настроить автоматический запуск отчета по расписанию (например, ночью), чтобы к утру руководство получало свежую аналитику на почту или в сетевую папку. Самый простой и очевидный путь, который выбирают многие специалисты, — это создание файла сценария .bat (или .cmd), который вызывает исполняемый файл платформы 1С с параметром запуска /Execute. Однако при попытке запустить таким образом внешний отчет (файл с расширением .erf) система открывает лишь пустое серое окно платформы, а сам отчет игнорируется. Разберем подробно, почему так происходит, и найдем надежные способы решения этой задачи для обычных и управляемых форм.
Для начала проанализируем поведение платформы 1С:Предприятие. Ключ командной строки /Execute <ПутьКФайлу> на уровне ядра платформы жестко спроектирован для работы исключительно с внешними обработками (файлами с расширением .epf).
Когда мы передаем в этот параметр путь к внешнему отчету (.erf), платформа пытается инициализировать его как объект типа ВнешняяОбработка. Структуры метаданных обработки и отчета (особенно если последний построен на базе Системы компоновки данных — СКД) принципиально отличаются. В результате сбой происходит еще на этапе парсинга заголовков файла: платформа не может корректно определить основную форму и создать объект метаданных, из-за чего на экране отображается пустое стандартное окно, имитирующее зависание или некорректный запуск.
Таким образом, прямой запуск внешнего отчета через командную строку штатными средствами платформы невозможен. Но эту проблему можно легко обойти.
Самым простым, гибким и надежным способом решения проблемы является использование архитектурного шаблона «Запускальщик» (Launcher). Мы создаем простую внешнюю обработку (.epf), которую платформа без проблем откроет через команду /Execute. Задача этой обработки — программно подключить файл нашего внешнего отчета (.erf), открыть его форму, выполнить команду формирования и при необходимости закрыть приложение 1С.
Рассмотрим по шагам реализацию этого механизма для управляемого приложения (тонкий и толстый клиент 1С v8.3).
Создадим новую внешнюю обработку в конфигураторе и назовем ее, например, ЗапускВнешнегоОтчета.epf. В этой обработке нам не нужны сложные реквизиты, достаточно создать одну управляемую форму, которая будет выступать стартовой точкой нашего процесса.
Поскольку в управляемом приложении работа с файловой системой и открытие форм жестко разделены между клиентом и сервером, код запуска должен быть написан аккуратно, с соблюдением стандартов разработки 1С. Проанализируем пример кода, который необходимо разместить в модуле управляемой формы нашей обработки-запускальщика:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Определяем путь к нашему внешнему отчету на диске
ПутьКФайлуОтчета = "D:\otch.erf";
// Регистрируем внешний отчет в сеансе на стороне сервера
ИмяСлужебногоОтчета = ПодключитьОтчетНаСервере(ПутьКФайлуОтчета);
Если ПустаяСтрока(ИмяСлужебногоОтчета) Тогда
ЗаписатьЛогОшибки("Не удалось подключить внешний отчет по пути: " + ПутьКФайлуОтчета);
Отказ = Истина;
Возврат;
КонецЕсли;
// Формируем параметры для открытия формы отчета
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
// Открываем управляемую форму внешнего отчета
Попытка
ОткрытьФорму("ВнешнийОтчет." + ИмяСлужебногоОтчета + ".Форма", ПараметрыФормы);
Исключение
ЗаписатьЛогОшибки("Ошибка открытия формы отчета: " + ОписаниеОшибки());
КонецПопытки;
// Чтобы закрыть саму обработку-запускальщик и не мешать работе отчета,
// используем обработчик ожидания для корректного асинхронного закрытия
ПодключитьОбработчикОжидания("ЗакрытьОбработкуЗапуска", 0.1, Истина);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПодключитьОтчетНаСервере(Знач ПутьКФайлу)
Попытка
// Метод подключает внешний файл отчета и возвращает его уникальное имя в сеансе
Возврат ВнешниеОтчеты.Подключить(ПутьКФайлу);
Исключение
Возврат "";
КонецИсключения;
EndFunction
&НаКлиенте
Процедура ЗакрытьОбработкуЗапуска()
Закрыть();
КонецПроцедуры
&НаКлиенте
Процедура ЗаписатьЛогОшибки(ТекстОшибки)
// Здесь можно реализовать запись ошибок в текстовый файл для последующего анализа
ЗаписьТекста = Новый ЗаписьТекста("D:\log_error.txt", КодировкаТекста.UTF8, , Истина);
ЗаписьТекста.ЗаписатьСтроку(Строка(ТекущаяДата()) + " : " + ТекстОшибки);
ЗаписьТекста.Закрыть();
КонецПроцедуры
В самом внешнем отчете otch.erf в модуле его основной управляемой формы нам необходимо предусмотреть логику автоматического старта при передаче параметра. Выглядеть это будет следующим образом:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, передан ли параметр автоматического формирования
Если Параметры.Свойство("СформироватьПриОткрытии") И Параметры.СформироватьПриОткрытии Тогда
// Выполняем экспортный метод формирования отчета на сервере
СформироватьОтчетНаСервере();
КонецЕсли;
КонецПроцедуры
Теперь, когда у нас есть обработка-посредник, мы можем составить правильный скрипт командной строки. Особое внимание следует обратить на параметры авторизации.
Рассмотрим частую ошибку, которую допускают разработчики при написании сценариев. Посмотрим на этот пример:
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"server\base" /N"Admin" /P"pass" /WA+ /Execute "D:\launcher.epf"
Использование флага /WA+ форсирует Windows-авторизацию (Active Directory). При наличии этого ключа платформа полностью игнорирует переданные параметры имени пользователя (/N) и пароля (/P). Если доменный пользователь не имеет прав в базе, запуск завершится ошибкой.
Чтобы запуск происходил строго под указанной учетной записью 1С, необходимо использовать параметр /WA- или вовсе удалить его из строки запуска. Корректный рабочий скрипт будет выглядеть так:
chcp 1251 >nul
"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /S"server\base" /N"Admin" /P"pass" /WA- /Execute "D:\launcher.epf" /DisableStartupMessages
Параметр /DisableStartupMessages крайне важен для автоматических сценариев — он подавляет всплывающие служебные сообщения платформы (например, предупреждения об обновлении версии, получении лицензии и т.д.), которые могут заблокировать выполнение скрипта до тех пор, пока пользователь интерактивно не нажмет кнопку «ОК».
В реальных задачах автоматизации редко требуется формировать один и тот же отчет с жестко зашитыми настройками. Гораздо чаще необходимо передавать в отчет изменчивые параметры: например, период формирования (начало и конец месяца), конкретную организацию или путь для сохранения готового Excel/PDF-файла.
Для решения этой задачи мы можем использовать стандартный параметр запуска платформы /C <СтрокаПараметров>. Переданная строка будет доступна внутри конфигурации через глобальное свойство ПараметрЗапуска.
Доработаем наш BAT-файл, добавив в него необходимые аргументы:
/C "StartDate=20260101;EndDate=20260131;PathToSave=D:\Reports\MonthlyReport.xlsx"
Теперь в модуле управляемой формы нашей обработки-запускальщика мы можем прочитать и распарсить эти данные, чтобы передать их напрямую в отчет:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Читаем параметры из командной строки
ПараметрыСтроки = ПараметрЗапуска;
Если Не ПустаяСтрока(ПараметрыСтроки) Тогда
// Распарсим параметры (например, преобразуем их в структуру)
СтруктураПараметров = РазобратьСтрокуПараметров(ПараметрыСтроки);
ПутьКФайлуОтчета = "D:\otch.erf";
ИмяСлужебногоОтчета = ПодключитьОтчетНаСервере(ПутьКФайлуОтчета);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
ПараметрыФормы.Вставить("ПараметрыОтчета", СтруктураПараметров);
ОткрытьФорму("ВнешнийОтчет." + ИмяСлужебногоОтчета + ".Форма", ПараметрыФормы);
КонецЕсли;
ПодключитьОбработчикОжидания("ЗакрытьОбработкуЗапуска", 0.1, Истина);
КонецПроцедуры
Начиная с версии платформы 8.3.9, разработчики столкнулись с механизмом безопасности под названием «Защита от опасных действий». При программном открытии внешних отчетов или обработок система выдает предупреждение: «Открывается внешний отчет... Рекомендуется обращать внимание на источник, из которого был получен данный файл...».
В интерактивном режиме пользователь просто нажимает кнопку «Да», но при запуске через планировщик задач Windows (Task Scheduler) это окно полностью заблокирует работу автоматического сценария, сессия 1С «зависнет» в памяти сервера, расходуя лицензию и ресурсы.
Чтобы избежать этой проблемы, воспользуемся одним из следующих вариантов решения:
conf.cfg, добавив строку, отключающую проверку для определенных баз данных:
DisableUnsafeActionProtection=server/base.Использование файлов сценариев .bat, хранение паролей в открытом виде на диске и запуск сессий в операционной системе постепенно уходят в прошлое. Если ваша конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), разработчики рекомендуют использовать штатный механизм дополнительных отчетов и обработок.
Рассмотрим преимущества этого подхода:
Для реализации этого метода загрузите ваш внешний отчет в справочник «Дополнительные отчеты и обработки», настройте расписание выполнения и укажите адрес электронной почты или каталог на сервере для выгрузки готового результата. Система сама, без привлечения планировщика задач Windows, сформирует отчет и доставит его адресатам.