Как исправить ошибку ODBC при синхронизации и переносе баз в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При переносе информационных баз 1С:Предприятие 7.7 на новый сервер или современную 64-битную операционную систему часто перестают работать внешние обработки, использующие обмен данными через ODBC. В процессе подключения внешняя обработка падает с характерным системным сообщением: [Microsoft][Диспетчер драйверов ODBC] Источник данных не найден и не указан драйвер, используемый по умолчанию, после чего платформа аварийно завершает сценарий ошибкой: Значение не представляет агрегатный объект (Close). Рассмотрим подробнее, почему возникают подобные сбои и как шаг за шагом восстановить корректный обмен данными.

Причина 1. Несоответствие разрядности утилиты настройки ODBC (32-бит против 64-бит)

Платформа 1С 7.7 является 32-разрядным приложением. Следовательно, она может использовать только 32-битные драйверы ODBC и настроенные 32-битные источники данных DSN (Data Source Name). Если на 64-разрядной версии Windows запустить диспетчер источников данных через стандартную «Панель управления», операционная система по умолчанию откроет 64-битную версию утилиты, расположенную в папке C:\Windows\System32\odbcad32.exe. Настроенные в ней источники 32-битная платформа 1С просто не увидит.

Разберем по шагам правильную настройку источника данных:

  1. Закроем стандартный диспетчер ODBC и 1С.
  2. Запустим диалоговое окно «Выполнить» сочетанием клавиш Win + R и введем точный путь к 32-разрядной утилите: %systemdrive%\Windows\SysWoW64\odbcad32.exe.
  3. Перейдем на вкладку Системный DSN. Очень важно создавать источник именно в системном DSN, а не в «Пользовательском DSN», так как системный источник доступен всем пользователям сервера, включая службы и терминальные сеансы.
  4. Нажмем кнопку «Добавить», выберем необходимый драйвер (например, SQL Server или драйвер для работы с файлами баз данных) и пропишем точно такое же имя источника данных, которое указано в коде внешней обработки.
  5. Проверим соединение кнопкой тестирования.

Причина 2. Ошибка 1С: Значение не представляет агрегатный объект (Close)

Проанализируем сопутствующую ошибку платформы 1С: Значение не представляет агрегатный объект (Close). Она возникает в коде внешней обработки, когда вызов метода закрытия соединения происходит без проверки факта его открытия. Если функция инициализации или соединения с БД завершилась неудачей из-за отсутствия драйвера, переменная подключения осталась пустой (или содержит число 0). При попытке обратиться к методу Close() у несуществующего объекта программа завершает работу с аварийной ошибкой.

Посмотрим на пример безопасного закрытия соединения в кодовой базе 1С 7.7:


// Безопасное завершение работы с объектом соединения
Попытка
    Если ПустоеЗначение(TestODBC) = 0 Тогда
        TestODBC.Close();
    КонецЕсли;
Исключение
    // Подавляем исключение при очистке ресурса, если соединение не было создано
КонецПопытки;

Причина 3. Переход на DSN-less подключение (подключение без DSN)

Чтобы раз и навсегда исключить зависимость внешней обработки от ручных настроек 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-битный драйвер зарегистрирован в операционной системе.

Причина 4. Ошибка 42S02 / Native 208: Недопустимое имя объекта

Нередко после переустановки драйвера и успешного соединения с СУБД внешняя обработка спотыкается на следующей стадии: ODBCRecordset error: State 42S02, native 208, message [SQL Server]Недопустимое имя объекта "dbo.CUSTTABLE". Код ошибки Native 208 в Microsoft SQL Server означает, что запрошенная таблица или представление не найдены в контексте текущей базы данных. Выясним основные причины этой проблемы и пути их решения:

  1. Неверная база данных по умолчанию (Default Database): Если при настройке DSN или в свойствах учетной записи пользователя SQL не указана конкретная рабочая база, сессия подключается к системной базе master. Естественно, таблиц dbo.CUSTTABLE или dbo.VENDTABLE там нет. Для исправления откроем наш 32-битный DSN через %systemdrive%\Windows\SysWoW64\odbcad32.exe, дойдем до шага выбора базы данных и установим флаг Подключаться к следующей базе данных по умолчанию, выбрав нужную информационную базу. Либо в SQL Server Management Studio откроем свойства логина и изменим Default database с master на рабочую БД.
  2. Отсутствие прав доступа (маскировка ошибки 229): В целях безопасности Microsoft SQL Server возвращает ошибку 208 вместо сообщения «Доступ запрещен», если у пользователя СУБД отсутствуют права на чтение объекта. Проверим сопоставление пользователя (User Mapping) в SQL Server Management Studio и убедимся, что ему назначена роль db_datareader или выданы явные права: GRANT SELECT ON dbo.CUSTTABLE TO [ИмяПользователя];.
  3. Несовпадение схем данных: Таблицы с именами CUSTTABLE и VENDTABLE типичны для внешних ERP-систем (например, Microsoft Dynamics AX). В зависимости от конфигурации они могут размещаться не в схеме dbo, а в пользовательской схеме. Рекомендуется проверить структуру таблиц через SQL Server Management Studio и при необходимости скорректировать текст запроса в обработке 1С.
  4. Чувствительность к регистру (Collation): Если на новом SQL-сервере база данных была развернута с параметром сортировки, чувствительным к регистру (CS — Case Sensitive, например Cyrillic_General_CS_AS), то имена CUSTTABLE и custtable будут считаться разными объектами. Убедимся, что база использует регистронезависимую сортировку (CI — Case Insensitive, например Cyrillic_General_CI_AS).
← На главную