При переносе информационных баз 1С:Предприятие 7.7 на новый сервер или современную 64-битную операционную систему часто перестают работать внешние обработки, использующие обмен данными через ODBC. В процессе подключения внешняя обработка падает с характерным системным сообщением: [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию, после чего платформа аварийно завершает сценарий ошибкой: Значение не представляет агрегатный объект (Close). Рассмотрим подробнее, почему возникают подобные сбои и как шаг за шагом восстановить корректный обмен данными.
Платформа 1С 7.7 является 32-разрядным приложением. Следовательно, она может использовать только 32-битные драйверы ODBC и настроенные 32-битные источники данных DSN (Data Source Name). Если на 64-разрядной версии Windows запустить диспетчер источников данных через стандартную «Панель управления», операционная система по умолчанию откроет 64-битную версию утилиты, расположенную в папке C:\Windows\System32\odbcad32.exe. Настроенные в ней источники 32-битная платформа 1С просто не увидит.
Разберем по шагам правильную настройку источника данных:
%systemdrive%\Windows\SysWoW64\odbcad32.exe.SQL Server или драйвер для работы с файлами баз данных) и пропишем точно такое же имя источника данных, которое указано в коде внешней обработки.Проанализируем сопутствующую ошибку платформы 1С: Значение не представляет агрегатный объект (Close). Она возникает в коде внешней обработки, когда вызов метода закрытия соединения происходит без проверки факта его открытия. Если функция инициализации или соединения с БД завершилась неудачей из-за отсутствия драйвера, переменная подключения осталась пустой (или содержит число 0). При попытке обратиться к методу Close() у несуществующего объекта программа завершает работу с аварийной ошибкой.
Посмотрим на пример безопасного закрытия соединения в кодовой базе 1С 7.7:
// Безопасное завершение работы с объектом соединения
Попытка
Если ПустоеЗначение(TestODBC) = 0 Тогда
TestODBC.Close();
КонецЕсли;
Исключение
// Подавляем исключение при очистке ресурса, если соединение не было создано
КонецПопытки;
Чтобы раз и навсегда исключить зависимость внешней обработки от ручных настроек DSN на каждом отдельном компьютере или сервере, разберем альтернативный вариант — прямое подключение с указанием строки соединения. В этом случае имя источника данных не регистрируется в системе, а все параметры передаются напрямую драйверу.
Посмотрим на пример формирования строки подключения через OLE DB / ODBC напрямую из кода:
СтрокаПодключения = "Driver={SQL Server};Server=ИмяСервера;Database=ИмяБазы;Uid=sa;Pwd=Пароль;";
// Либо для более современных версий драйверов:
// СтрокаПодключения = "Driver={ODBC Driver 17 for SQL Server};Server=ИмяСервера;Database=ИмяБазы;Uid=sa;Pwd=Пароль;";
При таком подходе достаточно лишь убедиться, что соответствующий 32-битный драйвер зарегистрирован в операционной системе.
Нередко после переустановки драйвера и успешного соединения с СУБД внешняя обработка спотыкается на следующей стадии: ODBCRecordset error: State 42S02, native 208, message [SQL Server]Недопустимое имя объекта "dbo.CUSTTABLE". Код ошибки Native 208 в Microsoft SQL Server означает, что запрошенная таблица или представление не найдены в контексте текущей базы данных. Выясним основные причины этой проблемы и пути их решения:
master. Естественно, таблиц dbo.CUSTTABLE или dbo.VENDTABLE там нет. Для исправления откроем наш 32-битный DSN через %systemdrive%\Windows\SysWoW64\odbcad32.exe, дойдем до шага выбора базы данных и установим флаг Подключаться к следующей базе данных по умолчанию, выбрав нужную информационную базу. Либо в SQL Server Management Studio откроем свойства логина и изменим Default database с master на рабочую БД.db_datareader или выданы явные права: GRANT SELECT ON dbo.CUSTTABLE TO [ИмяПользователя];.CUSTTABLE и VENDTABLE типичны для внешних ERP-систем (например, Microsoft Dynamics AX). В зависимости от конфигурации они могут размещаться не в схеме dbo, а в пользовательской схеме. Рекомендуется проверить структуру таблиц через SQL Server Management Studio и при необходимости скорректировать текст запроса в обработке 1С.Cyrillic_General_CS_AS), то имена CUSTTABLE и custtable будут считаться разными объектами. Убедимся, что база использует регистронезависимую сортировку (CI — Case Insensitive, например Cyrillic_General_CI_AS).