Сколько одновременных подключений поддерживает v77s application
Перейти к содержимому

Сколько одновременных подключений поддерживает v77s application

  • автор:

Сколько одновременных подключений поддерживает v77s application

Загрузка. Пожалуйста, подождите.

X

Сообщение сайта

(Сообщение закроется через 2 секунды)

Vofka —> Vofka

Просмотр профиля

Найти сообщения пользователя

20.07.11, 19:47

Решил серьезно заняться изучением OLE. Конечно OLE это не КД, но все же.

Попалась в интернете хорошая статья и решил ее поместить сюда. Думаю будет полезна как для начинающих, так и для продвинутых, что бы закрепить свои знания.

При установке 1С на компьютер в реестре регистрируется ряд компонент. Это
V81.Application
V81.COMConnector
V81.InfoBaseList
V81.InfoBaseListLink
V81.ServerAbout
V81.ServerAdminScope

Данная статья рассматривает два из этих объектов V81.Application, V81.COMConnector, служащих для подключения с использованием COM-технологий к базе 1С 8.1 не зависимо от того находится ли данная база на сервере или представлена в виде файлового варианта.

Так же мы рассмотрим нюансы подключения к базе из 1C v7.7.

К данной статье будет приложен иллюстративный материал в виде конфигурации с демо-обработкой, входящей в состав данной базы, и обработка для 7.7, демонстрирующая соединение с данной базой.

Создание каркасной базы

Создадим новую конфигурацию

В ней мы создадим ПараметрСеанса МиниЛогЗапуска и глобальный модуль с атрибутами
Глобальный
Клиент
Сервер

Приведу код глобального модуля

#Если Клиент Тогда
Функция ВернутьТипПодключения() Экспорт
Возврат("Клиент");
КонецФункции
#Иначе
Функция ВернутьТипПодключения() Экспорт
Возврат("Сервер");
КонецФункции
#КонецЕсли


Функция ВернутьНеопределено() Экспорт
Возврат Неопределено;
КонецФункции

Функция ВернутьNULL() Экспорт
Возврат Null;
КонецФункции

Функция ВернутьИстину() Экспорт
Возврат Истина;
КонецФункции

Функция ВернутьЛожь() Экспорт
Возврат Ложь;
КонецФункции

Функция ВернутьСистемноеПеречисление()Экспорт
Возврат(ВидДвиженияНакопления.Расход);
КонецФункции

Функция ВернутьПараметр(ИмяПараметра)Экспорт
Попытка
Зн=ПараметрыСеанса[ИмяПараметра];
Исключение
Возврат Неопределено;
КонецПопытки;
Возврат Зн;
КонецФункции
//Кроме этих функций добавим функцию возвращающую по имени справочнк в виде ТаблицыЗначений
Функция ЗапросКСправочнику(ИмяСправочника) Экспорт
Попытка
МетСпр=Метаданные.Справочники[ИмяСправочника];
Исключение
Возврат Неопределено
КонецПопытки;
Запрос=Новый Запрос;
ТекстЗапроса="";
ТекстЗапроса="Выбрать Спр.Ссылка,Спр.ПометкаУдаления,Спр.Предопределенный,";
Если МетСпр.Иерархический Тогда
ТекстЗапроса=ТекстЗапроса+"Спр.Родитель,Спр.ЭтоГруппа,";
КонецЕсли;
Если МетСпр.ДлинаКода<>0 Тогда
ТекстЗапроса=ТекстЗапроса+"Спр.Код,";
КонецЕсли;
Если МетСпр.ДлинаНаименования<>0 Тогда
ТекстЗапроса=ТекстЗапроса+"Спр.Наименование,";
КонецЕсли;
Для Каждого Рекв из МетСпр.Реквизиты Цикл
ТекстЗапроса=ТекстЗапроса+"Спр."+Рекв.Имя+",";
КонецЦикла;
ТекстЗапроса=ТекстЗапроса+"Спр.Представление
|ИЗ Справочник."+ИмяСправочника+" КАК Спр";
Запрос.Текст=ТекстЗапроса;
Возврат(Запрос.Выполнить().Выгрузить());
КонецФункции

Так же определим процедуру в модуле внешнего соединения

Процедура ПриНачалеРаботыСистемы()
Попытка
ПараметрыСеанса.ПараметрСеанса1=СокрЛП(ПараметрыСеанса.ПараметрСеанса1)+"
|Внешнее Соединение";
Исключение
ПараметрыСеанса.ПараметрСеанса1="Внешнее Соединение";
КонецПопытки;
КонецПроцедуры
//И процедуру в модуле приложения
Процедура ПриНачалеРаботыСистемы()
Попытка
ПараметрыСеанса.ПараметрСеанса1=СокрЛП(ПараметрыСеанса.ПараметрСеанса1)+"
|Приложение";
Исключение
ПараметрыСеанса.ПараметрСеанса1="Приложение";
КонецПопытки;
КонецПроцедуры

Так же добавим ещё один не глобальный модуль с атрибутами
Клиент
Сервер

И с единственной функцией

Функция ВозвратСтроки() Экспорт
Возврат("ОбщийМодуль1");
КонецФункции

Application и ComConnector сравнение соединение из 1С 8

Для исследрования вызова функций не глобальных модулей Сохраняем конфигурацию, и теперь нам есть что исследовать.

Для целого ряда методов в синтаксис помощнике указанно «Не используется в модуле внешнего соединения». Это упоминание не даёт полной картины.

Объект V81.Application соответствует объекту V77.Aplication, а именно происходит загрузка сервера с интерфейсными библиотеками в режиме клиент, объект же V81.COMConnector при загрузке не имеет ничего из того что отвечает за интерфейс с пользователем, что повышает производительность при работе с внешним соединением.

Создаём обработку в нашей конфигурации, для проверки вызова наших методов.

В обработке обявляем две переменных и функцию установления соединения с базой

