При работе с механизмом Внешние источники данных программисты часто сталкиваются с ситуацией: соединение с базой SQL установлено успешно, список таблиц отображается, но при попытке выбрать конкретные поля список оказывается пустым или данные помечаются как «Не объектные данные». Разберем по шагам причины этой проблемы и способы их решения (может быть полезна подсистема выгрузки данных во внешнюю базу SQL).
Проанализируем, как 1С интерпретирует таблицы SQL. Платформа разделяет их на два типа: объектные и неообъектные. Если в таблице базы-источника не определен первичный ключ (Primary Key), 1С не может однозначно идентифицировать запись, из-за чего считает данные «не объектными». В некоторых случаях это блокирует корректное отображение состава колонок в мастере подключения.
Что нужно сделать: проверьте структуру таблицы в SQL Server Management Studio. Если ключа нет, его необходимо добавить (используя анализ структуры метаданных). Если изменять структуру таблицы нельзя, можно создать View (представление), в котором будет присутствовать уникальное поле, и подключаться уже к нему.
Выясним причину, связанную с безопасностью. Даже если у пользователя SQL есть права db_datareader на чтение данных, этого может быть недостаточно для получения структуры колонок через драйвер ODBC. 1С требует доступа к системным представлениям метаданных.
Решение: выполните в консоли SQL запрос для назначения прав на просмотр определений:
GRANT VIEW DEFINITION TO [Имя_Вашего_Пользователя];
Также убедитесь, что вы не используете системную учетную запись sa, так как это может блокироваться настройками безопасности сервера. Используйте специально созданного пользователя с SQL-аутентификацией.
Рассмотрим техническую сторону соединения. Часто в строке подключения используется стандартный драйвер {SQL Server}. Это старая библиотека (sqlsrv32.dll), которая плохо поддерживает современные типы данных и версии SQL Server.
odbcad32.exe — для 32 и 64 бит.Если штатный механизм метаданных 1С все равно работает некорректно, рассмотрим альтернативный вариант — работу через ADODB.Connection. Этот метод позволяет обойти жесткие требования платформы к «объектности» данных и первичным ключам, так как мы получаем данные напрямую SQL-запросом.
Посмотрим на пример кода (для отладки подойдет управляемая консоль запросов) для выполнения прямого запроса:
Соединение = Новый COMОбъект("ADODB.Connection");
СтрокаСоединения = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=GTEST;UID=t;PWD=1;DATABASE=test_db;";
Попытка
Соединение.Open(СтрокаСоединения);
RecordSet = Соединение.Execute("SELECT TOP 10 * FROM dbo.MyTable");
Пока НЕ RecordSet.EOF Цикл
// Обработка данных
ЗначениеПоля = RecordSet.Fields("ИмяКолонки").Value;
RecordSet.MoveNext();
КонецЦикла;
Соединение.Close();
Исключение
Сообщить("Ошибка подключения: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем ситуацию с ошибкой «Невозможно использовать специального участника sa». Она возникает, если на сервере SQL включена только Windows-аутентификация. Чтобы подключение по логину и паролю (UID и PWD) заработало, необходимо в свойствах сервера SQL (раздел Security) установить режим SQL Server and Windows Authentication mode.
Подведем итог: для исправления проблемы первым делом проверьте наличие Primary Key в SQL и права VIEW DEFINITION. Если это не помогает — переходите на актуальный драйвер ODBC или используйте объект COMОбъект("ADODB.Connection") для прямого чтения данных.