В этой статье мы подробно разберем распространенную проблему, с которой сталкиваются разработчики 1С при использовании внешних источников данных (ВИД). Часто возникает ситуация, когда внешний источник данных, настроенный в конфигурации, прекрасно работает при вызове с сервера в интерактивном режиме, но при попытке использовать его в фоновом или регламентном задании выдает ошибку авторизации. Мы выясним причину такого поведения и предложим эффективные способы решения.
Внешние источники данных в 1С — это мощный инструмент для интеграции с различными СУБД, такими как MS SQL Server, PostgreSQL, Oracle Database, IBM DB2, а также с ODBC-источниками. Они позволяют использовать данные из внешних систем непосредственно в приложениях 1С, например, для построения отчетов, выполнения расчетов или отображения информации в динамических списках. Такая интеграция значительно расширяет возможности систем 1С, позволяя создавать комплексные решения.
Основная сложность возникает, когда настроенный и проверенный внешний источник данных отказывается работать в фоновых или регламентных заданиях, выдавая ошибки авторизации. Давайте рассмотрим, в чем заключается принципиальное отличие между интерактивным вызовом на сервере и вызовом в фоновом задании.
ДлительныеОперации), выполняются от имени этого пользователя.Таким образом, основное отличие заключается в контексте выполнения и способах авторизации. Интерактивный режим более "снисходителен" к настройкам, в то время как фоновые задания требуют явного и точного указания всех параметров для установления соединения.
Для успешного подключения к внешнему источнику данных из фонового или регламентного задания необходимо программно устанавливать параметры соединения непосредственно в коде перед выполнением запроса. Это гарантирует, что подключение будет выполнено с правильными учетными данными, независимо от контекста выполнения.
Рассмотрим пошаговый подход и пример кода, который демонстрирует, как это можно реализовать. Мы будем использовать методы объекта ВнешниеИсточникиДанных для управления соединением.
ПараметрыСоединенияВнешнегоИсточникаДанных: Этот объект позволяет программно задать все необходимые атрибуты для подключения.УстановитьПараметрыСоединенияСеанса() для привязки созданных параметров к конкретному внешнему источнику данных в текущем сеансе.УстановитьСоединение(), чтобы инициировать подключение с заданными параметрами.Пример кода, демонстрирующий программное подключение:
// Предполагается, что функция ПолучитьДанныеПодключения() возвращает Структуру с полями SERVER, UID, PWD, DATABASE
// Эти данные должны быть получены из безопасного хранилища.
&НаСервере
Функция ВыполнитьОбновление(ПараметрыОбновления) Экспорт
Ответ = ПодключитьВнешнийИсточник();
Если Ответ.Результат Тогда
// Здесь можно выполнять запросы к внешнему источнику данных
// Например: Выполнить("Ответ = Обновить" + ПараметрыОбновления.ТаблицаДанных +"(Ответ)");
// Пример использования:
// Запрос = Новый Запрос("ВЫБРАТЬ * ИЗ ВнешнийИсточник.ВнешниеДанные.Таблица");
// РезультатЗапроса = Запрос.Выполнить().Выгрузить();
// СтруктураОтвета.Текст = "Данные успешно получены.";
КонецЕсли;
Возврат Ответ;
КонецФункции
&НаСервере
Функция ПодключитьВнешнийИсточник()
СтруктураОтвета = Новый Структура("Результат, ТекстОшибки, Текст");
Попытка
// Получаем данные для подключения из некоторого хранилища (например, регистра сведений)
Выборка = ПолучитьДанныеПодключения(); // Это должна быть ваша функция
ПараметрыСоединения = Новый ПараметрыСоединенияВнешнегоИсточникаДанных;
// Формируем строку соединения для SQL Server
ПараметрыСоединения.СтрокаСоединения = ПолучитьСтрокуПодключения(Выборка);
// Указываем тип аутентификации
ПараметрыСоединения.АутентификацияОС = Ложь; // Используем аутентификацию SQL Server
// Задаем учетные данные
ПараметрыСоединения.ИмяПользователя = Выборка.UID;
ПараметрыСоединения.Пароль = Выборка.PWD;
// Указываем СУБД
ПараметрыСоединения.СУБД = "MSSQLServer";
// Получаем объект внешнего источника данных по имени
ВнешнийИсточник = ВнешниеИсточникиДанных.ВнешниеДанные; // 'ВнешниеДанные' - это имя вашего внешнего источника
// Устанавливаем параметры соединения для текущего сеанса
ВнешнийИсточник.УстановитьПараметрыСоединенияСеанса(ПараметрыСоединения);
// Устанавливаем само соединение
ВнешнийИсточник.УстановитьСоединение();
СтруктураОтвета.Результат = Истина;
Возврат СтруктураОтвета;
Исключение
СтруктураОтвета.Результат = Ложь;
СтруктураОтвета.ТекстОшибки = "Не удалось выполнить подключение к внешнему источнику. " + ОписаниеОшибки();
Возврат СтруктураОтвета;
КонецПопытки;
КонецФункции
&НаСервере
Функция ПолучитьСтрокуПодключения(Данные)
SERVER = СокрЛП(Данные.SERVER);
UID = СокрЛП(Данные.UID);
PWD = СокрЛП(Данные.PWD); // Пароль не используется в строке соединения при SQL Auth, но для примера пусть будет
DATABASE = СокрЛП(Данные.DATABASE);
Возврат
"DRIVER={SQL Server};" // Или DRIVER={ODBC Driver 17 for SQL Server} для более новых версий
+"SERVER="+SERVER+";"
+"UID="+UID+";"
+"PWD="+PWD+";"
+"DATABASE="+DATABASE+";"
+"LANGUAGE=Русский";
КонецФункции
В этом примере функция ПодключитьВнешнийИсточник() программно создает объект ПараметрыСоединенияВнешнегоИсточникаДанных, заполняет его необходимыми данными (полученными из абстрактной функции ПолучитьДанныеПодключения()) и устанавливает соединение. Таким образом, даже в фоновом задании 1С будет использовать явно указанные учетные данные для доступа к внешней СУБД.
Как справедливо было замечено в обсуждении, хранение паролей в явном виде в коде является плохой практикой (моветоном) с точки зрения безопасности. Мы рассмотрим несколько способов безопасного хранения логинов и паролей внешних ресурсов, используемых в 1С:
Важное замечание: Независимо от выбранного метода, всегда информируйте пользователей о возможных рисках, связанных с хранением учетных данных, и строго соблюдайте все меры безопасности.
Помимо основных аспектов авторизации, существуют и другие важные моменты, которые следует учитывать при работе с внешними источниками данных в фоновых заданиях:
Мы рассмотрели ключевые аспекты работы с внешними источниками данных в фоновых заданиях, выявили причину ошибок авторизации и предложили надежные решения, включая программное установление параметров соединения и методы безопасного хранения учетных данных. Применяя эти рекомендации, вы сможете обеспечить стабильную и безопасную работу интеграций вашей системы 1С с внешними СУБД.