Перем cntr,connection;
Функция ОткрытиеБазы(ТипОткрытия)
cntr = Новый COMObject(ТипОткрытия);
connection=Истина;
Попытка
Если ЭлементыФормы.Панель1.ТекущаяСтраница.Заголовок="Файловая версия" Тогда
connection = cntr.Connect("File="""+СокрЛП(ПутьКбазе)+""";Usr="""+СокрЛП(Логин)+""";Pwd = """ + СокрЛП(Пасворд) + """;");
Иначе
connection = cntr.Connect("Srvr="""+СокрЛП(ИмяСервера)+""";Ref="""+СокрЛП(ИмяБазы)+""";Usr="""+СокрЛП(Логин)+""";Pwd = """ + СокрЛП(Пасворд) + """;");
КонецЕсли;
Исключение
Предупреждение(ОписаниеОшибки());
connection=Ложь;
КонецПопытки;
Возврат connection;
КонецФункции

В переменной открытия мы передаём либо строку «V81.Application», либо строку «V81.ComConnector»

При этом для V81.Application возвращается Истина в connection, а cntr является нашим объектом через который мы обращаемся к базе

Для ComConnector в connection возвращается объект для обращения к базе, а cntr является объектом описанным в синтаксис помощнике как COM-соединитель.

Свойства и методы COM-соединителя.

HighBoundDefault Свойство, только чтение, Тип: Число. Содержит верхнюю границу диапазона IP портов сервера кластера по умолчанию.
LowBoundDefault Свойство, только чтение, Тип: Число. Содержит нижнюю границу диапазона IP портов сервера кластера по умолчанию.
MaxConnections
Свойство, только чтение, Тип: Число.

Определяет максимальное число одновременно существующих объектов COM-соединение, созданных через данный COM-соединитель.

Число одновременно существующих соединений включает также число соединений, находящихся в пуле COM-соединений. Значением по умолчанию 0 (число одновременно существующих объектов COM-соединение не ограничено).

Устанавливать свойству не нулевое значение можно только в том случае, если сам объект COM-соединитель был создан в Multithreaded Apartment (MTA), что обеспечивает реальное функционирование самого COM-соединителя и созданных им объектов COM-соединение в многопотоковой (multithreaded) среде. Это условие соблюдается в частности, если COM-соединитель был создан в приложении ASP.NET.

Если же объект COM-соединитель был создан в Singlethreaded Apartment (STA), то реально все действия с COM-соединителем и созданными им объектами COM-соединение будут выполняться в одном потоке. В этом случае, если метод Connect не сможет на первом проходе найти подходящее или создать новое COM-соединение, то выполнение этого метода зациклится, так как освободить уже, возможно, ненужное другое COM-соединение будет нельзя по той причине, что операция освобождения объекта COM-соединение должна быть выполнена в том же потоке, в котором уже выполняется метод Connect.

Следует помнить, что создание COM-объектов из приложения 1C:Предприятие 8.1 выполняется из STA. Это же справедливо для большинства GUI-приложений Windows.
PoolCapacity Свойство, только чтение, Тип: Число. Максимальное количество соединений с информационной базой, которые могут одновременно находиться в пуле.
PoolTimeout Свойство, только чтение, Тип: Число. Максимальное время нахождения в пуле неиспользуемого соединения с информационной базой. После истечения этого времени неиспользуемое соединение освобождается.
RAgentPortDefault Свойство, только чтение, Тип: Число. Содержит номер IP порта агента сервера по умолчанию.
RMngrPortDefault Свойство, только чтение, Тип: Число. Содержит номер IP порта менеджера кластера по умолчанию.
Connect (Connect)
Синтаксис:
Connect()

Строка параметров, используемая 1С:Предприятием для соединения с информационной базой.

Строка соединения представляет собой набор параметров, каждый из которых является фрагментом вида: , где Имя параметра — имя параметра, а Значение — его значение. Фрагменты отделяются друг от друга символами ‘;’. Если значение содержит пробельные символы, то оно должно быть заключено в двойные кавычки («).

Для файлового варианта определен параметр: File — каталог информационной базы (файловый режим);

Для клиент-серверного варианта определены параметры: Srvr — имя сервера 1С:Предприятия; Ref — имя информационной базы на сервере;

Для всех вариантов определены параметры: Usr — имя пользователя; Pwd — пароль и UC позволяет выполнить установку соединения с информационной базой, на которую установлена блокировка установки соединений.

Если при установке блокировки задан непустой код доступа, то для установки соединения необходимо в параметре /UC указать этот код доступа.

Возвращаемое значение:
Тип: COM-соединение.

Создает соединение с информационной базой 1С:Предприятия 8.1.

Устанавливает соединение с информационной базой 1С:Предприятия 8.1 и возвращает ссылку на объект COM-соединение.

Установка соединения выполняется по следующему алгоритму:
COM-соединение с требуемыми параметрами ищется в пуле соединений. Если найдено, то используется оно.
Если COM-соединение с требуемыми параметрами не найдено, то анализируется не исчерпан ли лимит по числу одновременно существующих соединений. Если не исчерпан, то создается новое COM-соединение.
Если лимит исчерпан, но при этом в пуле имеются неиспользуемые COM-соединение, то соединение, дольше всех находящееся в пуле, удаляется и создается новое COM-соединение.
Если никаким способом найти подходящее или создать новое COM-соединение не удалось, то происходит ожидание освобождения COM-соединение другим потоком, после чего весь процесс повторяется, начиная с пункта 1.
ConnectAgent()
Синтаксис:
ConnectAgent()

Параметры:
(обязательный)
Тип: Строка. Идентификатор протокола (по умолчанию tcp), имя компьютера или IP адрес агента сервера (обязательно), номер IP порта агента сервера (по умолчанию 1540). Например, значением параметра могут быть следующие строки: «server1», «tcp://server1», «tcp://server1:1540», «server1:1540».

Возвращаемое значение:
Тип: Соединение с агентом сервера.

Выполняет подсоединение к агенту сервера 1С:Предприятия 8.1, работающему на указанном серверном компьютере.

Если подсоединение невозможно, то вызывается исключение.
ConnectWorkingProcess (ConnectWorkingProcess)
Синтаксис:
ConnectWorkingProcess()

Параметры:
(обязательный)
Тип: Строка. Имя или IP адрес рабочего процесса, с которым должно быть установлено соединение, в формате: ://: Например:
testcomp
tcp://testcomp
tcp://testcomp:2354
tcp://43.73.34.11:5342.

Возвращаемое значение:
Тип: Соединение с рабочим процессом.

Создает административное соединение с рабочим процессом кластера серверов 1С:Предприятия 8.1.

Для установки соединения с базой надо методу Connect нашего объекта передать строку соединения Для файловой версии данная строка содержит параметры:
File с указанием пути к папке с файлом базы
Usr с указанием имени прользователя
Pwd с указанием пароля прользователя

Для соединения с сервером Usr и Pwd прежние параметры, а вот вместо File два параметра Srvr с указанием имени сервера и Ref с указанием имени Базы

Вызовы из восьмёрки через Application и ComConnector

Пробуем организовать вызов функций нашей конфигурации из обработки на 8.1

Пишем процедуру вызова функций с определением, что возвращается при вызове

Процедура ОсновныеДействияФормыВызовФункции(Кнопка)
Если Не ОткрытиеБазы("V81.Application") Тогда Возврат; КонецЕсли;
Сообщить("Вернули неопределено? "+(cntr.ВернутьНеопределено()=Неопределено));
Сообщить("Вернули NULL? "+(cntr.ВернутьNULL()=NULL));
Сообщить("Вернули Истину? "+(cntr.ВернутьИстину()=Истина));
Сообщить("Вернули Ложь? "+(cntr.ВернутьЛожь()=Ложь));
Сообщить("Вернули параметр "+cntr.ВернутьПараметр("ПараметрСеанса1"));
Сообщить("Не глобальный модуль "+cntr.ОбщийМодуль1.ВозвратСтроки());
Сообщить("ТипПодключения="+cntr.ВернутьТипПодключения());
cntr = "";
КонецПроцедуры

Рассмотрим лог сообщений:
Вернули неопределено? истина
Вернули NULL? истина
Вернули Истину? истина
Вернули Ложь? истина
Вернули параметр Приложение
Не глобальный модуль ОбщийМодуль1
ТипПодключения=Клиент

Что это нам даёт?

Значения типа неопределено,NULL,Истина,Ложь передаются в соединение с базой корректно.

Модуль внешнего соединения при подключении через V81.Application не отрабатывает.

Модуль приложения при подключении через V81.Application отрабатывает.

Тип подключения, в котором мы подключаемся к базе, соответствует типу подключения клиент

Пишем аналогичную процедуру, но уже с использованием ComConnector

Процедура ОсновныеДействияФормыВызовФункции2(Кнопка)
Если ОткрытиеБазы("V81.ComConnector")<>Ложь Тогда
Сообщить("Вернули неопределено? "+(connection.ВернутьНеопределено()=Неопределено));
Сообщить("Вернули NULL? "+(connection.ВернутьNULL()=NULL));
Сообщить("Вернули Истину? "+(connection.ВернутьИстину()=Истина));
Сообщить("Вернули Ложь? "+(connection.ВернутьЛожь()=Ложь));
Сообщить("Вернули параметр "+connection.ВернутьПараметр("ПараметрСеанса1"));
Сообщить("Не глобальный модуль "+connection.ОбщийМодуль1.ВозвратСтроки());
Сообщить("ТипПодключения="+connection.ВернутьТипПодключения());
cntr = "";connection="";
КонецЕсли;
КонецПроцедуры

Лог сообщений у нас отличается в строчках
Вернули Параметр Внешнее Соединение
ТипПодключения=Сервер

То есть при обращении через объект V81.ComConnector подключение осуществляется в режиме север, даже если мы подключаемся к локальной файловой базе.

Теперь попробуем обратиться к нашим объектам, ну хотя бы к V81.Application из 1С 7.7

Пишем примерно тот же код

Перем НомерЗакладки;
Перем connection,cntr;
Перем Истина,Ложь;
Функция ОткрытиеБазы(ТипОткрытия)
cntr = СоздатьОбъект(ТипОткрытия);
Попытка
Если НомерЗакладки=1 Тогда
connection = cntr.Connect("File="""+СокрЛП(ПутьКбазе)+""";Usr="""+СокрЛП(Логин)+""";Pwd = """ + СокрЛП(Пасворд) + """;");
Иначе
connection = cntr.Connect("Srvr="""+СокрЛП(ИмяСервера)+""";Ref="""+СокрЛП(ИмяБазы)+""";Usr="""+СокрЛП(Логин)+""";Pwd = """ + СокрЛП(Пасворд) + """;");
КонецЕсли;
Исключение
Предупреждение(ОписаниеОшибки());
КонецПопытки;
КонецФункции
Функция ВызовФункций()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Сообщить("Вернули неопределено= "+cntr.ВернутьНеопределено());
Сообщить("Вернули NULL= "+cntr.ВернутьNULL());
Сообщить("Вернули Истину= "+cntr.ВернутьИстину());
Сообщить("Вернули Ложь= "+cntr.ВернутьЛожь());

КонецЕсли;
cntr = "";
КонецФункции

Истина=-1;Ложь=0;

Лог сообщений выглядит так
Вернули неопределено=
Вернули NULL=
Вернули Истину= -1
Вернули Ложь= 0

Так мы убеждаемся что Ложь соответствует 0, Истина -1, а NULL и неопределено ничего в стандартах 1Cv7.7 не возвращают

Как же отличить NULL от неопределено?

Для этого у объекта cntr в случае V81.Application и у connection в случае V81.ComConnector есть метод String

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

Пробуем использовать этот метод из 7.7

Добавив в нашу Функцию ВызовФункций() несколько строк кода

Сообщить("ВернулиНеопределено="+cntr.String(cntr.ВернутьНеопределено()));
Сообщить("ВернулиNULL="+cntr.String(cntr.ВернутьNULL()));
Сообщить("ВернулиСистемноеПеречисление="+cntr.String(cntr.ВернутьСистемноеПеречисление()));

Результат в логе сообщений
ВернулиНеопределено=Неопределено
ВернулиNULL=
ВернулиСистемноеПеречисление=Расход

Так мы отмечаем что NULL возвращается пустой строкой, неопределено строкой «Неопределено» и системное перечислени своим представлением

Итак, у нас есть конфигурация с модулем, но у неё нет метаданных.

Добавим перечисление, справочник, и три константы одну типа строка, одну типа перечисления и одну составного типа

Разбор метаданных через ОЛЕ

Добавим в обработку на 1С 7.7 и 8.1 функцию работы с метаданными

Функция РаботаСметаданными()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Сообщить("Версия "+cntr.Метаданные.Версия);
Сообщить("==================Константы==================");
Для Инд=0 по cntr.Метаданные.Константы.Количество()-1 Цикл
Конст=cntr.Метаданные.Константы.Получить(Инд);
Сообщить(Конст.Имя);
Сообщить("Тип:");
Массив = Конст.Тип.Типы();
Типов = Массив.Количество() - 1;
для а = 0 по Типов цикл
сообщить(cntr.String(Массив.Получить(а)));
конеццикла;
КонецЦикла;
cntr = "";
КонецЕсли;
КонецФункции

Сохраним обработки и запустив просмотрим лог сообщений
Версия V81.Application
==================Константы==================
Константа1
Тип:
Строка
Константа2
Тип:
Справочник ссылка: Справочник1
Константа3
Тип:
Справочник ссылка: Справочник1
Перечисление ссылка: Перечисление1

Мы можем получить тип любых метаданных используя этот пример и описание работы с метаданными

Использование менеджеров для работы с данными через ОЛЕ

Мы прояснили процесс работы с метаданными, а теперь обратимся к работе с данными

Функция РаботаСБазой()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Стр="";
Если ВвестиСтроку(Стр,"Наименование",40)=1 Тогда
Эл=cntr.Справочники.Справочник1.НайтиПоНаименованию(СокрЛП(Стр));
Если Эл.Пустая()=Истина Тогда
Эл=cntr.Справочники.Справочник1.СоздатьЭлемент();
Эл.Наименование=СокрЛП(Стр);
Эл.Записать();
Сообщить("ЗначениеВСтрокуВнутр="+cntr.ЗначениеВСтрокуВнутр(Эл.Ссылка));
Сообщить("XMLСтрока="+cntr.XMLСтрока(Эл.Ссылка));
Сообщить("=======XMLТипЗнч======");
XMLРез=cntr.XMLТипЗнч(Эл.Ссылка);
Сообщить("URIПространстваИмен="+XMLРез.URIПространстваИмен);
Сообщить("ИмяТипа="+XMLРез.ИмяТипа);
КонецЕсли;
cntr.Константы.Константа3.Установить(Эл.Ссылка);
КонецЕсли;
КонецЕсли;
cntr = "";
КонецФункции

В данной процедуре мы указываем наименование справочника, и если такого наименования нет, то мы создаём элемент справочника. Выводим всю информацию которую можем получить и присваиваем значение элемента справочника нашей константе

Создадим элемент и просмотрим лог сообщений

Запросы,Конструкторы запросов и произвольные объекты 8.* через ОЛЕ

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

Функция РаботаСЗапросами()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Констр=cntr.NewObject("КонструкторЗапроса");
Если Констр.ОткрытьМодально()=Истина Тогда
ТекстЗапроса=Констр.Текст;
cntr = "";
ОткрытиеБазы("V81.ComConnector");
Запрос=connection.NewObject("Запрос");
Запрос.Текст=ТекстЗапроса;
Рез=Запрос.Выполнить().Выгрузить();
Таб=СоздатьОбъект("Таблица");
Для Инд=0 по Рез.Колонки.Количество()-1 Цикл
Кол=Рез.Колонки.Получить(Инд);
Обл=Таб.Область("R1C"+Строка(Инд+1));
Обл.Текст=Кол.Имя;
Конеццикла;
Для Инд=0 по Рез.Количество()-1 Цикл
Стр=Рез.Получить(Инд);
Кол=0;
Для Кол=0 по Рез.Колонки.Количество()-1 Цикл
Обл=Таб.Область("R"+Строка(Инд+2)+"C"+Строка(Кол+1));
Обл.Текст=connection.String(Стр.Получить(Кол));
КонецЦикла;
КонецЦикла;
Таб.Показать();
Иначе
Сообщить("!Запрос не создан");
КонецЕсли;
КонецЕсли;
cntr = "";
connection = "";
КонецФункции

В данном примере мы сначала пользуемся V81.Application, у которого есть интерфейсные библиотеки и методом NewObject (являющимся конструкцией языка 1С 8.* Новый) для вызова конструктора запроса.

Потом мы закрываем базу, и подключившись через V81.ComConnector создаём сам запрос и результат запроса в линейном порядке выводим в объект 7.7 таблица.

В принципе такой порядок использования запроса необязателен, но из ComConnector мы не сможем вызвать метод ОткрытьМодально() по причине отсутствия интерфейсных библиотек.

Проблема булева типа из 7.7 (можем передать, но не можем вернуть)

Изменим структуру нашей базы, а именно. Для Константы Константа1 изменим тип с простого типа Строка на составной Булево,Число

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

Так же предположим, что мы не хотим, что бы код нашей функции компилировался при запуске в режиме приложения, а хотим что бы наш код работал только в режиме внешнего соединения независимо от того подключаемся мы через V81.ComConnector или через V81.Appliction.

Функция РаботаСЗапросами()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Констр=cntr.NewObject("КонструкторЗапроса");
Если Констр.ОткрытьМодально()=Истина Тогда
ТекстЗапроса=Констр.Текст;
cntr = "";
ОткрытиеБазы("V81.ComConnector");
Запрос=connection.NewObject("Запрос");
Запрос.Текст=ТекстЗапроса;
Рез=Запрос.Выполнить().Выгрузить();
Таб=СоздатьОбъект("Таблица");
Для Инд=0 по Рез.Колонки.Количество()-1 Цикл
Кол=Рез.Колонки.Получить(Инд);
Обл=Таб.Область("R1C"+Строка(Инд+1));
Обл.Текст=Кол.Имя;
Конеццикла;
Для Инд=0 по Рез.Количество()-1 Цикл
Стр=Рез.Получить(Инд);
Кол=0;
Для Кол=0 по Рез.Колонки.Количество()-1 Цикл
Обл=Таб.Область("R"+Строка(Инд+2)+"C"+Строка(Кол+1));
Обл.Текст=connection.String(Стр.Получить(Кол));
КонецЦикла;
КонецЦикла;
Таб.Показать();
Иначе
Сообщить("!Запрос не создан");
КонецЕсли;
КонецЕсли;
cntr = "";
connection = "";
КонецФункции

Вызов из 77 я описывать не буду, он уже для вас довольно тривиален.

В принципе вместо напсиания данного кода мы можем, запустив восьмёрку, вычислить выражение в табло и убедиться, что ЗначениеВстрокуВнутр(Истина)= ЗначениеВстрокуВнутр(Ложь)=

Определим функцию работы с нашей константой в обработке вызываемой из 7.7

Функция УстановитьИстина()

ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
cntr.Константы.Константа1.Установить(cntr.ЗначениеИзСтрокиВнутр(""));
Сообщить(cntr.Константы.Константа1.Получить());
Сообщить(cntr.ЗначениеВстрокуВнутр(cntr.Константы.Константа1.Получить()));
cntr = "";
КонецЕсли;
КонецФункции

Функция УстановитьЛожь()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
cntr.Константы.Константа1.Установить(cntr.ЗначениеИзСтрокиВнутр(""));
Сообщить(cntr.Константы.Константа1.Получить());
Сообщить(cntr.ЗначениеВстрокуВнутр(cntr.Константы.Константа1.Получить()));
cntr = "";
КонецЕсли;
КонецФункции

Функция УстановитьЧисло()
ОткрытиеБазы("V81.Application");
Если connection=Истина Тогда
Чис=0;
Если ВвестиЧисло(Чис,"Константа1",12,2)=1 Тогда
cntr.Константы.Константа1.Установить(Чис);
Сообщить(cntr.Константы.Константа1.Получить());
Сообщить(cntr.ЗначениеВстрокуВнутр(cntr.Константы.Константа1.Получить()));
cntr = "";
КонецЕсли;
КонецЕсли;
КонецФункции

Функция РаботаСконстантой()
Меню=СоздатьОбъект("СписокЗначений");
Меню.ДобавитьЗначение("УстановитьИстина()","Установить Истина");
Меню.ДобавитьЗначение("УстановитьЛожь()","Установить Ложь");
Меню.ДобавитьЗначение("УстановитьЧисло()","Установить Число");
Зн="";
Поз=0;
Если Меню.ВыбратьЗначение(Зн,,Поз,,1)=1 Тогда
Шаблон("["+Зн+"]");
КонецЕсли;
КонецФункции

Рассмотрим лог сообщений после вызова всех трех вариантов функций и просмотра базы в режиме предпрития
-1

0

56

Какой вывод мы можем сделать из этого лога

Что тип булево возвращается стороннему приложению как число.

Мы можем установить значение булева и любого неизвестного 7.7 типа через ЗначениеИзСтрокиВнутр, но как минимум в случае с булевым типом мы не сможем его прочитать обратно иначе чем число.

Сам собой напрашивается вывод, что надо быть аккуратным при проектировании внешних функций и метаданных, проектируя их таким образом что бы мы могли одназначно опредилить по возвращенному параметру булев тип и никогда бы не смогли спутать его с числом.

Проблема времени из 7.7 (не можем передать)

Добавляем в нашу базу регистр накопления и документ регистратор и пишем в 7.7 простую функцию, формирующую движения данного документа

Функция ТипаПереносОстатков()
Попытка
ОткрытиеБазы("V81.ComConnector");
Исключение
Сообщить("Не удалось открыть базу с заданными параметрами");
Возврат "";
КонецПопытки;
Стр="";
Если ВвестиСтроку(Стр,"Справочник",50)=1 Тогда
Спр=connection.Справочники.Справочник1.НайтиПоНаименованию(Стр);
Если Спр.Ссылка=connection.Справочники.Справочник1.ПустаяСсылка() Тогда
Спр=connection.Справочники.Справочник1.СоздатьЭлемент();
Спр.Наименование=Стр;
Спр.Записать();
КонецЕсли;
Док=connection.Документы.Документ1.СоздатьДокумент();
Док.Дата=connection.ЗначениеИзСтрокиВнутр("");
Док.Реквизит1=Спр.Ссылка;
Док.Записать();
Движение=Док.Движения.РегистрНакопления1.ДобавитьПриход();
Движение.Период=connection.ЗначениеИзСтрокиВнутр("");
Движение.Измерение1=Спр.Ссылка;
Движение.Ресурс1=15;
Док.Движения.РегистрНакопления1.Записать();
Сообщить(connection.String(Док.Ссылка));
КонецЕсли;
connection = "";
cntr = "";
КонецФункции

Рассмотрим лог сообщений
Документ1 000000001 от 31.12.2008 0:00:00

Вывод из этого лога прост. Время даже при передаче через ЗначениеИзСтрокиВнутр теряется.

Класс не существует

И в заключении. Если выскакивает ошибка с «Класс не существует», значит, что не зарегистрирован COM-объект 1С:Предприятия.

Для регистрации V81.COMConnector необходимо выполнить:
regsvr32 «C:\Program Files\1cv81\bin\comcntr.dll»

Для регистрации V81.Application необходимо выполнить:
«C:\Program Files\1cv81\bin\1cv8.exe» /regserver

[необходимо зарегистрироваться для просмотра ссылки]

От себя добавлю: статья оригинал для 8.1, поэтому и разместил её в разделе для 8.1. Для 8.2 всё, если не совсем так, то очень близко

ipsclass->input[‘t’] тема —>

Сколько одновременных подключений поддерживает v77s application

Запускаю скриптом обработку выдаёт ошибку:

ТиС = СоздатьОбъект(«V77.Application»);
: Неудачная попытка создания объекта (V77.Application)

Это находится в процедуре ПриОткрытии()

Запускаю тоже самое руками — всё работает.
Скрипт запускаю также вручную.

(0) Не кошерно при открытии пытаться делать долгоиграющие шаги 🙂
+(0) Сделай кнопку, как Руками 🙂

+(0) А ты уверен, что руками ты делаешь тоже самое «V77.Application»?

Бывает, что в «V77.Application», нужно еще и «V77s.Application» и другие буковки вставлять в зависимости платформы 🙂

(1) чёто надо сделать штоп заработало при запуске скриптом.
(4) вручную то почему запускается?
V77s.Application не проканало. та же ошибка
Мне кажется это в винде чего-то
(6) Что-то мне это все до боли напоминает 🙂
(7) А винда кокая?
(9) 2003 32 бит

Для корректной регистрации 1с v7 как OLE-сервер нужно не просто установить 1с, но и запустить её с правами администратора хотя бы раз.

(11) под админом запускал

Процедура УстановитьПодключение(ПутьКБазе,ЮзерВБазе,ПарольВБазе)
Состояние(«Подключение. «);
ИБПр=CreateObject(«V77S.Application»);
Если ИБПр.Initialize(ИБПр.RMTrade,»/d»+СокрЛП(ПутьКБазе)+» /n»+СокрЛП(ЮзерВБазе)+» /p»+СокрЛП(ПарольВБазе), «No_splash_show») =0 тогда
Предупреждение(«Ошибка открытия информационной базы!»);
Подключен=0;
Возврат;
иначе
Подключен=1;
Сообщить(«Подключена база «+ПутьКБазе);
КонецЕсли;
КонецПроцедуры

S — только убери или оставь 🙂

(12) + Статья http://www.pokatashkin.com/it/1c/1197

БазаДонор = СоздатьОбъект(«V77.Application»);
OLEПодключена = БазаДонор.Initialize(БазаДонор.RMTrade,» /D «+СокрЛП(Путь),»NO_SPLASH_SHOW»);
у мня как раз на серванте 2003 работает вот так

В принципе как и у (13)

(14)(17) У меня всё замечательно и давно работает. Но исключительно при запуске вручную.
Через скрипт не хочет. Добавил прав в реестре перегружу ночью проверю

Тонкий клиент? не на сервере ли скрипт выполняется?

А через script — это как ?
Из сценария VbScript запускаем одну 1С, а уже из неё подключаемся к другой ? Если так, то может и не работать.
OLE-сервер не всегда может быть одновременно и OLE-клиентом, особенно в случае LocalServer32, когда используется Marshaling.

(19) На тонком клиенте всё решается правильной настройкой DCOM или запуском программы с ключом -embedded перед подключением.

(0)Вы бы уточнили от какого пользователя стартует скрипт.
И еще на какой машине стартует скрипт и с какой машины запускаете вручную.
И вообще какая стоит задача.

(21) о том то и речь, если на сервер dcom+ не настроен и объект 1с 7.7 не создастся.
пока мне не понятно о каком скрипте речь, и где и как он запускается
(24)Вполне с вами согласен.
Чел походу сам незнает че надо делать.

(19) Это семерка.. там нет тонкого клиента.. к тому же(20) семерочка всегда может бытьодновременно и ОЛЯ-клиентом и ОЛЯ-сервером

(26) Семерку запускают скриптом откуда-то, возможно из 1с 8 тонкого клиента.
(27) но код в (13) по ходу семерошный.. отсюда и вывод, что из семерки все
(26) хотя действительно наверно 7-ку запускают из 7-ки, т.к. «СоздатьОбъект()»

Скорее всего скрипт запускается через планировщик задач (скорее всего под System) на x64 сервере где 1с 7.7 ставилась копированием каталога или как то нестандартно, там нужно давать разрешения на DCOM+ этому пользователю.

А вот да. Автор, таки код в студию. а то пока не понятно откуда вызов то?
ПриОткрытии() то можно где угодно нарисовать))))) хоть на Си с плюсом)))).

правильный ответ в (30) — в правах пользователя под которым запускаетсяскрипт — в пофигуртаоре поставь соответсвующие права на использование оли

а V7Plus не надо загрузить?

(20)
«А через script — это как ?
Из сценария VbScript запускаем одну 1С, а уже из неё подключаемся к другой ?»
именно так

(28) все базы семёрочные
(18) Как вручную? Вручную, через Ярлык «1cv7s.exe»?
Или вручную, по нажатию кнопки в обработки?
Винда 2003 Энтерпрайз сп2 32 бит
(37) в 1с открываю обработку и запускаю . всё робит

(35) Т.е. у тебя 2 этапа.
1. Запускается Басик, где 1С 100% выполняется.
2. Запускается еще одна 1С по методу ОЛЕ, из запущенной 1С по Басику.

+(39) А пользователя вы какого указываете при запуске первой 1С?

Так то лучше полные права и галочку «Использование ОЛЕ» или типо того. Вообще проставь все галочки 🙂

+(39) Все же не забывай, что может права у 1С 7.7 похуже, чем у 8-ки. Но затыки тоже случаются 🙂

(40) первая база запускается, запускается обработка и вываливается с ошибкой «Неудачная попытка создания объекта (V77.Application) «

(42) галки все стоят
(43) я пока сделал по колхозному. в принципе робит, но хочется сделать нормально

В реестре есть ветка с именем V77.Application? Она возникает при штатной установке программы, при копировании каталога программы — не возникает и тогда такой вызов не сработает.

Под локальным админом запускаешь? На сервере или своём компе?

согласен с (42) галка нужна .. но (47) есть в какой базе? в той Из которой подключаешься или в той к которой подключаешься? Надо бы и там и там поставить. Потому как галка гласит о использовании базы ОЛЯ как сервера
Но суслик по ходу где то еще живет. у автора ведь не создается объект, и в этот момент еще пока не известно к какой базе цепляться. так что грешить на базу-донора пока рановато.

ОЛЕ в данном случае может быть трех вариантов:
локальная на одного пользователя — V77L.Application
Сетевая версия — V77.Application
Версия SQL -V77.Application
(0) У вас какая из них счас используется?

При этом для вызывающей базы по барабану какая база донор (дбф или скуль). ТО есть надо определиться какая база вызывающая

очипятка в (51)
Версия SQL -V77s.Application конечно же)))

(53) Там и в сетевой ошибка (V77n, кажется). Но по V77 запускается любая (или первая?) из установленных «семёрок».

(54) Сетевая версия — V77.Application

Лучше конечно выбирать ту, которая соответствует.
на моей запускается и 77 и 77s но думаю, что если локальная версия то может запустится только 77L

77n тоже запускает

(56) Были инциденты, что вот запускалось только V77s и ни в какую не хотела видеть другие.
Но, судя по ссылке из (14), все дело в том, какая версия 1С установлена на данном ПК ил Сервере 🙂

+(48) (0) Попробуй запускать вторую 1С с паузой 🙂
Ведь разница в нажатой кнопки «Старт» и «При открытии».
Только в не показанной форме обработки. 🙂

Ну, еще вариант, установить при открытии Форма.ОбработкаОжидания(«Запустись»,5).

В процедуре «Запустись»
Форма.ОбработкаОжидания(«Запустись»,0), что бы не запускалось более 🙂

(59) При чем тут пауза? Автор гласит, что не создается объект в процедуре ПриОткрытии(). Давай те при каждом создании обекта ставить паузу.. Ну не сурьезно же. До подключения к базе даже жело не доходит.

(61) а вот может быть уж совсем бузумная идея. а переменная ТиС. она случаем уж не глобально где нибудь занята. а тоя как то попробовал назвать переменную запрещенным именем (ну тпа КонецЦикла.. ради прикола)))) . оно блин ругалось ооочень матерно)))))

(60) Не сурьезно, а как показала практика, Паузы в 1С ой как не хватает 🙂
Ну и да, если он же открывает туже самую обработку и так же жимкает кнопку, то все работает. Это то хоть о чем то говорит?

(63) ну у меня есть несколько поделок и в ПриОткрытии() есть создание обекта аналогично как у автора. но как то не было ни разу потребностей в паузе. да и если вдруг паузу. то какую?

Конечто делаю через попытку. но она сама по себе вроде как паузу не обеспечивает
(63) .. да вот конечно если по кнопе она срабатывает а при открытии() нет. странно как минимум.

(63) да.. вот чего .. если дело в паузе, то это можно легко проверить. пойти в отладчик.. поставить точку останова вот тебе и пауза сколько хочешь.

(0) а Покажи ка плиз код. ПриОткрытии(), если есть все, что в самом низу кода .. которое не в процедурах. и если вдруг есть ПослеОткрытия(). мож там суслик где то?

(67) пауза не помогает
НО если кнопком включаешь, то все без фокусов?
(70) с кнопки всё робит
(68) да фигли выкладывать? так же как в (16)

(72)скрипт запускает 1с под тем же пользователем 1с под которым ты сам заходишь и выполняешь обработку? если нет проверь в конфигураторе что в роли есть право на ole automation как тебе писали в (33)

проверь журнал ошибок windows, наверняка там что-то есть.

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

(72) .. так в (16) ето я и сообщал))) что то ты недоговариваешь. не может быть таких чудес, что с кнопки арбайт а при открытии() нет. где то суслик должен быть)).

(0) а так?
СоздатьОбъект(«V1CEnterprise.Application»)

(77) ну да может прокатить конечно. но . таки остается открытым вопрос почему с кнопы арбайт а при открытии не арбайт.

(73) есть все галки) ваще все)
не верю. ну не может такого быть что бы одна и та же поделка то работало то не работало

как 1с устанавливалась? и что конкретно делается руками?
вот тут есть что-то: http://1c911.by/stati_1s/statya-1s-77-i-windows-7.htm#4

Каким образом происходит запуск скрипта? вручную?

(75) В журнал ошибок пишутся в т.ч. ошибки по нарушению прав к каталогам, например. Поэтому м.б. что будет ошибка аудита.

м.б. скрипт не может даже получить доступ к каталогу установки 1с.

(83).. оператор СоздатьОбъект() какой каталог пользует?
Если только при запуске программы их создается докучи. и не ругается. Разве СоздатьОбъект(«V77.Application») будет обращаться в какой то специальный каталог? Вот когда объект уже создан и этот объект обращается к каталогу базы-донор. вот тут согласен, журнал отсечет это дело. а на этапе создания объекта — увы в журнал ничего не попадет.
Тем более автор утверждает, что с кнопки арбайт. стало быть права к каталогам как минимум правильные.

(85) во первых для Оле обычно нужно писать не СоздатьОбъект() а CreateObject(), т.к. русские обозначения не работают или не всегда работают. Какой каталог использует СоздатьОбъект(«V77.Application») прописано в реестре windows где прописан путь к экзешнику 1с 7.7.

(86) Видимо у мня как раз тот случай, когда срабатывает русское СоздатьОбъект(). Вот если я хочу создать объект уже на ОЛЕ, там да латинское однозначно. НО опять же. с кнопы то арбайт.

Предлагаю вместо скрипта на vbs использовать батник, уверен что с ним больше вероятность что сработает

Вообще-то, для 1С пауза не нужна — она живёт в другом процессе, но для обмена данными нужна очередь событий, которая при открытии формы может быть просто заблокирована, так как очередь задана созданием окна.
Не забываем, что при открытии — это всё равно что формула на форме, а там не все действия допустимы.
Советую, при открытии сделать Форма.Закрыть(0),
а уже при закрытии сделать СтатусВозврата(0) и создать ваш несчастный объект — он должен создаться.

Подключение к 1С 7.7 из 1С 8.2 на сервере (x64) по технологии OLE

Столкнулся недавно с одной проблемкой, решением которой и хочу поделиться. У многих, я думаю, в переходной период (при переходе с 1С 7.7 на 1С 8.Х) возникает необходимость подтягивать какие-либо данные из старой конфигурации. В случае с отчетами это иногда удобнее делать онлайн, подключаясь к базе 1С 7.7 через OLE. В случае, если используется клиент-серверный вариант базы 1С 8.Х и используете управляемое приложение для работы, то реально обработать какой либо вменяемый объем данных можно только на серверной стороне. Соответственно вызов 1С 7.7 базы будет производиться сервером. Вот здесь обычно и возникают проблемы. Начнем с того, что на сервере (имеется ввиду машина, где установлен сервер 1С Предприятие 8.Х) должна быть корректно установлена платформа 1С Предприятие 7.7. Из 1С 8.Х пробуем создать OLE-объект v77.application (пример v77 = новый comобъект( v77s.application);). Получилось — ура, у вас все хорошо, можно продолжать спокойно программировать дальше. Если вылетает с ошибкой типа «незарегистрированный класс» и т.д., значит, OLE-сервер 1С Предприятие 7.7 корректно не зарегистрировался. Далее все манипуляции должны выполняться на машине с установленным сервером 1С Предприятие 8.Х. Набираем в командной строке «dcomcnfg», в «Корень консоли/Службы компонентов/Компьютеры/Мой компьютер/Настройка DCOM» ищем «V77.GeneralPropPage». Отсутствие означает наличие проблемы в установке платформы 1С предприятие 7.7. Если нашли, то сейчас просто запоминаем где мы это нашли. В прикрепленном архиве есть 2 файла, сейчас нам нужен «v77_ole.reg». Объединяем его с реестром. Из 1С 8.Х еще раз пробуем создать OLE-объект v77.application (пример v77 = новый comобъект( v77s.application);) Закрываем — открываем «dcomcnfg». «V77.GeneralPropPage» должна появиться. Теперь обращаем внимание на текст ошибки при вызове метода «comобъект( v77s.application)». Если ошибки нет, то понятное дело – работаем себе дальше по своему усмотрению. Если вылетает с ошибкой типа: отказано в доступе или интерфейс не поддерживается, то мы на верном пути, просто еще не дошли куда нужно. Дело в том, что сервер у нас х64, а OLE-сервер 1С 7.7 х32. Для того чтобы такой вызов был осуществлен необходима заглушка. Берем из архива второй файл – «v77_ole_x64.reg» и объединяем его с реестром. После этого еще раз пробуем создать OLE-объект v77.application (пример v77 = новый comобъект( v77s.application);). Если и теперь ошибка, скорее всего косяк с правами. Смотрим, от какого пользователя запускается сервер 1С Предприятие 8.Х. В приложении «dcomcnfg» для объекта «V77.GeneralPropPage» (мы же запомнили, где он расположен) на вкладке безопасность даем права на доступ, запуск и активацию пользователю, из-под которого запускается сервер 1С Предприятие 8.Х. Вообще, права лучше бы проверить в первую очередь при любых проблемах с OLE-объектами. Обычно после этого все работает без перезагрузки. Правда перезагрузка не помешает.

P.S. Разобрал конкретный пример, поэтому в некоторых аппаратно-программных конфигурациях что-то может пойти не так. Но вектор, как говорится, задан, дальше попробуйте сами разобраться. Впрочем, в большинстве случаев описанная выше процедура должна помочь.

P.S. Здесь я в качестве платформы 1С предприятие 7.7 использовал ее SQL-серверный вариант. Для других версий платформы или нестандартном расположении папки с платформой 1С 7.7 необходимо подкорректировать пути в файлах реестра из архива и использовать соответствующий comобъект (например: «v77.application»).

P.S. Думаю, описанные выше процедуры помогут при проблемах с OLE доступом к 1С 7.7 на компьютерах с операционными системами windows x64 и в конфигурациях без сервера 1С Предприятие 8.Х.

Удачного дня и хорошей работы!

Прикрепленные файлы:

  • Дата
  • Дата
  • Рейтинг всех уровней
  • Рейтинг 1-го уровня
  • Древо развёрнутое
  • Древо свернутое

Свернуть все
6. mamonth 10.09.21 09:39 Сейчас в теме
+1 Взял на вооружение!
2. vovaapril 46 06.02.18 10:15 Сейчас в теме

Давно мучаюсь с подключением к 7.7 через OLE.
Есть самописная обработка по перекачке данных из базы 7.7 в 8.3.
База77 = Новый COMObject(«V77S.Application») никаких ошибок не вызывает, а вот следующий оператор при запуске на windows server 2012 r2
База77.Initialize(База77.RMTrade, «/d»»» +КаталогБД+»»»»+Польз,»NO_SPLASH_SHOW») вызывает падение. Runtime error. Неизвестная ошибка при вызове метода Initialize.
Но когда я запускаю со своего компа на Win7 x64 всё идёт без запинки.

3. Xershi 1486 06.02.18 10:24 Сейчас в теме
Давно есть моя публикация на эту тему.
Возможно найдете решение своих проблем.
4. vovaapril 46 06.02.18 11:54 Сейчас в теме

(3) Ага, посмотрел. Из того что ещё не делал — поправил ветку реестра HKEY_LOCAL_MACHINE>SYSTEM>CurrentControlSet>Control>Session Manager>SubSystems .
Но всё равно крашится:

Сигнатура проблемы

7.7 на серваке запускается без проблем, работают несколько пользователей. Когда 8.3 создаёт объект V77.Aplication никаких проблем не возникает. Если неправильно указать путь к базе или пользователя то 7.7 даёт выбрать, а вот потом при коннекте к базе процесс 7.7 падает. В 8.3 срабатывает исключение.
Смотрел на своём компьютере (где всё работает) настройки DCOM. Вообще ни одного пункта V77 нет и при этом работает, на сервере по многочисленным советам добавлял ветки в реестр, но это не повлияло. Установщик 1С один и тот же.

Сколько одновременных подключений поддерживает v77s application

Добро пожаловать, Гость. Пожалуйста Войдите или Регистрация
Новости:

Наверх

1С++ users forum › 1С++ и прочие расширения v7 › Курилка › Сервер приложений для v7

(Группа Модераторов: 1c++ moderator)

Переключение на Главную СтраницуСтраницы: [1] Отправить Печать
Сервер приложений для v7 (число прочтений — 22514 )

Добавить комментарий

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