Как запустить внешний отчет (ERF) через BAT-файл в 1С:Предприятие 8?

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

Автоматизация рутинных задач — одна из ключевых обязанностей разработчика и системного администратора 1С. Часто возникает необходимость настроить автоматический запуск отчета по расписанию (например, ночью), чтобы к утру руководство получало свежую аналитику на почту или в сетевую папку. Самый простой и очевидный путь, который выбирают многие специалисты, — это создание файла сценария .bat (или .cmd), который вызывает исполняемый файл платформы 1С с параметром запуска /Execute. Однако при попытке запустить таким образом внешний отчет (файл с расширением .erf) система открывает лишь пустое серое окно платформы, а сам отчет игнорируется. Разберем подробно, почему так происходит, и найдем надежные способы решения этой задачи для обычных и управляемых форм.

Выясняем причину: почему платформа 1С не запускает .erf напрямую?

Для начала проанализируем поведение платформы 1С:Предприятие. Ключ командной строки /Execute <ПутьКФайлу> на уровне ядра платформы жестко спроектирован для работы исключительно с внешними обработками (файлами с расширением .epf).

Когда мы передаем в этот параметр путь к внешнему отчету (.erf), платформа пытается инициализировать его как объект типа ВнешняяОбработка. Структуры метаданных обработки и отчета (особенно если последний построен на базе Системы компоновки данных — СКД) принципиально отличаются. В результате сбой происходит еще на этапе парсинга заголовков файла: платформа не может корректно определить основную форму и создать объект метаданных, из-за чего на экране отображается пустое стандартное окно, имитирующее зависание или некорректный запуск.

Таким образом, прямой запуск внешнего отчета через командную строку штатными средствами платформы невозможен. Но эту проблему можно легко обойти.

Решение проблемы: создание обработки-запускальщика

Самым простым, гибким и надежным способом решения проблемы является использование архитектурного шаблона «Запускальщик» (Launcher). Мы создаем простую внешнюю обработку (.epf), которую платформа без проблем откроет через команду /Execute. Задача этой обработки — программно подключить файл нашего внешнего отчета (.erf), открыть его форму, выполнить команду формирования и при необходимости закрыть приложение 1С.

Рассмотрим по шагам реализацию этого механизма для управляемого приложения (тонкий и толстый клиент 1С v8.3).

Шаг 1. Создание внешней обработки запуска

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

Шаг 2. Написание программного кода для управляемого приложения

Поскольку в управляемом приложении работа с файловой системой и открытие форм жестко разделены между клиентом и сервером, код запуска должен быть написан аккуратно, с соблюдением стандартов разработки 1С. Проанализируем пример кода, который необходимо разместить в модуле управляемой формы нашей обработки-запускальщика:


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    
    // Определяем путь к нашему внешнему отчету на диске
    ПутьКФайлуОтчета = "D:\otch.erf";
    
    // Регистрируем внешний отчет в сеансе на стороне сервера
    ИмяСлужебногоОтчета = ПодключитьОтчетНаСервере(ПутьКФайлуОтчета);
    
    Если ПустаяСтрока(ИмяСлужебногоОтчета) Тогда
        ЗаписатьЛогОшибки("Не удалось подключить внешний отчет по пути: " + ПутьКФайлуОтчета);
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    // Формируем параметры для открытия формы отчета
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("СформироватьПриОткрытии", Истина);
    
    // Открываем управляемую форму внешнего отчета
    Попытка
        ОткрытьФорму("ВнешнийОтчет." + ИмяСлужебногоОтчета + ".Форма", ПараметрыФормы);
    Исключение
        ЗаписатьЛогОшибки("Ошибка открытия формы отчета: " + ОписаниеОшибки());
    КонецПопытки;
    
    // Чтобы закрыть саму обработку-запускальщик и не мешать работе отчета,
    // используем обработчик ожидания для корректного асинхронного закрытия
    ПодключитьОбработчикОжидания("ЗакрытьОбработкуЗапуска", 0.1, Истина);
    
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПодключитьОтчетНаСервере(Знач ПутьКФайлу)
    
    Попытка
        // Метод подключает внешний файл отчета и возвращает его уникальное имя в сеансе
        Возврат ВнешниеОтчеты.Подключить(ПутьКФайлу);
    Исключение
        Возврат "";
    КонецИсключения;
    
