Автоматизация рутинных задач в 1С часто требует запуска базы через командную строку (батник) с выполнением определенной обработки. Одной из важнейших задач при этом является получение обратной связи: успешно ли прошли документы, возникли ли ошибки и какие именно. Для этого в платформе 1С:Предприятие предусмотрен параметр /Out, который должен перехватывать все сообщения из окна «Служебные сообщения» и записывать их в текстовый файл. Однако на практике часто возникает ситуация, когда файл создается, но остается абсолютно пустым, даже если в процессе работы явно возникали ошибки. Рассмотрим подробно, почему так происходит и как заставить 1С корректно записывать логи.
Типичная команда запуска 1С из батника для выполнения внешней обработки выглядит следующим образом:
"C:\Program Files (x86)\1cv82\common\1cestart.exe" ENTERPRISE /S "Server\Base" /n "Admin" /p "123456" /Execute "E:\scripts\do_it.epf" /Out "E:\scripts\log.txt" -NoTruncate
Разберем основные параметры этой команды:
ENTERPRISE — запуск в режиме «Предприятие»./S — путь к информационной базе на сервере./Execute — путь к внешней обработке, которая должна выполниться сразу после запуска./Out — путь к файлу, в который должны дублироваться системные сообщения.-NoTruncate — флаг, указывающий, что файл лога не нужно очищать при каждом запуске, новые записи будут добавляться в конец.Проблема заключается в том, что при таком запуске 1С создает файл log.txt, но не записывает в него сообщения о нехватке остатков или ошибках проведения, хотя эти данные видны в Журнале регистрации.
Проанализируем практический опыт: иногда использование полного абсолютного пути (например, E:\doIt\log.txt) вызывает сбои в механизме записи логов 1С, особенно если в путях присутствуют пробелы или специфические права доступа на разделы диска. Как показывает практика, одним из самых простых и эффективных решений является использование относительного пути.
Вместо передачи полного пути в параметре /Out, попробуем указать только имя файла:
/Out log.txt
В этом случае файл лога будет создан в рабочем каталоге, из которого запущен бат-файл. Удивительно, но во многих случаях это снимает блокировку записи, и 1С начинает успешно выгружать сообщения в файл. Выясним причину: это может быть связано с тем, как операционная система обрабатывает контекст безопасности при обращении к корневым папкам дисков или вложенным каталогам из-под службы или специфического пользователя.
Разберем ситуацию с правами доступа. Когда мы запускаем батник вручную, он выполняется от имени текущего пользователя. Однако если этот же батник запускается планировщиком задач или в рамках работы серверных процессов, контекст меняется. Рассмотрим ключевые моменты:
echo из батника, 1С может не получить доступ к файлу в нужный момент.Проанализируем, как именно сообщения выводятся в вашей обработке .epf. Параметр /Out перехватывает только то, что выводится методом Сообщить(). Если ваша обработка делает записи только в Журнал регистрации через ЗаписьЖурналаРегистрации(), эти данные в текстовый файл лога не попадут.
Для гарантированного логгирования ошибок проведения документов рекомендуем использовать блок Попытка...Исключение в коде обработки:
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ТекстОшибки = "Ошибка проведения документа " + ДокументОбъект + ": " + ОписаниеОшибки();
Сообщить(ТекстОшибки); // Именно эта команда отправит текст в файл лога
КонецПопытки;
Важно помнить: если ошибка возникает глубоко в недрах типовых модулей и там не вызывается метод Сообщить(), а сразу происходит прерывание транзакции, сообщение может не успеть попасть в буфер вывода клиентского приложения.
Выясним еще одну важную техническую деталь: 1С не пишет в файл лога посимвольно в режиме реального времени. Запись происходит порциями (буферизуется). Если ваша обработка выполняет действия и сразу завершает работу системы командой ЗавершитьРаботуСистемы(Ложь), буфер может не успеть сброситься на диск.
Посмотрим на рекомендации по автоматизации:
/DisableStartupMessages в командной строке. Это позволит избежать появления диалоговых окон при запуске (например, о необходимости обновления), которые могут блокировать выполнение скрипта и мешать записи лога.Профессиональная настройка автоматизации требует проверки результата работы не только через текстовый файл, но и через системные переменные. Рассмотрим, как проверить корректность завершения 1С в батнике:
"C:\Program Files (x86)\1cv82\common\1cestart.exe" ... /Out log.txt
if %ERRORLEVEL% NEQ 0 (
echo "Произошла системная ошибка при запуске 1С" >> error_report.txt
)
Значение %ERRORLEVEL% равное 0 означает успешное завершение программы, тогда как 1 (и выше) сигнализирует о сбое. Это отличный способ узнать, что 1С вообще не смогла запуститься (например, из-за проблем с лицензией), даже если лог-файл пуст.
Рассмотрим дополнительные параметры командной строки, которые помогут в отладке логгирования:
/UC <код доступа> — если в базе установлена блокировка соединений (например, для выполнения регламентных работ), ваш батник не сработает. Код доступа позволит обойти это ограничение./C <строка текста> — позволяет передать произвольный параметр внутрь обработки. Внутри обработки его можно получить через ПараметрЗапуска. Это полезно, если вы хотите менять имя лог-файла динамически из батника.Если вы столкнулись с проблемой пустого файла при использовании /Out, выполните следующие шаги:
Сообщить()./Out./DisableStartupMessages, чтобы системные окна не прерывали процесс.Применяя эти методы, мы добьемся стабильного логирования всех действий системы, что позволит оперативно реагировать на ошибки проведения документов в автоматическом режиме.