Мы, как специалисты по автоматизации, часто сталкиваемся с необходимостью запускать внешние обработки или регламентные операции 1С автоматически, без участия пользователя. Для этого традиционно используется Планировщик заданий Windows. Однако нередка ситуация, когда после выполнения всех необходимых действий сеанс 1С не закрывается корректно и остается «висеть» в списке процессов, что в итоге может привести к исчерпанию ресурсов сервера или блокировке базы данных. Разберем эту проблему подробно, проанализируем её причины и предложим проверенные решения, которые помогут вам обеспечить стабильную работу автоматизированных процессов.
Итак, давайте рассмотрим типовой сценарий, который вызывает затруднения. У нас имеется BAT-файл, разработанный для запуска платформы 1С, автоматического открытия и выполнения внешней обработки, а затем — корректного завершения работы самой 1С. Когда мы запускаем такой BAT-файл вручную, все шаги выполняются без проблем: 1С стартует, обработка отрабатывает, и программа успешно закрывается.
Однако, ситуация кардинально меняется при попытке запуска этого же BAT-файла через Планировщик заданий Windows. В этом случае внешняя обработка, казалось бы, отрабатывает, но процесс 1cv8s.exe или 1cv8.exe остается «висеть» в диспетчере задач. Интересно, что такая проблема может проявляться не постоянно, а лишь периодически, например, раз в несколько месяцев, что значительно усложняет диагностику.
Пример используемого BAT-файла:
chcp 1251
"C:\Program Files (x86)\1cv8\8.3.6.1977\bin\1cv8s.exe" ENTERPRISE /F "D:\new" /N "Администратор" /P "123" /Execute "C:\Users\uuserr\Desktop\ntest1112.epf" /DisableStartupMessages
chcp 866
А вот минималистичный код внешней обработки ntest1112.epf, который призван лишь открыть 1С и сразу же её закрыть:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
Мы видим, что в коде используется стандартная процедура ЗавершитьРаботуСистемы(Ложь). Именно с её поведением в неинтерактивных сеансах и связаны основные сложности, которые мы сейчас подробно проанализируем.
Чтобы эффективно бороться с проблемой, нам необходимо понять её корни. Давайте рассмотрим основные факторы, которые могут приводить к зависанию сеансов 1С при запуске через Планировщик заданий:
Когда задание Планировщика запускается в режиме «Выполнять вне зависимости от регистрации пользователя», оно часто стартует в неинтерактивной сессии Windows, которая обычно имеет ID сеанса 0. В такой сессии отсутствует графический интерфейс пользователя. Это означает, что любое модальное окно или диалог, который 1С может попытаться вывести (например, запрос на подтверждение закрытия, предупреждение о занятом пользователе, сообщение об ошибке, запрос на сохранение несохраненных данных), не будет отображено на экране. Более того, оно не получит фокус операционной системы. 1С будет ожидать интерактивного действия от пользователя, которого нет, что приводит к зависанию процесса в памяти.
Особенности ЗавершитьРаботуСистемы: Процедура ЗавершитьРаботуСистемы(Ложь) разработана для штатного, «мягкого» завершения работы приложения. Она ожидает, что все формы будут закрыты, все фоновые процессы завершены, и самое главное — что не будет никаких модальных диалогов, которые могут препятствовать закрытию. Если такой диалог появляется, процедура не в состоянии его обойти или принудительно закрыть, что также приводит к зависанию.
Хотя вы и запускаете задание под тем же пользователем Windows, под которым оно работает вручную, контекст выполнения может сильно отличаться. Если пользователь 1С, указанный в BAT-файле (например, «Администратор»), уже активно используется в другом сеансе 1С, платформа может вывести предупреждение о том, что пользователь уже работает. В интерактивном режиме это предупреждение отобразилось бы и потребовало действия, в неинтерактивном — заблокировало бы процесс. Также критично убедиться, что у пользователя, под которым запускается задание, имеются наивысшие права как в операционной системе (на доступ к папкам 1С, кэшу, временным файлам), так и в самой базе данных 1С.
Иногда зависания могут быть вызваны специфическими особенностями версии платформы 1С или ошибками в конфигурации/обработке, которые проявляются только в определенных условиях. Например, бесконечные циклы, необработанные исключения или длительные операции, блокирующие поток выполнения. Тот факт, что проблема возникает лишь раз в несколько месяцев, указывает на возможное сочетание нескольких факторов или редкое условие срабатывания ошибки.
ПрекратитьРаботуСистемы(Ложь)Как мы уже выяснили, процедура ЗавершитьРаботуСистемы(Ложь) не всегда справляется с задачей закрытия 1С в неинтерактивном режиме. Здесь на помощь приходит более мощный механизм платформы — процедура ПрекратитьРаботуСистемы(Ложь).
Различия между процедурами:
ЗавершитьРаботуСистемы(Ложь): Эта процедура инициирует корректное завершение работы. Она позволяет системе последовательно закрыть все формы, освободить ресурсы, вызвать обработчики событий «ПриЗавершенииРаботыСистемы». Однако, если в этот момент активно модальное окно (например, Предупреждение, Вопрос, ПоказатьВыборИзСписка) или форма, требующая сохранения данных, процесс завершения будет заблокирован до тех пор, пока пользователь не отреагирует на эти окна. В неинтерактивном режиме это и приводит к зависанию.ПрекратитьРаботуСистемы(Ложь): Это «жесткое» завершение работы. Документация 1С четко указывает, что эта процедура «Завершает работу системы независимо от наличия модальных диалогов, открытых редактируемых форм документов и справочников и т.д. При этом не вызываются процедуры-обработчики событий завершения работы системы». То есть, 1С принудительно прекращает свою работу, игнорируя любые активные диалоги. Это именно то, что нам нужно для автоматизированных задач, когда нет возможности интерактивного взаимодействия.Реализация в коде обработки:
Мы просто заменяем одну процедуру на другую в нашей внешней обработке ntest1112.epf:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПрекратитьРаботуСистемы(Ложь);
КонецПроцедуры
Как показывают отзывы пользователей, это изменение позволяет сеансу 1С, запущенному из Планировщика заданий, корректно завершать свою работу, даже если ранее он зависал.
Вопрос безопасности и целостности данных при использовании ПрекратитьРаботуСистемы:
Возникает логичный и очень важный вопрос: насколько безопасно «рубить» сеанс 1С таким образом, особенно если речь идет о файловой базе или операциях, связанных с записью данных? Действительно, принудительное завершение работы во время активной транзакции может привести к повреждению данных или структуры базы. Однако, давайте рассмотрим наш конкретный случай:
Ваша внешняя обработка предназначена для выполнения определенных действий, после чего она вызывает процедуру завершения работы. Предполагается, что к моменту вызова ПрекратитьРаботуСистемы(Ложь) все основные операции, включая запись данных и транзакции, уже завершены. Если эта процедура является последней в цепочке выполнения, то риск повреждения данных минимален, так как никаких незавершенных транзакций или модификаций данных быть не должно.
Тем не менее, всегда рекомендуется тщательно тестировать такое решение в тестовой среде и убедиться, что все критически важные операции завершаются до вызова ПрекратитьРаботуСистемы. В случае, если ваша обработка предполагает сложную логику с возможными незавершенными транзакциями, возможно, стоит предусмотреть механизмы фиксации или отката транзакций до вызова этой процедуры.
1cv8c.exeЕще одно действенное решение, которое оказалось полезным для некоторых пользователей, связано с заменой исполняемого файла платформы 1С в BAT-файле.
Обычно для запуска используется 1cv8s.exe (1С:Предприятие). Это универсальный стартер, который сам определяет, какой клиент запускать — толстый или тонкий, исходя из параметров запуска и настроек базы. Однако в некоторых случаях именно это «умное» поведение может приводить к проблемам в неинтерактивном режиме.
Предлагается использовать непосредственно исполняемый файл тонкого клиента — 1cv8c.exe.
Как изменить BAT-файл:
Просто замените 1cv8s.exe на 1cv8c.exe в командной строке запуска:
chcp 1251
"C:\Program Files (x86)\1cv8\8.3.6.1977\bin\1cv8c.exe" ENTERPRISE /F "D:\new" /N "Администратор" /P "123" /Execute "C:\Users\uuserr\Desktop\ntest1112.epf" /DisableStartupMessages
chcp 866
Почему это может помочь и какие есть особенности:
Тонкий клиент 1cv8c.exe является более легковесным приложением, предназначенным для работы через сеть с сервером 1С или напрямую с файловой базой. Он имеет упрощенный механизм взаимодействия с операционной системой и графическим интерфейсом. В некоторых случаях, именно это упрощение помогает избежать проблем с отображением или блокировкой модальных окон в неинтерактивных сеансах, которые могут возникать при использовании универсального стартера 1cv8s.exe.
Однако, важно помнить, что тонкий клиент имеет определенные ограничения по функциональности по сравнению с толстым клиентом. Некоторые операции, требующие специфических возможностей толстого клиента (например, работа с внешними компонентами COM, прямая работа с файлами на стороне клиента без файловых менеджеров 1С), могут быть недоступны. Перед внедрением этого решения, убедитесь, что ваша внешняя обработка не использует функционал, специфичный только для толстого клиента.
Для создания по-настоящему надежной системы автоматического запуска операций 1С, помимо вышеупомянутых решений, мы рекомендуем принять во внимание следующие best practices:
Мы настоятельно рекомендуем создать в Windows отдельную учетную запись пользователя специально для выполнения заданий Планировщика. Эта учетная запись должна быть локальной или доменной, но самое главное — она не должна использоваться для интерактивного входа в систему. Это исключает конфликты, связанные с уже активными пользовательскими сессиями. Убедитесь, что эта учетная запись имеет достаточные права: доступ к папке установки 1С, кэшу 1С (обычно в профиле пользователя), к файловой базе данных (если используется) или к серверу 1С, а также к сетевым ресурсам, если они задействованы в работе обработки.
В настройках задания Планировщика заданий Windows укажите эту учетную запись и выберите опцию «Выполнять вне зависимости от регистрации пользователя». Это обеспечит запуск задания даже при отсутствии активной сессии пользователя на сервере.
Аналогично учетной записи Windows, создайте в базе данных 1С отдельного пользователя (например, «АвтоматическийОбмен» или «ПланировщикЗаданий»), который будет использоваться исключительно для автоматизированных операций. Присвойте ему минимально необходимые права для выполнения обработки. Это не только повышает безопасность, но и упрощает логирование и аудит действий, выполненных автоматически.
Поскольку проблема может носить периодический характер, подготовьтесь к её повторному проявлению. Если сеанс 1С снова зависнет:
Для клиент-серверного варианта работы 1С, а также для файловых баз с настроенной публикацией на веб-сервере, самым надежным способом автоматизации являются встроенные регламентные задания 1С. Они выполняются менеджером кластера или фоновыми заданиями веб-сервера, не требуя прямого интерактивного сеанса или внешних планировщиков. Это наиболее нативный и рекомендованный подход для автоматизации операций в 1С.
Мы с вами подробно рассмотрели проблему зависания сеансов 1С, запускаемых через Планировщик заданий Windows, проанализировали её глубинные причины и предложили два основных, проверенных решения: использование процедуры ПрекратитьРаботуСистемы(Ложь) для принудительного завершения работы и явный запуск тонкого клиента 1cv8c.exe. Кроме того, мы обсудили ряд важных дополнительных рекомендаций по правильной настройке учетных записей и использованию средств диагностики. Применение этих знаний и практик поможет вам значительно повысить стабильность и надежность ваших автоматизированных процессов в среде 1С:Предприятия.