При автоматизации рутинных процессов в среде 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда фоновое задание или регламентный процесс «намертво» зависает без видимых причин и записей об ошибках в журнале регистрации. Проанализируем классический сценарий: фоновое задание инициализирует запуск полноценного клиентского приложения (тонкого или толстого клиента) под учетной записью администратора для выполнения специфических задач. Если в этот момент конфигурация базы данных была изменена, но не обновлена, платформа при запуске выдает стандартный интерактивный диалог: «Конфигурация базы данных не соответствует сохраненной конфигурации. Продолжить?» или «Конфигурация была изменена. Обновить конфигурацию базы данных?».
Выясним причину, почему этот вопрос приводит к полной остановке процесса, и разберем по шагам, как правильно настроить систему, чтобы избежать подобных блокировок.
Для того чтобы понять природу проблемы, рассмотрим механизм работы служб операционной системы Windows. Когда сервер приложений 1С запускает фоновое задание, весь связанный с ним исполняемый код выполняется в контексте системной учетной службы (по умолчанию это пользователь USR1CV8).
Если в процессе выполнения фонового задания инициируется запуск клиентского приложения 1cv8.exe или 1cv8c.exe, операционная система помещает этот процесс в так называемую Сессию 0 (Session 0 Isolation). Начиная с версии Windows Vista и Windows Server 2008, в целях безопасности интерактивные службы изолированы от пользовательских сеансов:
Именно с этим эффектом столкнулся автор темы: пока база данных не была обновлена, запуск клиента блокировался невидимым вопросом платформы. После обновления конфигурации вопрос перестал появляться, и задание моментально отработало.
Чтобы исключить любое интерактивное взаимодействие платформы с несуществующим пользователем, мы должны принудительно запретить 1С выводить какие-либо стартовые диалоги. Для этого при формировании строки запуска клиентского приложения необходимо использовать специализированные ключи.
Рассмотрим подробнее ключевые параметры запуска:
/DisableStartupMessages — этот параметр полностью подавляет вывод стартовых сообщений платформы. К ним относятся предупреждения о несоответствии конфигурации базы данных, сообщения о недостаточных возможностях операционной системы для редактирования HTML-документов или разделов справки, а также предупреждения о необходимости обновления интернет-компонентов./DisableStartupDialogs — критически важный ключ для современных версий платформы (начиная с 8.3.18). Он полностью отключает стартовое окно выбора информационных баз, окно аутентификации (ввода логина и пароля), а также новые системные диалоги, связанные с обновлением версии платформы. Если параметры запуска указаны неверно или прав для входа недостаточно, система не выведет диалоговое окно, а просто завершит работу с ошибкой, сделав соответствующую запись./Out <ИмяФайла> — обязательный параметр для фонового запуска. Поскольку все диалоги подавлены, нам необходимо иметь возможность проанализировать причину сбоя, если запуск не удался. Данный ключ перенаправляет все системные сообщения и ошибки в текстовый файл лога.Разберем по шагам, как программно реализовать запуск клиентского сеанса 1С из кода фонового задания с использованием безопасных параметров. Напишем пример кода на языке 1С:
// Определим параметры запуска и пути к логам
ПутьКЛогу = "C:\Logs\1c_start_log.txt";
СтрокаЗапуска = """C:\Program Files\1cv8\8.3.22.1709\bin\1cv8.exe"" ENTERPRISE";
СтрокаЗапуска = СтрокаЗапуска + " /F ""C:\Base1C""" ; // Путь к базе данных (для файловой)
СтрокаЗапуска = СтрокаЗапуска + " /N ""АдминистраторРобот"""; // Имя пользователя
СтрокаЗапуска = СтрокаЗапуска + " /P ""ПарольРобота"""; // Пароль пользователя
СтрокаЗапуска = СтрокаЗапуска + " /Execute ""C:\Services\ExternalTask.epf"""; // Путь к внешней обработке
// Добавляем ключи подавления диалогов и логирования
СтрокаЗапуска = СтрокаЗапуска + " /DisableStartupMessages";
СтрокаЗапуска = СтрокаЗапуска + " /DisableStartupDialogs";
СтрокаЗапуска = СтрокаЗапуска + " /Out """ + ПутьКЛогу + """ -NoTruncate";
// Запускаем приложение в неинтерактивном режиме
ЗапуститьПриложение(СтрокаЗапуска, , Истина); // Третий параметр Истина заставляет ждать завершения процесса
При использовании такой конструкции платформа гарантированно проигнорирует вопрос о несоответствии конфигурации и продолжит запуск в штатном режиме, а все непредвиденные ситуации будут зафиксированы в указанном файле лога.
Проанализируем ситуацию, описанную автором в сообщениях 12 и 14. Запуск клиентского приложения 1С из-под фонового задания под учетной записью USR1CV8 использовался как способ обойти защиту драйвера торгового оборудования (например, ККТ или эквайринга), который отказывается работать внутри терминальной сессии (RDP).
Выясним причину, почему драйверы оборудования часто «бастуют» при работе по RDP:
Запуск сеанса от имени системной службы сервера 1С действительно позволяет обмануть драйвер, так как процесс выполняется локально на самом сервере вне контекста RDP-сессии конкретного пользователя. Однако такой подход является крайне хрупким «костылем». Любое динамическое обновление конфигурации, изменение прав доступа учетной записи службы или зависание фонового процесса парализует работу кассового узла.
Рассмотрим современные архитектурные альтернативы, которые позволяют полностью отказаться от небезопасного запуска клиентских сеансов 1С из-под фоновых заданий:
Большинство современных фискальных регистраторов и терминалов сбора данных поддерживают прямое подключение по сетевым протоколам (через Ethernet или Wi-Fi). В этом случае драйверу не требуется доступ к локальным портам сервера или клиентской машины. Настройка интеграции в 1С выполняется по IP-адресу устройства, что делает неважным способ запуска системы — локально, через RDP или веб-клиент.
Производители торгового оборудования поставляют специализированное программное обеспечение (например, драйверы АТОЛ версии 10 и выше поддерживают режим веб-сервера). Сервер оборудования устанавливается локально на тот компьютер, к которому физически подключен кассовый аппарат. Центральная база 1С, работающая на удаленном сервере в RDP-сессии, взаимодействует с локальным сервером оборудования посредством сетевых HTTP-запросов или API. Это полностью решает проблему проброса портов и безопасности.
Вместо организации работы сотрудников внутри тяжелых RDP-сессий на сервере, рекомендуется использовать подключение через Тонкий клиент 1С, установленный непосредственно на рабочих станциях пользователей. Тонкий клиент общается с базой данных по HTTP/HTTPS протоколу, но сам код работы с торговым оборудованием выполняется на локальном компьютере. Это обеспечивает легальный, быстрый и бесперебойный доступ драйверов ко всем физическим портам рабочей станции.