При разработке сложных систем на базе 1С:ERP или других конфигураций на платформе 1С:Предприятие 8.3, программисты часто сталкиваются с необходимостью выноса тяжелых операций во внешние источники данных (ВИД) в фоновые задания. Однако стандартный подход, работающий со справочниками или документами (передача ссылки в параметры задания), здесь дает сбой. Мы получаем либо сообщение «Объект не найден», либо ошибку «Аутентификационный контекст клиента отсутствует в рабочем процессе». Рассмотрим подробно, почему это происходит и как правильно организовать работу.
Для начала проанализируем, чем ссылка на объект внешнего источника данных отличается от привычной ссылки СправочникСсылка. Внутренние объекты 1С хранятся в основной базе, и их GUID (уникальный идентификатор) понятен любому сеансу в рамках этой базы. Процесс десериализации такой ссылки в фоновом задании проходит бесшовно, так как база данных одна и та же.
Ссылка на Внешний источник данных является составной и контекстно-зависимой. Она содержит не только идентификатор записи в удаленной СУБД, но и внутреннюю информацию о подключении. Проблема заключается в том, что фоновое задание — это абсолютно новый сеанс. В этом сеансе по умолчанию может отсутствовать активное соединение с внешним источником, или параметры этого соединения могут отличаться от тех, что были в сеансе-инициаторе.
Когда мы передаем готовую ссылку во внешнее задание, система пытается «найти» её в контексте нового сеанса. Если соединение еще не установлено или контекст безопасности не позволяет обратиться к таблице, 1С не может сопоставить идентификатор с объектом и выдает Объект не найден.
Ситуация усложняется, если используется Windows-аутентификация для подключения к SQL-серверу внешнего источника. Разберем механизм возникновения ошибки: «Аутентификационный контекст клиента отсутствует в рабочем процессе».
USR1CV8).Именно поэтому попытка получить ссылку «по идентификатору» внутри фонового задания часто падает с ошибкой прав или контекста.
Вместо того чтобы передавать в параметры фонового задания сложный объект типа ВнешнийИсточникДанныхСсылка, мы рекомендуем передавать первичный ключ записи. Это может быть число, строка или УникальныйИдентификатор, в зависимости от того, какой тип данных используется в качестве ключа во внешней таблице.
Рассмотрим алгоритм действий:
Пример кода для получения ссылки по ключу внутри фонового задания:
// Входящий параметр КлючЗаписи - это строка или число, полученное из внешней таблицы
ПараметрыКлюча = Новый Структура("Идентификатор", КлючЗаписи);
СсылкаНаОбъект = ВнешниеИсточникиДанных.ИмяВашегоИсточника.Таблицы.ИмяТаблицы.ПолучитьСсылку(ПараметрыКлюча);
// Теперь проверяем, «видит» ли система объект
Если СсылкаНаОбъект.Пустая() Тогда
// Обработка ситуации, когда объект не найден
КонецЕсли;
Чтобы фоновое задание «увидело» данные по ссылке, необходимо убедиться, что соединение установлено. Если в конфигураторе параметры подключения (логин, пароль, сервер) не заполнены жестко, а устанавливаются динамически, фоновое задание об этом ничего не знает.
Проанализируем шаги по подготовке сеанса фонового задания:
Во-первых, перед любым обращением к ВИД в процедуре фонового задания нужно вызвать метод УстановитьПараметрыСоединения(). Это гарантирует, что сеанс фонового задания подключится к внешней базе с нужными учетными данными.
Процедура ВыполнитьРаботуВоВнешнемИсточнике(Параметры) Экспорт
// 1. Настраиваем соединение (динамически или берем из констант/настроек)
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
ПараметрыСоединения.СтрокаСоединения = "Driver={SQL Server};Server=MyServer;Database=MyBase;";
ПараметрыСоединения.ИмяПользователя = "SQL_User";
ПараметрыСоединения.Пароль = "StrongPassword";
// 2. Устанавливаем параметры для текущего сеанса фонового задания
ВнешниеИсточникиДанных.ИмяВашегоИсточника.УстановитьПараметрыСоединения(ПараметрыСоединения);
// 3. Теперь можно работать со ссылками или запросами к ВИД
// ... логика работы ...
КонецПроцедуры
Для исключения проблем с аутентификационным контекстом настоятельно рекомендуется использовать явную SQL-аутентификацию (логин и пароль базы данных) вместо Windows-авторизации при работе с внешними источниками в фоновых заданиях. Это сделает выполнение кода независимым от того, под каким пользователем запущена служба 1C:Enterprise Server.
Также важно помнить о следующих моментах:
Число) в точности соответствуют типам данных в SQL (например, bigint или int). Несоответствие типов приведет к тому, что метод ПолучитьСсылку вернет «Объект не найден».Подводя итог, можно сказать, что работа с внешними данными требует более «ручного» управления контекстом, чем работа с внутренними объектами. Передача первичных ключей и принудительная инициализация соединения внутри фонового задания — это стандарт надежной разработки в среде 1С:Предприятие.