При разработке интеграционных решений часто возникает задача получить данные из старой базы 1С 7.7 в новой системе на платформе 1С 8.3. Если код выполняется на клиенте, создание COM-объекта обычно не вызывает проблем. Но при попытке выполнить тот же код на сервере, например, в регламентном задании, можно столкнуться с ошибками "Интерфейс не поддерживается" или "Класс не зарегистрирован".
Рассмотрим два основных способа решения этой задачи: настройка COM-соединения и прямое подключение к базе данных SQL, которое является более предпочтительным и надежным.
Этот способ заключается в том, чтобы заставить сервер 1С 8.3 "увидеть" и запустить приложение 1С 7.7 через COM. Ошибки при создании объекта Новый COMObject("v77.Application") на сервере почти всегда связаны с конфликтом разрядности и правами доступа.
Выясним причину проблемы: Сервер 1С:Предприятие 8.3 — это 64-битный процесс (rphost.exe), в то время как платформа 1С 7.7 — это 32-битное приложение. По умолчанию 64-битный процесс не может напрямую создать и взаимодействовать с 32-битным COM-объектом. Для успешной работы необходимо выполнить несколько шагов.
Разберем по шагам, что нужно сделать:
regsvr32.exe. Нам нужна та, что работает с 32-битными библиотеками. Она находится в папке C:\Windows\SysWOW64\. Запустите командную строку от имени администратора и выполните команду:
C:\Windows\SysWOW64\regsvr32.exe "C:\Program Files (x86)\1Cv77\BIN\v77.exe"
Путь к файлу v77.exe может отличаться в вашей системе.
USR1CV8. Этот пользователь может не иметь разрешений на запуск и взаимодействие с COM-объектами, зарегистрированными для других пользователей. Чтобы это исправить, нужно либо изменить пользователя, от имени которого запускается служба "Агент сервера 1С:Предприятия 8.3", на пользователя с достаточными правами (например, того, из-под которого вы успешно регистрировали компоненту), либо настроить права для текущего пользователя службы. Важно: изменение пользователя службы может повлиять на безопасность системы.
dcomcnfg), перейдите в Компьютеры -> Мой компьютер -> Настройка DCOM. Найдите в списке объект "1C:V7.7 Application", откройте его свойства и на вкладке "Безопасность" предоставьте права на "Запуск и активацию" и "Доступ" для пользователя, от имени которого работает сервер 1С 8.
Этот метод может быть сложным в настройке и не всегда стабилен в работе. Он оправдан только в тех случаях, когда вам нужно не просто получить данные, а выполнить какие-то методы или бизнес-логику, заложенную в конфигурации 1С 7.7.
Если ваша база 1С 7.7 работает на Microsoft SQL Server, то самым быстрым, стабильным и производительным способом получения данных будет прямое подключение к её таблицам из 1С 8.3. Этот метод не требует установки и регистрации 1С 7.7 на сервере 1С 8.3.
Для подключения будем использовать технологию ADO (ActiveX Data Objects).
Посмотрим на пример подключения и получения данных:
Сначала необходимо создать COM-объекты для работы с ADO и установить соединение с базой данных.
// Создаем объекты для работы с ADODB
Connection = Новый COMОбъект("ADODB.Connection");
RecordSet = Новый COMОбъект("ADODB.Recordset");
// Формируем строку подключения к SQL-серверу
// Замените параметры на свои
ИмяСервераSQL = "SERVER_NAME"; // Имя или IP-адрес SQL-сервера
ИмяБазыSQL = "BASE_77_NAME"; // Имя базы данных 1С 7.7 в SQL
ПользовательSQL = "sa"; // Логин пользователя SQL
ПарольSQL = "YourPassword"; // Пароль пользователя SQL
СтрПодключения = "Provider=sqloledb;Server=" + ИмяСервераSQL
+ ";Database=" + ИмяБазыSQL
+ ";UID=" + ПользовательSQL
+ ";PWD=" + ПарольSQL + ";";
// Устанавливаем таймаут и открываем соединение
Попытка
Connection.CommandTimeout = 180; // Таймаут выполнения команды в секундах
Connection.ConnectionString = СтрПодключения;
Connection.Open();
Исключение
Сообщить("Не удалось подключиться к базе 7.7! " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Соединение установлено. Теперь можно выполнять запросы.
После установки соединения можно выполнять запросы на языке T-SQL к таблицам базы 1С 7.7. Названия таблиц и полей в 1С 7.7 не совпадают с именами объектов метаданных. Например, справочник "Номенклатура" может храниться в таблице SC152, а его реквизиты — в полях SP159, SP160 и т.д. Узнать соответствие можно, проанализировав файл 1Cv7.MD или воспользовавшись специальными утилитами.
Пример выполнения запроса и обработки результата:
// Формируем текст прямого SQL-запроса к таблицам 1С 7.7
// ВАЖНО: здесь используется "чистый" T-SQL, а не язык запросов 1С
// В данном примере SC152 - это таблица справочника "Номенклатура"
ТекстЗапроса = "
|SELECT
| Номенклатура.ID as Идентификатор,
| Номенклатура.Descr as Наименование,
| Номенклатура.IsFolder as ЭтоГруппа,
| Номенклатура.IsMark as ПометкаУдаления
|FROM
| sc152 as Номенклатура
|WHERE
| Номенклатура.IsFolder = 0"; // Выбираем только элементы, а не группы
// Выполняем запрос
Попытка
RecordSet = Connection.Execute(ТекстЗапроса);
Исключение
Сообщить("Ошибка выполнения запроса: " + ОписаниеОшибки());
Connection.Close();
Возврат;
КонецПопытки;
// Обрабатываем полученный результат
ТаблицаРезультат = Новый ТаблицаЗначений;
ТаблицаРезультат.Колонки.Добавить("Наименование");
ТаблицаРезультат.Колонки.Добавить("ЭтоГруппа");
Пока НЕ RecordSet.EOF() Цикл
НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.Наименование = RecordSet.Fields("Наименование").Value;
НоваяСтрока.ЭтоГруппа = ?(RecordSet.Fields("ЭтоГруппа").Value = 1, Истина, Ложь);
RecordSet.MoveNext();
КонецЦикла;
// ВАЖНО: всегда закрывайте соединение после использования
RecordSet.Close();
Connection.Close();
// Теперь данные находятся в ТаблицеЗначений и готовы к использованию
Для Каждого Строка Из ТаблицаРезультат Цикл
Сообщить(Строка.Наименование);
КонецЦикла;
Нет, напрямую из 1С 8.3 использовать привычный синтаксис 1С++ (например, $Справочник.Номенклатура или $РегистрОстатки.ОстаткиТМЦ) невозможно. Компонента 1С++ работает только внутри среды 1С 7.7. Она перехватывает запрос со своими метаименами, анализирует метаданные текущей базы 7.7 и преобразует его в обычный T-SQL-запрос, который уже отправляется на SQL-сервер. Внешнее приложение, такое как 1С 8.3, не имеет доступа к этому механизму преобразования.
Для получения сложных данных, например, остатков по регистрам на определенную дату, потребуется написать сложный T-SQL запрос к таблицам итогов (RGxxxx, RAxxxx) и движений. В качестве альтернативы можно создать в базе 1С 7.7 регламентное задание, которое будет с помощью 1С++ рассчитывать нужные данные и складывать их в простую промежуточную SQL-таблицу. А уже из этой таблицы 1С 8.3 сможет легко и быстро забирать готовую информацию.
В заключение: для интеграции 1С 8.3 с базой 1С 7.7 на сервере настоятельно рекомендуется использовать прямое подключение к SQL. Этот метод значительно быстрее, надежнее и проще в поддержке, чем настройка капризного COM-взаимодействия между 32-битными и 64-битными приложениями. При необходимости обойтись без прямого соединения для обмена данными можно использовать обработку для переноса данных из 1С 7.7 в конфигурации 1С 8.3.