При организации обмена данными между конфигурациями 1С:Предприятия 8 и устаревшими системами 1С:Предприятия 7.7 разработчики часто сталкиваются с ситуацией, когда метод Initialize возвращает Ложь, либо при попытке создания объектов возникает ошибка «Значение не является значением объектного типа (CreateObject)». Разберем по шагам, почему возникают эти ошибки и как правильно настроить программное подключение.
Платформа 1С 7.7 использует механизм OLE Automation. Если исполняемые файлы платформы 7.7 были просто скопированы на компьютер без инсталляции, соответствующие COM-классы не зарегистрированы в реестре Windows. В этом случае вызов конструктора Новый COMОбъект завершится системной ошибкой или не сможет корректно инициализировать объект.
Для устранения этой проблемы выполним регистрацию OLE-сервера одним из следующих способов:
1cv7.exe (или 1cv7s.exe для SQL-версии) с правами администратора через контекстное меню Windows («Запуск от имени администратора»). При старте платформа автоматически пропишет необходимые ключи в реестре.
"C:\Program Files (x86)\1Cv77\BIN\1cv7.exe" /RegServer
Для версии с поддержкой SQL используем исполняемый файл 1cv7s.exe:
"C:\Program Files (x86)\1Cv77\BIN\1cv7s.exe" /RegServer
Проанализируем доступные программные идентификаторы (ProgID) для создания экземпляра приложения 7.7. В зависимости от типа установленного исполняемого файла и лицензии используются следующие варианты:
V77.Application — универсальный идентификатор для сетевой и локальной версий платформы;V77S.Application — идентификатор для версии платформы с поддержкой MS SQL Server;V77L.Application — локальная однопользовательская версия;V77C.Application — комплексная конфигурация.Если используется обобщенный вызов V1CEnterprise.Application, система попытается обратиться к зарегистрированной по умолчанию версии, что может вызывать сбои при наличии нескольких релизов платформы. Рекомендуется явно указывать V77.Application или V77S.Application.
Рассмотрим синтаксис метода Initialize. В первом параметре передается системный контекст База.RMTrade, во втором — строка параметров запуска, а в третьем — режим отображения заставки ("NO_SPLASH_SHOW" или пустая строка).
Частая ошибка заключается в передаче пути к исполняемому файлу платформы внутри строки подключения. В параметрах запуска должен быть указан только путь к каталогу базы данных и учетные данные пользователя.
Посмотрим на пример правильного кода подключения:
ПутьКБазе = "D:\Bases\1c77_prod\";
Пользователь = "Администратор";
Пароль = "12345";
// Создаем COM-объект нужной редакции платформы
Попытка
V77 = Новый COMОбъект("V77.Application");
Исключение
Сообщить("Не удалось создать COM-объект V77.Application: " + ОписаниеОшибки());
Возврат;
КонецПопытки;
// Формируем параметры запуска без лишних путей к BIN
СтрокаПараметров = "enterprise /d""" + СокрЛП(ПутьКБазе) + """"
+ ?(ЗначениеЗаполнено(Пользователь), " /n""" + СокрЛП(Пользователь) + """", "")
+ ?(ЗначениеЗаполнено(Пароль), " /p""" + СокрЛП(Пароль) + """", "");
// Инициализируем подключение
РезультатПодключения = V77.Initialize(V77.RMTrade, СтрокаПараметров, "NO_SPLASH_SHOW");
Если НЕ РезультатПодключения Тогда
Сообщить("Не удалось открыть базу данных 1С 7.7. Проверьте путь, логин, пароль и монопольные блокировки.");
V77 = Неопределено;
Возврат;
КонецЕсли;
Сообщить("Подключение успешно установлено!");
Выясним причину появления ошибки при попытке создания объектов через V77.CreateObject(...). Она возникает в следующих случаях:
Initialize возвращает булево значение. Если разработчик выполняет проверку вида Если Открыта = 0 Тогда, условие ошибки пропускается (из-за несовпадения типов Булево и Число), программа переходит к выполнению операций с неинициализированным COM-объектом. Всегда используйте строгое логическое условие: Если НЕ РезультатПодключения Тогда.V77 был объявлен локально внутри одной процедуры, при выходе из нее переменная очищается. Для дальнейшей работы с объектами базы 7.7 сохраняйте COM-объект в переменной модуля или реквизите формы.OrdNoChk.prm в каталоге BIN платформы 1С 7.7.Платформа 1С 7.7 является строго 32-разрядным приложением. Вызов Новый COMОбъект("V77.Application") напрямую из 64-разрядного рабочего процесса сервера 1С:Предприятия 8 или 64-разрядного клиента завершится ошибкой отсутствия зарегистрированного COM-класса.
Для корректной работы выполняйте подключение через 32-разрядный клиент платформы 1С 8 либо настройте 32-разрядное COM+ приложение в службе компонентов Windows (dllhost.exe) для проксирования вызовов с 64-битного сервера.
После успешной инициализации получаем доступ к метаданным и объектам конфигурации 1С 7.7. Посмотрим, как создать объект и прочитать справочник:
// Создаем объект справочника Номенклатура
СпрНоменклатура = V77.CreateObject("Справочник.Номенклатура");
Если СпрНоменклатура.ВыбратьЭлементы() = 1 Тогда
Пока СпрНоменклатура.ПолучитьЭлемент() = 1 Цикл
// Пропускаем группы
Если СпрНоменклатура.ЭтоГруппа() = 1 Тогда
Продолжить;
КонецЕсли;
Код = СпрНоменклатура.Код;
Наименование = СпрНоменклатура.Наименование;
// Значения примитивных типов можно сразу использовать в 1С 8
Сообщить("Товар: " + СокрЛП(Наименование) + " (Код: " + СокрЛП(Код) + ")");
КонецЦикла;
КонецЕсли;
// Очищаем COM-объекты после завершения работы для предотвращения утечек памяти
СпрНоменклатура = Неопределено;
V77 = Неопределено;
Важно: агрегатные и ссылочные объекты 1С 7.7 внутри сеанса 1С 8 остаются объектами типа COMОбъект. Чтобы записать их в базу 1С 8, всегда извлекайте примитивные типы (число, строка, дата) через свойства и методы OLE-объекта.