В процессе эксплуатации клиент-серверных баз 1С:Предприятие разработчики и администраторы часто сталкиваются со специфической ситуацией: создан самописный или типовой план обмена, настроено регламентное задание, в Журнале регистрации фиксируется статус «Успешно», однако фактический обмен данными между базами не выполняется. При этом интерактивный ручной запуск того же самого алгоритма под пользователем 1С проходит без нареканий. Рассмотрим подробно причины возникновения этой проблемы и разберем по шагам порядок ее диагностики и исправления.
Для того чтобы понять природу проблемы, проанализируем, в каких условиях выполняется код 1С при ручном запуске и при выполнении регламентного задания.
При ручном интерактивном запуске обработка обмена работает в контексте клиентского сеанса текущего пользователя ОС и 1С. В этом случае коду доступны:
Z:\ Exchange\).ПараметрыСеанса.ТекущийПользователь).При автоматическом выполнении регламентного задания код исполняется в фоновом сеансе непосредственно на сервере 1С:Предприятия под служебной учетной записью операционной системы (по умолчанию USR1CV8 или usr1cv8_8_3). Фоновый сеанс работает без визуального интерфейса и не имеет доступа к окружению рабочего стола локального пользователя.
Почему же в Журнале регистрации пишется, что задание выполнено, хотя выгрузка или загрузка файлов не состоялась? Выясним причину:
В алгоритмах обмена очень часто используется конструкция Попытка ... Исключение. Если внутри блока Попытка происходит сбой (например, нет доступа к сетевому пути или не найден параметр), алгоритм переходит в блок Исключение. Если в этом блоке отсутствует запись ошибки в журнал или явный вызов исключения через ВызватьИсключение, платформа считаем фоновую задачу успешно выполненной. Журнал регистрации фиксирует успешное завершение выполнения фонового задания, так как сама процедура-обработчик завершилась без критической аварии платформы.
Разберем, как правильно организовать диагностику. Добавим запись сообщений в Журнал регистрации в ключевых точках алгоритма обмена. Это позволит точно определить, до какого момента доходит исполнение кода и какие значения принимают переменные в фоновом режиме.
Воспользуемся методом ЗаписьЖурналаРегистрации(). Посмотрим на пример правильного оформления кода обмена:
Процедура ВыполнитьАвтообменНаСервере() Экспорт
ИмяСобытия = "АвтообменДанными";
ЗаписьЖурналаРегистрации(ИмяСобытия,
УровеньВещанияЖурналаРегистрации.Информация,
,
,
"Старт процедура автообмена в фоновом режиме.");
ПутьКФайлуОбмена = ПолучитьПутьКФайлуОбмена();
// Записываем полученный путь для проверки
ЗаписьЖурналаРегистрации(ИмяСобытия,
УровеньВещанияЖурналаРегистрации.Информация,
,
,
"Сформированный путь к файлу: " + ПутьКФайлуОбмена);
Попытка
// Основной блок выполнения выгрузки/загрузки
СформироватьСообщениеОбмена(ПутьКФайлуОбмена);
ЗаписьЖурналаРегистрации(ИмяСобытия,
УровеньВещанияЖурналаРегистрации.Информация,
,
,
"Файл обмена успешно сформирован и записан.");
Исключение
// Обязательная фиксация ошибки в ЖР
ТекстОшибки = ОписаниеОшибки();
ЗаписьЖурналаРегистрации(ИмяСобытия,
УровеньВещанияЖурналаРегистрации.Ошибка,
,
,
"Ошибка при выполнении автообмена: " + ТекстОшибки);
КонецПопытки;
КонецПроцедуры
Обратите особое внимание на то, что в блок Исключение обязательно нужно передавать ОписаниеОшибки() с уровнем УровеньВещанияЖурналаРегистрации.Ошибка. В таком случае сбой отобразится в Журнале регистрации красным значком ошибки.
Рассмотрим частую проблему, связанную с путями к файлам сообщения обмена. Если в настройках обмена указан путь вида Z:\Exchange\Message.xml, фоновое задание на сервере завершится ошибкой или пустой операцией. У системной службы USR1CV8 нет подключенного сетевого диска Z:.
Правильное решение: Все пути к сетевым папкам и общим ресурсам должны указываться исключительно в формате UNC (Universal Naming Convention):
// Неправильно:
ПутьФайла = "Z:\Exchange\Message.xml";
// Правильно:
ПутьФайла = "\\ServerName\ExchangeFolder\Message.xml";
Убедимся, что служба сервера 1С:Предприятия имеет права на чтение, запись и удаление файлов в целевом сетевом каталоге. Для этого проанализируем следующую последовательность действий:
1C:Enterprise Server (через оснастку services.msc на сервере приложений)..\USR1CV8), данная учетная запись не имеет прав на сетевые ресурсы других компьютеров. Потребуется изменить учетную запись службы на доменную (например, DOMAIN\1c_server) или расшарить папку локально.При запуск фонового задания не выполняются стандартные процедуры модуля управляемого приложения или модуля обычного приложения. Если алгоритм обмена использует обращения к переменным или параметрам сеанса, таким как ПараметрыСеанса.ТекущийПользователь, в фоновом задании эти параметры могут оказаться неинициализированными.
Если в коде присутствует проверка вида:
Если НЕ ЗначениеЗаполнено(ПараметрыСеанса.ТекущийПользователь) Тогда
Возврат; // Алгоритм тихо завершает работу!
КонецЕсли;
Процедура просто прервет выполнение без вызова исключения. Проверим инициализацию параметров сеанса в обработчике УстановкаПараметровСеанса модуля сеанса или перед выгрузкой зададим их явным образом.
Проанализируем код обмена на наличие вызовов, которые недопустимы на сервере без визуального интерфейса. К ним относятся:
Предупреждение()Вопрос()Форма или клиентским директивам #Если Клиент ТогдаПри выполнении на сервере интерактивные вызовы либо проигнорируются, либо вызовут исключение, которое при неверной обработке скрывает факт ошибки.
\\Server\Share\).ЗаписьЖурналаРегистрации().Попытка ... Исключение и убедитесь, что ошибки не подавляются, а записываются в ЖР с вызовом ОписаниеОшибки().