EndFunction

&НаКлиенте
Процедура ЗакрытьОбработкуЗапуска()
    Закрыть();
КонецПроцедуры

&НаКлиенте
Процедура ЗаписатьЛогОшибки(ТекстОшибки)
    // Здесь можно реализовать запись ошибок в текстовый файл для последующего анализа
    ЗаписьТекста = Новый ЗаписьТекста("D:\log_error.txt", КодировкаТекста.UTF8, , Истина);
    ЗаписьТекста.ЗаписатьСтроку(Строка(ТекущаяДата()) + " : " + ТекстОшибки);
    ЗаписьТекста.Закрыть();
КонецПроцедуры

В самом внешнем отчете otch.erf в модуле его основной управляемой формы нам необходимо предусмотреть логику автоматического старта при передаче параметра. Выглядеть это будет следующим образом:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, передан ли параметр автоматического формирования
    Если Параметры.Свойство("СформироватьПриОткрытии") И Параметры.СформироватьПриОткрытии Тогда
        // Выполняем экспортный метод формирования отчета на сервере
        СформироватьОтчетНаСервере();
    КонецЕсли;
    
КонецПроцедуры

Шаг 3. Настройка корректного BAT-файла

Теперь, когда у нас есть обработка-посредник, мы можем составить правильный скрипт командной строки. Особое внимание следует обратить на параметры авторизации.

Рассмотрим частую ошибку, которую допускают разработчики при написании сценариев. Посмотрим на этот пример:

"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 крайне важен для автоматических сценариев — он подавляет всплывающие служебные сообщения платформы (например, предупреждения об обновлении версии, получении лицензии и т.д.), которые могут заблокировать выполнение скрипта до тех пор, пока пользователь интерактивно не нажмет кнопку «ОК».

Динамическая передача параметров в отчет через ключ /C

В реальных задачах автоматизации редко требуется формировать один и тот же отчет с жестко зашитыми настройками. Гораздо чаще необходимо передавать в отчет изменчивые параметры: например, период формирования (начало и конец месяца), конкретную организацию или путь для сохранения готового 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С «зависнет» в памяти сервера, расходуя лицензию и ресурсы.

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

  1. Отключение защиты для конкретного пользователя. Откройте базу в режиме «Конфигуратор», перейдите в список пользователей, найдите учетную запись (например, «Admin»), под которой стартует скрипт, и на вкладке «Основные» снимите флаг «Защита от опасных действий». Это самый простой и безопасный способ.
  2. Глобальное отключение через conf.cfg. Если запуски осуществляются на стороне сервера, можно внести изменения в конфигурационный файл conf.cfg, добавив строку, отключающую проверку для определенных баз данных: DisableUnsafeActionProtection=server/base.

Альтернативный вариант: Использование БСП (без BAT-файлов)

Использование файлов сценариев .bat, хранение паролей в открытом виде на диске и запуск сессий в операционной системе постепенно уходят в прошлое. Если ваша конфигурация построена на базе Библиотеки Стандартных Подсистем (БСП), разработчики рекомендуют использовать штатный механизм дополнительных отчетов и обработок.

Рассмотрим преимущества этого подхода:

Для реализации этого метода загрузите ваш внешний отчет в справочник «Дополнительные отчеты и обработки», настройте расписание выполнения и укажите адрес электронной почты или каталог на сервере для выгрузки готового результата. Система сама, без привлечения планировщика задач Windows, сформирует отчет и доставит его адресатам.

← На главную