Почему не записываются служебные сообщения 1С в файл при использовании параметра /Out и как это исправить?

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

Автоматизация рутинных задач в 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

Разберем основные параметры этой команды:

  1. ENTERPRISE — запуск в режиме «Предприятие».
  2. /S — путь к информационной базе на сервере.
  3. /Execute — путь к внешней обработке, которая должна выполниться сразу после запуска.
  4. /Out — путь к файлу, в который должны дублироваться системные сообщения.
  5. -NoTruncate — флаг, указывающий, что файл лога не нужно очищать при каждом запуске, новые записи будут добавляться в конец.

Проблема заключается в том, что при таком запуске 1С создает файл log.txt, но не записывает в него сообщения о нехватке остатков или ошибках проведения, хотя эти данные видны в Журнале регистрации.

Решение проблемы через изменение путей

Проанализируем практический опыт: иногда использование полного абсолютного пути (например, E:\doIt\log.txt) вызывает сбои в механизме записи логов 1С, особенно если в путях присутствуют пробелы или специфические права доступа на разделы диска. Как показывает практика, одним из самых простых и эффективных решений является использование относительного пути.

Вместо передачи полного пути в параметре /Out, попробуем указать только имя файла:

/Out log.txt

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

Проверка прав доступа и контекста пользователя

Разберем ситуацию с правами доступа. Когда мы запускаем батник вручную, он выполняется от имени текущего пользователя. Однако если этот же батник запускается планировщиком задач или в рамках работы серверных процессов, контекст меняется. Рассмотрим ключевые моменты:

Особенности вывода сообщений в коде обработки

Проанализируем, как именно сообщения выводятся в вашей обработке .epf. Параметр /Out перехватывает только то, что выводится методом Сообщить(). Если ваша обработка делает записи только в Журнал регистрации через ЗаписьЖурналаРегистрации(), эти данные в текстовый файл лога не попадут.

Для гарантированного логгирования ошибок проведения документов рекомендуем использовать блок Попытка...Исключение в коде обработки:


Попытка
    ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
Исключение
    ТекстОшибки = "Ошибка проведения документа " + ДокументОбъект + ": " + ОписаниеОшибки();
    Сообщить(ТекстОшибки); // Именно эта команда отправит текст в файл лога
КонецПопытки;

Важно помнить: если ошибка возникает глубоко в недрах типовых модулей и там не вызывается метод Сообщить(), а сразу происходит прерывание транзакции, сообщение может не успеть попасть в буфер вывода клиентского приложения.

Буферизация записи и завершение работы

Выясним еще одну важную техническую деталь: 1С не пишет в файл лога посимвольно в режиме реального времени. Запись происходит порциями (буферизуется). Если ваша обработка выполняет действия и сразу завершает работу системы командой ЗавершитьРаботуСистемы(Ложь), буфер может не успеть сброситься на диск.

Посмотрим на рекомендации по автоматизации:

  1. Убедитесь, что в конце работы вашей обработки вызывается корректное завершение работы 1С.
  2. Используйте параметр /DisableStartupMessages в командной строке. Это позволит избежать появления диалоговых окон при запуске (например, о необходимости обновления), которые могут блокировать выполнение скрипта и мешать записи лога.

Использование кодов возврата (Errorlevel)

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

Дополнительные параметры для стабильной работы

Рассмотрим дополнительные параметры командной строки, которые помогут в отладке логгирования:

Итоговый алгоритм действий при пустом логе

Если вы столкнулись с проблемой пустого файла при использовании /Out, выполните следующие шаги:

  1. Проверьте способ вывода: Убедитесь, что в коде обработки используется Сообщить().
  2. Смените путь: Используйте относительный путь (просто имя файла) в параметре /Out.
  3. Добавьте флаги: Используйте /DisableStartupMessages, чтобы системные окна не прерывали процесс.
  4. Проверьте буфер: Убедитесь, что 1С завершается штатно, а не «убивается» процессом в диспетчере задач.

Применяя эти методы, мы добьемся стабильного логирования всех действий системы, что позволит оперативно реагировать на ошибки проведения документов в автоматическом режиме.

← На главную