Подключение OLE в регламентном задании на 64-битном сервере

У вас давно работает новая база на платформе 8.2 или даже 8.3, но бухгалтерия до сих пор сидит на платформе 7.7.
Что делать? Переводить пока не планируем, а обмен нужен в реальном времени? Так мало того, у нас новый 64-битный сервер!
Не беда, есть решение!

Справка

OLE (англ. Object Linking and Embedding) — технология связывания и внедрения объектов в другие документы и объекты, разработанная корпорацией Майкрософт.

В 1996 году Microsoft переименовала технологию в ActiveX.

Более подробно пишет Википедия: https://ru.wikipedia.org/wiki/Object_Linking_and_Embedding

Вступление

Сейчас у вас есть база на платформе 1С 8.Х, а также база на платформе 1С 7.7. И вам нужно их подружить.

В интернете есть информация по взаимодействию, но вся она разбросана. И мало того никто не учитывает, что сейчас сервера идут 64-битные, а клиенты 32-битные.

Итак давайте знакомить платформу 8 с 7. Для этого нам нужно использовать OLE Automation сервер.

По этому вопросу уже есть готовая публикация, привожу для примера: //infostart.ru/public/57224/

Подготовка технической части

Будем рассматривать пример на базе Windows Server 2012 R2, где уставновлена платформа 1С 8.Х для сервера 64-битная, для клиента 32-битная. Также нужно установить последний релиз платформы 1С 7.7 у нас 7.70.027.

Рабочая база 1С 7.7 расположена на другом сервере, вариант установки SQL.

Поэтому на нашем сервере также выбираем вариант установки SQL.

Установка 1С 7.7:

Устанавливаем под администратором: Запуск от имени администратора

Перезагружаемся.

Далее чтобы 1С 7.7 прописалась в реестре важно запустить ее также под администратором, создать пустую базу и зайти в нее.

Перезагружаемся.

Так же скорее всего вам понадобится подменить в папке (BIN) «BkEnd.dll» и добавить туда пустой файл «OrdNoChk.prm» (файлы внизу публикации).

Далее важно, чтобы у вас в реестре появились записи:

V77.GeneralPropPage

V77.Application

V77S.Application и прочие.

А также как минимум DCOM (нужно проверить, за давностью установки, не уверен в надобности).

Пуск — Выполнить — DCOMCNFG. 

Там разворачиваем «Службы компонентов» — «Компьютеры» — «Мой компьютер» — «Настройка DCOM»:

V77.GeneralPropPage

Если их нет, значит у вас что-то с доступом. Настраиваем и начинаем заново установку.

Настройка Windows Server 2012 R2

Для открытия 1С 7.7 по OLE на сервере потребует больше, чем по умолчанию, памяти для запуска приложений в «не интерактивном» режиме (т.е. в регламентном задании) для этого в реестре нужно изменить/добавить запись:

HKEY_LOCAL_MACHINE>SYSTEM>CurrentControlSet>Control>Session Manager>SubSystems 
Меняем значение Windows, было: 
%SystemRoot%system32csrss.exe ObjectDirectory=Windows SharedSection=1024,3072,512 
  Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 
  ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16 

SharedSection=1024,3072,512

Вот здесь редактируем 3 значение, мы поставили 5 мб (было 512 кб). Важно чтобы 2 и 3 значение не превысило 48 мб. 

Этот параметр отвечает в Windows за «кучу» для неинтерактивного сеанса.

Про изменение «кучи» подробно написали в статье: http://www.techarp.com/showarticle.aspx?artno=238&pgno=1 

Первый нюанс с «кучей» решили, теперь осталось разобраться с правами у пользователя, который запускает службу «Агент сервера 1С:Предприятия 8.Х (x86-64)»

Служба

Если у вас служба настроена в таком режиме, то потребуется прописать в реестре путь до базы 1С 7.7:

KEY_USERSS-1-5-18Software1C1Cv77.7Titles 

Для каждой новой базы, нужно создать новую запись(New->String value или Создать->Строковый параметр):
Name: Путь_и_Имя_базы
Type: REG_SZ 
Data: Ваше_название_для_базы 

В итоге код для системной учетной записи заработает. 

Но в этом случае сеть не доступна (нам такой вариант не подходит).

В таком случае нужно выбрать конкретного пользователя и проверить чтобы у него был доступ на сеть!

Так же у этого пользователя должна быть прописана база в реестре или вы можете зайти интерактивно под этим пользователем и добавить в список нужную сетевую базу 1С 7.7.

Делаем регламентное задание

Систему к работе мы подготовили теперь дело за малым написать код!

Создаем регламентное задание и определяем процедуру в которой записан код:

