V77 application

При попытке создать OLE объект 1С, возникает ошибка «Неудачная попытка создания объекта (V77.Application)». Существует 3 основные причины возникновения этой ошибки: отсутствие необходимых ключей в реестре (или ограничение доступа к ним), неправильное значение ключей реестра или параметров DCOM.

Во-первых, проверьте, чтобы 1С была установлена из дистрибутива, а не просто скопирована с другого компьютера. При необходимости переустановите 1С. При обычном копировании 1С в реестре может отсутствовать ряд ключей, которые создаются при установке.

Во-вторых, в реестре может быть неправильно указан путь к 1cv7.exe и, как результат, возникнет ошибка при создании OLE-объекта. Проверьте HKEY_LOCAL_MACHINE\SOFTWARE\Classes\V77.Application\CLSID, там будет указан GUID. В моем случае это {63112D80-94F0-11D2-9F39-008048DA120F}. Далее перейдите к HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F}\LocalServer32 и проверьте путь к приложению 1cv7.exe. Так же проверьте имеет ли пользователь доступ на чтение к указанным выше веткам реестра.

В третьих, проблема может быть связана с настройками DCOM. Обычно это происходит после установки веб-расширения и изменения параметров DCOM. В этом случае запустите dcomcnfg.exe, найдите 77.Application, на закладке «Удостоверение» установите переключатель в положение «Текущий пользователь».

Пожалуйста,

Вопросы:

  1. Краткая справка по использованию OLE в 1С-Предприятии.
  2. Методы: Initialize() — открыть базу.
  3. Методы: CreateObject() — создать объект агрегатного типа.
  4. Методы: EvalExpr() — вычислить выражение.
  5. Методы: ExecuteBatch() — выполнить последовательность операторов.
  6. Пример: создание документа в другой базе, открытой через OLE.
  7. Сравнение в базе OLE. Константы, перечисления, элементы справочников.
  8. Как узнать, что дата, полученная через OLE — пустая?

Ответы:

  1. Краткая справка по использованию OLE в 1С-Предприятии.

Для запуска системы 1С-Предприятия в качесте OLE Automation сервера из внешнего приложения выполняется следующая последовательность действий:

  • Создается объект с OLE идентификатором (регистр символов непринципиален):
  • V1CEnterprise.Application — версия независимый ключ;
  • V77.Application — версия зависимый ключ;
  • V77S.Application — версия зависимый ключ, SQL версия;
  • V77L.Application — версия зависимый ключ, локальная версия;
  • V77M.Application — версия зависимый ключ, сетевая версия.
  • Выполняется инициализация системы 1С-Предприятие методом Initialize().
  • Вызываются атрибуты и методы системы 1с-Предприятия как OLE Automation сервера.

1С-Предприятие в качестве OLE Automation сервера имеет 4 метода:

  • Initialize() — выполнить инициализацию системы 1С-Предприятие.
  • CreateObject() — Создает объект агрегатного типа данных 1С-Предприятия и возвращает ссылку на него.
  • EvalExpr() — Вычислить выражение системы 1С-Предприятие.
  • ExecuteBatch() — Выполнить последовательность операторов системы 1С-Предприятие.

2. Методы: Initialize() — открыть базу.

Синтаксис метода такой: Initialize(.RMTrade, , ), где:
.RMTrade — имя переменной и ключевое слово RMTrade.
— командная строка, в которой можно прописать путь к базе, имф пользователя и пароль.
) — либо пустая строка, либо «NO_SPLASH_SHOW» — чтобы не показывать заставку при загрузке.
Для того, чтобы открыть базу через OLE — необходимо создать объект с идентификатором OLE, выполнить инициализацию базы и проверить успешность выполнения инициализации. В своем примере я не указываю никаких дополнительных параметров, поэтому открывается квадратное окошко выбора базы, предлагается выбрать пользователя и ввести пароль.
ДругаяБаза=СоздатьОбъект(«V77.Application»);
Открыта=ДругаяБаза.Initialize(ДругаяБаза.RMTrade,,);
Если Открыта=0 Тогда
// True=-1, False=0. Для всех OLE команд.
Сообщить(«База не была открыта.»);
Возврат;
КонецЕсли;

3. Методы: CreateObject() — создать объект агрегатного типа.

Этот метод создает объект агрегатного типа данных системы 1С-Предприятия и возвращает ссылку на него.

Синтаксис метода такой: CreateObject(), где:
— строковое выражение, значение которого содержит имя агрегатного типа данных, заданного в конфигураторе. Например: «Справочник.Номенклатура», «Документ.ПриходнаяНакладная».

4. Методы: EvalExpr() — вычислить выражение.

Синтаксис метода такой: EvalExpr(), где:
— строковое выражение, записанное на встроенном языке 1С-Предприятия.

Результатом выражения может быть число, строка, дата или значение любого агрегатного типа данных. Результат с неопределенным типом преобразуется к строковому типу.

5. Методы: ExecuteBatch() — выполнить последовательность операторов.

Синтаксис метода такой: ExecuteBatch(), где:
— строковое выражение, текст программы на встроенном языке 1С-предприятия. Возвращает значение логического типа: TRUE, если последовательность операторов выполнена успешно, FALSE, если нет. В OLE Automation TRUE и FALSE имеют соответственно значения -1 (минус единица) и 0.

6. Пример: создание документа в другой базе, открытой через OLE.

Этот пример на 100% рабочий. Используется у меня для выгрузки документов из одной конфигурации в другую.

7. Сравнение в базе OLE. Константы, перечисления, элементы справочников.

Для сравнения значений агрегатных типов данных в базе, открытой через Оле, использовать стандартный алгоритм с использование знаков равно и неравно (=,) не получается. Выход простой. Необходимо перейти от сравнения агрегатных типов данных к простым типам данных — дата, строка и число.

Отсюда вывод: мы сравниваем не сами элементы, а их уникальные атрибуты. Например, для элементов справочника — это код (если он есть), либо наименование. Для перечисления используется метод Идентификатор(). Вот два примера:
//Сравнение реквизита номенклатуры с Константой БазоваяВалюта
Если дТовар.ВалютаУчета.КодДругая.Константа.БазоваяВалюта.Код Тогда
дТовар.ВалютаУчета=Другая.Константа.БазоваяВалюта;
КонецЕсли;
//Сравнение реквизита номенклатуры с перечислением
Если дТовар.ТипТовара.Идентификатор()Другая.Перечисление.ТипыТоваров.Штучный.Идентификатор() Тогда
дТовар.ТипТовара=Другая.Перечисление.ТипыТоваров.Штучный;
КонецЕсли;