Рассмотрим классическую техническую проблему, с которой часто сталкиваются системные администраторы и разработчики при переносе баз данных «1С:Предприятие 7.7» на современные операционные системы, такие как Windows Server 2016 или Windows Server 2019. Задача кажется простой: настроить ночной запуск автоматической выгрузки данных с помощью встроенного Планировщика задач (Task Scheduler). Однако на практике мы сталкиваемся с ситуацией, когда пакетный запуск Конфигуратора для реиндексации проходит успешно, а вот режим Предприятия для выполнения внешней обработки зависает в процессах или завершается без видимых результатов.
Для того чтобы решить эту проблему, нам необходимо проанализировать особенности работы операционных систем Windows семейства Server, начиная с версии 2008. Главное отличие кроется в архитектуре безопасности и так называемой изоляции нулевой сессии (Session 0 Isolation).
Когда в настройках задачи Планировщика Windows мы выбираем опцию «Выполнять вне зависимости от регистрации пользователя» (Run whether user is logged on or not), операционная система запускает этот процесс в фоновом режиме в изолированной сессии — Session 0. В этой сессии полностью отсутствует графический интерфейс (GUI) и интерактивный рабочий стол (Desktop).
Теперь сопоставим это с логикой работы платформы «1С:Предприятие 7.7»:
1cv7s.exe с параметром config изначально проектировался с возможностью работы в консольном режиме. Он выполняет технические операции (такие как реиндексация, тестирование и исправление) напрямую с файлами базы данных без необходимости инициализации сложных графических окон. Поэтому он без проблем отрабатывает в фоновом режиме Session 0.1cv7s.exe с параметром enterprise инициирует полноценное графическое 32-битное приложение. Платформа 1С 7.7 жестко завязана на отрисовку интерфейса. Даже если мы запускаем ее исключительно ради выполнения одной функции в Глобальном модуле, она пытается создать главное окно программы, инициализировать системное меню, панели инструментов и обратиться к графической подсистеме Windows. В условиях Session 0, где нет рабочего стола, любая попытка отрисовать форму (например, через вызов метода ОткрытьФорму()) приводит к критической ошибке, аварийному завершению процесса или бесконечному ожиданию несуществующего рабочего стола.Проанализируем еще один важнейший аспект. Платформа «1С:Предприятие 7.7» является 32-битным приложением. В 64-битной среде Windows Server 2016 выполнение таких приложений контролируется подсистемой WoW64 (Windows on Windows 64-bit). При запуске задачи без интерактивного входа пользователя операционная система обращается к системному профилю, расположенному по пути C:\Windows\System32\config\systemprofile\ для 64-битных процессов и соответственно C:\Windows\SysWOW64\config\systemprofile\ для 32-битных процессов.
Многие компоненты 1С, включая парсеры XML, компоненты для работы с Excel и стандартные библиотеки отрисовки интерфейса Windows, требуют физического наличия папки Desktop в профиле пользователя. Если этой папки нет, инициализация графической среды внутри сессии завершается сбоем, и выполнение Глобального модуля даже не успевает начаться.
Это самый быстрый и распространенный технический прием, позволяющий «обмануть» операционную систему и заставить 32-битные приложения успешно инициализировать свои графические интерфейсы в фоновом режиме.
Выполним следующие шаги:
C:\Windows\System32\config\systemprofile\ и создадим там папку с именем Desktop.C:\Windows\SysWOW64\config\systemprofile\ и также создадим там папку с именем Desktop. Это критически важно для корректной работы 32-битных компонент платформы 1С 7.7!Serviceuser), либо для группы «Администраторы».C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache.Если ваша внешняя обработка взаимодействует с внешними приложениями (например, запускает сторонние утилиты через функцию ЗапуститьПриложение) или формирует сложные отчеты, создание системных папок может не решить проблему на 100%. В таких ситуациях лучшим решением будет полный отказ от запуска задачи в Session 0. Мы можем настроить полноценную, активную, но заблокированную сессию пользователя на сервере.
Давайте настроим эту схему по шагам:
Serviceuser. Теперь при любой перезагрузке сервера операционная система будет автоматически входить в сеанс этого пользователя, инициализируя полноценный рабочий стол (Session 1 или выше).Serviceuser (папка Startup в профиле пользователя). Содержимое файла должно быть следующим:
rundll32.exe user32.dll,LockWorkStation
Эта команда мгновенно блокирует консоль, при этом сеанс пользователя остается полностью активным в памяти сервера, все графические библиотеки инициализированы, а окна могут беспрепятственно отрисовываться.
Serviceuser теперь всегда залогинен в системе (хоть его сессия и заблокирована), планировщик без проблем запустит задачу в его интерактивном контексте. При такой настройке все функции 1С, включая ЗапуститьПриложение, будут отрабатывать идеально.Чтобы минимизировать риски зависания 1С в фоновом режиме, нам необходимо адаптировать программный код Глобального модуля и самой внешней обработки. Главное правило — полное отсутствие модальных окон, вопросов пользователю и предупреждений.
Рассмотрим пример правильной реализации запуска внешней обработки в процедуре ПриНачалеРаботыСистемы в Глобальном модуле:
Процедура ПриНачалеРаботыСистемы()
// Проверяем, что запуск произведен под специальным сервисным пользователем
Если Строка(глПользователь) = "Svc" Тогда
// Отключаем статус возврата, чтобы основное окно Предприятия не открывалось стандартным путем
СтатусВозврата(0);
// Запускаем внешнюю обработку выгрузки данных
ОткрытьФорму("Отчет", "ВыгрузкаЗаявки", КаталогИБ() + "ExtForms\ВыгрузкаЗаявки.ert");
Возврат;
КонецЕсли;
КонецПроцедуры
Обратите внимание на использование метода КаталогИБ() вместо прямой переменной КаталогИБ. Это исключает синтаксические ошибки при инициализации переменных среды.
Теперь посмотрим на пример кода внутри самой внешней обработки ВыгрузкаЗаявки.ert. Вся основная логика должна выполняться в предопределенной процедуре ПриОткрытии, после чего работа должна корректно завершаться без вывода диалоговой формы на экран:
Процедура ПриОткрытии()
// Блокируем вывод интерактивного диалогового окна обработки
СтатусВозврата(0);
// Вызываем основную процедуру выгрузки данных
ВыполнитьВыгрузкуЗаявок();
// Завершаем работу системы 1С:Предприятие
ЗавершитьРаботуСистемы(0);
Возврат;
КонецПроцедуры
Процедура ВыполнитьВыгрузкуЗаявок()
// Здесь располагается алгоритм формирования файлов выгрузки
// Например, запись в текстовый файл или XML
ИмяФайла = "D:\Exchange\export.txt";
Текст = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку("Выгрузка успешно завершена в " + ТекущееВремя());
Текст.Записать(ИмяФайла);
КонецПроцедуры
Использование конструкции СтатусВозврата(0) в процедуре ПриОткрытии внешней обработки крайне важно. Она предотвращает фактическое создание и отрисовку графической формы на экране, что позволяет коду выполниться даже в урезанном окружении Session 0 без вызова критических ошибок операционной системы.
При настройке задачи в Планировщике Windows Server 2016 обязательно обратите внимание на следующие параметры:
HKEY_CURRENT_USER (HKCU) не монтируется. Для 1С 7.7 доступ к этой ветке жизненно необходим, так как именно там хранятся настройки подключения к базам данных и параметры платформы. Без доступа к HKCU платформа завершит работу с ошибкой еще до старта Глобального модуля.Serviceuser на сервере предоставлены соответствующие права. Откройте локальную политику безопасности (команда secpol.msc), перейдите в раздел «Локальные политики» -> «Назначение прав пользователя» -> «Вход в качестве пакетного задания» (Log on as a batch job) и добавьте туда вашу сервисную учетную запись.Применяя данные методы в комплексе, мы сможем добиться стабильной и бесперебойной автоматической работы устаревших конфигураций «1С:Предприятие 7.7» на современных серверных платформах Windows.