Попытка
v7=Новый COMОбъект("V77.Application");
Исключение
v7=Новый COMОбъект("V1CEnterprise.Application");
КонецПопытки;
КаталогБазыОЛе = "\ВашСерверD$КаталогНаДискеДВашейБазы";//пример сетевого каталог на диске D
ПользовательОле = "Пользователь1С8СозданныйВ1С7";
ПарольОле = "ПарольПользователяОле";
МонопольныйРежимOLE = "";
//МонопольныйРежимOLE = " /m";
//для немонопольного запуска указать пустую строку!
ЗапускБезЗаставки = 1;
// для появления заставки поставьте "0"
РезультатПодключения = v7.Initialize (v7.RMTrade,"/d"+Сокрлп(КаталогБазыОле)+" /n"+Сокрлп(ПользовательОле)+" /p"+Сокрлп(ПарольОле)+МонопольныйРежимOLE, ?(ЗапускБезЗаставки=1,"NO_SPLASH_SHOW",""));
Если РезультатПодключения=1 Тогда
Сообщить("Соединение установлено");
Иначе
Сообщить(""+КаталогБазыОле);
Сообщить("Соединение не установлено");
КонецЕсли;

Все, подключение работает!

Теперь можете написать код в 1С 7.7 при старте системы или опишите на языке 1С 7.7 нужный алгоритм прямо в 1С 8.Х.

Успешной работы!

19 Comments

  1. almas

    Однозначно +

    Reply ↓
  2. Xershi

    (1) almas, все получилось с первого раза? А то может пару нюансов не отразил в статье, пол года назад проект делал.

    Reply ↓
  3. zombi81

    Поймал аналогичную проблему, не делал ничего из написанного. После того как установил 8.3.7.1776 проблема исчезла. Похоже, плавающий глюк в релизах платформы.

    Reply ↓
  4. Xershi

    (3) zombi81, о каком глюке идет речь?

    Reply ↓
  5. Гриффин

    Делал все, как написано здесь, но проблема так и не решилась…

    Reply ↓
  6. Xershi

    (5) Гриффин, значит не все или прав нет у вас.

    Конкретно что не вышло?

    Reply ↓
  7. maljaev

    V77.Application (и все прочие 77) не работают на сервере для второго коннекта, виснет подключение. Это не зависит от базы или пользователя. Так что если у вас несколько регламентных заданий для синхронизации с разными базами или с разными данными, то как только очередное регламентное задание «пересечется» по времени с уже выполняющимся — будет «зависон». Можно решить очередью, когда очередное задание по синхронизации ждет, когда выполнится активное.

    Reply ↓
  8. Xershi

    (7) этот момент я не смогу продиагностировать, но у нас была 1 база 7.7 и было одно регламентное задание.

    Reply ↓
  9. zhenyat

    В реестре записи про 1с появились, но в dcom — нет, переустановки и перегрузки не помогают.

    При этом в обычном приложении (и в файловом и в кдиент-серверном) и в управляемом файловом com-соединение с 7.7 работает, проблемы только в управляемом клиент-серверном:(

    Что делать?

    Reply ↓
  10. Xershi

    (9) обновлять конфигурацию. У вас явно ошибки в конфе. К решению задачи это не относится!

    Reply ↓
  11. zhenyat

    (10) Да нет, разобралась, вылетело из головы что dcomcfg надо с ключом /32 запускать — там все настройки для 7.7 на месте…

    Reply ↓
  12. Xershi

    (11) т.е. «Пуск — Выполнить — DCOMCNFG» запускает 64-битный конфиг?

    Reply ↓
  13. zhenyat

    (12) Да

    Reply ↓
  14. Rif_md

    Странно, у меня при вызове OLE в функции с директивой НаСервере сразу выдает ошибку

    V7 = New COMObject(«V77.Application»);

    по причине:

    -2147467262(0x80004002): Интерфейс не поддерживается

    Хотя все тоже самое с директивой НаКлиенте отрабатывает отлично

    Релиз 8.3.11.3034

    Reply ↓
  15. Xershi

    (14) вероятно на сервере нет 1С 7.7.

    Reply ↓
  16. Rif_md

    (15) Клиент запускаю на сервере (в сессии удаленного рабочего стола). 1С 7.7 на сервере установлен. Функция с директивой НаКлиенте отрабатывает без вопросов, а вот таже функция с директивой НаСервере уже выдает ошибку.

    Reply ↓
  17. Xershi

    (16) тогда пишите по пунктам что сделали из статьи и чего не сделали.

    Плюс все ваше окружение!

    Reply ↓
  18. AlexO

    Используйте выгрузку-загрузку в файл, и не связывайтесь с этими кривыми реализациями )

    Reply ↓
  19. Xershi

    (18) так для этого и нужен этот алгоритм, чтобы запустить 1С 7.7 из 8.3 и загрузить файл КД2. Хотя мой коллега из-за не знания КД2 переписал полностью обмен на ком. Так что вы как-то не зная область комментируете!

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *