Один из вариантов обмена данными между базами 1С это обмен через COM соединение. С помощью COM соединения можно из одной базы 1С подключиться к другой и прочитать или записать данные. Пользоваться этим методом можно как в клиент-серверных вариантах баз, так и в файловых базах. В этой статье рассматривается такого рода соединений на платформа 8.3
Com соединение
Можно создать два вида COM объектов для приложения 1С. Это ole соединения V83.Application и com соединения V83.COMConnector. В случае с V83.Application запускается практически полноценный экземпляр приложения 1С. В случае использования V83.COMConnector запускается небольшая серверная часть. Скорость работы в этом случае выше, но некоторые функции могут быть недоступны.
В частности работа с формами и с общими модулями для которых не установлено свойство работы с внешними соединениями. Преимущественно надо использовать V83.COMConnector и только в случае нехватки функционала V83.Application. Особенно сильно разница в скорости работы может быть заметна на базах большого объема. Для платформе 8.2 используется V82.Application или V82.COMConnector
Как сделать управляющею программу G-CODE для фрезерного ЧПУ станка в FreeCAD
Установить OLE соединение
Соединение = Новый COMОбъект(«V83.Application»);
Установить COM соединение
Соединение = Новый COMОбъект(«V83.COMConnector»);
Строка подключения
//Для варианта клиент- сервер СтрокаСоединения = «Srvr = «»ИмяСервера»»;Ref = «»ИмяБазы»»; Usr = ИмяПользователя; Pwd = Пароль»; //Для варианта файлового режима: СтрокаСоединения = «File = «»ПутьКБазе»»; Usr = ИмяПользователя; Pwd = Пароль»; Попытка Подключение = Соединение.Connect(СтрокаСоединения); Исключение Сообщение = Новый СообщениеПользователю; Сообщение.Текст = «Не удалось подключиться к базе» + ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки;
Разрыв соединения
Соединение = Неопределено;
Для объекта V83.Application выполнять разрыв соединения обязательно, в противном случае останется висеть незавершенный сеанс, который потом придется удалять вручную. В случае с V83.COMConnector соединение разрывается автоматически при завершении процедуры в которой выполнялось подключение.И есть еще один маленький момент. Для пользователя под которым выполняется подключение должен быть отключен флажок «Запрашивать подтверждение при закрытии программы» в его настройках.
Метод NewObject()
Для создания нового объекта можно воспользоваться методом NewObject(), например:
// для V83.COMConnector Подключение = Соединение.Connect(СтрокаСоединения); ЗапросCOM = Подключение.NewObject(«Запрос»); ТаблицаCOM = Подключение.NewObject(«ТаблицаЗначений»); МассивCOM = Подключение.NewObject(«Массив»); УидCOM =Подключение.NewObject(«УникальныйИдентификатор»,СтрокаУИД); //для V83.Application Соединение = Новый COMОбъект(«V83.COMConnector»); ЗапросOLE = Соединение.NewObject(«Запрос»); ТаблицаOLE = Соединение.NewObject(«ТаблицаЗначений»); МассивOLE = Соединение.NewObject(«Массив»); УидCOM =Соединение.NewObject(«УникальныйИдентификатор»,СтрокаУИД);
После создания Com объекта можно далее работать с ним, например
ЗапросCOM.Текст =»ВЫБРАТЬ | ДолжностиОрганизаций.Код, | ДолжностиОрганизаций.Наименование |ИЗ | Справочник.ДолжностиОрганизаций КАК ДолжностиОрганизаций»; Результат = ЗапросCOM.Выполнить(); Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // . КонецЦикла;
Можно также использовать менеджеры объектов конфигурации:
СправочникCOM = Подключение.Справочники.ИмяСправочника; ДокументCOM = Подключение.Документы.ИмяДокумента; РегистрCOM = Подключение.РегистрыСведений.ИмяРегистра;
Получение и сравнение перечисления через COM соединение
Для сравнения значений элементов перечислений, определенных в конфигурации, необходимо выполнить преобразование этих элементов к одному из примитивных типов, сравнение которых не вызывает трудности. Такими типами могут быть либо числовой, либо строковый тип. Преобразовать значение элемента перечисления к числовому типу можно так
ЭлементПеречисления = Подключение.Справочники.Справочник1.НайтиПоКоду(1).Реквизит1; ВозможныеЗначения = ЭлементПеречисления.Метаданные().ЗначенияПеречисления; НомерЭлементаПеречисления = ВозможныеЗначения.Индекс(ВозможныеЗначения.Найти(Соединение.XMLString(ЭлементПеречисления))); Если НомерЭлементаПеречисления = 0 Тогда Сообщить(«ЗначениеПеречисления1»); ИначеЕсли НомерЭлементаПеречисления = 1 Тогда Сообщить(«ЗначениеПеречисления2»); КонецЕсли;
Получение объекта через COM по идентификатору
Через менеджеры объектов конфигурации получаем com объект, например :
ДокументCOM = Соединение.Документы.ИмяДокумента;
Затем получаем строку уникального идентификатора :
СтрокаУИД=Соединение.string(ДокументCOM.УникальныйИдентификатор());
Затем в базе данных можно найти по ссылке нужный документ, таким образом:
Идентификатор= Новый УникальныйИдентификатор(СтрокаУИД); СсылкаПоИдентификатору = Документы[ИмяДокумента].ПолучитьСсылку(Идентификатор);
Если нужно найти com объект по идентификатору, то тогда нужно написать так:
УидCOM = Соединение.NewObject(«УникальныйИдентификатор»,СтрокаУИД); СсылкаПоИдентификатору = Соединение.Документы[ИмяДокумента].ПолучитьСсылку(УидCOM);
Поделиться ссылкой:
- Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)
- Нажмите, чтобы открыть на Facebook (Открывается в новом окне)
Источник: master1c8.ru
Ручное создание COM+ соединения для 1С Дневник Максим Боголепов
Это выливается в некоторые трудности. Например, при попытке завершения “подвисшего” сеанса из следующей формы:
Сделать это, используя “ COM -соединение с агентом сервера”, не получится, и операция завершится ошибкой.
Для того, чтобы вручную создать COM -соединение для 32-х битной версии платформы 1С, работающей на 64-х битной версии операционной системы, необходимы выполнить следующие шаги.
1. Необходимо зарегистрировать в системе 32-х битную библиотеку comcntr.dll. Для этого, откройте на сервере командную строку cmd.exe от имени администратора и выполните следующие команды:
C:Usersадминистратор>cd C:Program Files (x86)1cv88.3.6.2390bin C:Program Files (x86)1cv88.3.6.2390bin>regsvr32 comcntr.dll
В появившемся окошке с сообщением об успешной регистрации библиотеки необходимо нажать “ОК”:
Папку bin надо искать по пути, куда у вас установлена текущая версия платформы 1С. На момент написания статьи – её номер 8.3.6.2390.
2. Запускаем консоль “Службы компонентов”: Пуск -> Администрирование -> Службы компонентов . Раскрываем ветку “Службы компонентов”. Вызываем меню, кликнув правой клавишей мыши по ветке “Приложения COM +” и выбираем Создать -> Приложение :
3. У вас откроется приветственное окно “Мастера установки приложений COM +”, в котором необходимо нажать “Далее”:
4. В следующем окне нажмите на “Создать новое приложение”:
5. Введите желаемое имя для нового приложения. В примере используется V83_ComConnector, отметьте способ активации, как “Серверное приложение” и нажмите далее:
6. В следующем окне выберите учетную запись, которую использует при старте агент сервера 1С. В примере – это учетная запись локального администратора сервера. Введите пару логин/пароль и нажмите “Далее”:
7. В следующем окне “Мастера…” нажмите “Далее”:
8. На следующем шаге, вам необходимо добавить (если имеет смысл) пользователя, от имени которого стартует агент сервера 1С и, соответственно, учетная запись которого будет использована для удостоверения работы нашего нового COM + приложения. В окне данного примера указан только доменный администратор, от имени которого запущен “Мастер установки приложений COM +”, нажмите кнопку “Добавить”:
9. В следующем окне введите имя учетной записи, от имени которой работает агент сервера 1С, и нажмите “ОК”:
10. Вернувшись к “Мастеру…”, убедитесь, что искомая учетная запись добавилась и нажмите “Далее”:
11. Закройте “Мастер установки приложений COM +”, нажав “Готово”:
12. Мы вернулись к окну консоли “Службы компонентов”. Убедитесь, что приложение COM + с вашим именем (в примере – V83_ComConnector) создан:
13. Раскройте дерево созданного приложения и, вызвав меню правой кнопкой мыши по ветви “Компоненты”, создайте новый компонент Создать -> Компонент :
14. У вас откроется приветственное окно “Мастера установки компонентов COM +”, в котором необходимо нажать “Далее”:
15. В следующем окне нажмите на “Установка новых компонентов”:
16. С помощью окна explorer выберите библиотеку comcntr.dll, находящуюся по пути C:Program Files (x86)1cv88.3.6.2390bin , которую мы зарегистрировали в системе на первом шаге. Убедитесь, что путь к этой библиотеке совпадает с вашей версией платформы. В примере – это 8.3.6.2390. И нажмите “Открыть”:
17. В следующем окне “Мастера…” нажмите “Далее”:
18. Закройте “Мастера установки компонентов COM +”, нажав “Готово”:
19. Вы вернетесь к окну консоли “Службы компонентов”. Убедитесь, что в нашем приложении COM + создалась новая компонента:
20. Вызовите её свойства:
21. И на вкладке “Безопасность” в окошке “Явно установленные для выделенных объектов роли:” отметьте мышкой CreatorOwner и нажмите “ОК”:
22. Вернувшись к консоли “Службы компонентов” закройте её и перезагрузите сервер.
После выполнения указанных действий, завершение “подвисших” сеансов в 1С версии 8.3 происходило без проблем. Единственное неудобство – теперь после каждого обновления платформы 1С на новую версию, необходимо проделывать данную операцию.
Поделиться
Просмотров статьи: 39731 Раздел: Администрирование
Rating: 4.0/5(4 votes cast)
Источник: maxblogs.ru
Как сделать программу com
В этой статье мы рассмотрим пример асинхронного приема данных из СОМ порта средствами Delphi. То-есть опрос порта будет производиться непрерывно, до тех пор пока мы его не остановим, а прочитанную информацию она будет записывать в Memo. Чтобы процедура опроса не «подвешивала» наше приложение, мы организуем прослушивание порта в отдельном потоке.
Поэтому прежде чем Вам начать практиковаться по настоящей статье, автор предполагает что читатель уже знаком с темой потоков в Delphi. Пример конечно примитивен, поскольку демонстрирует лишь минимум функций, которые можно реализовать для связи по трем проводкам (GND, RX и TX), но эта простота вовсе не снижает интереса к нашей с Вами теме. По скольку дает «живое» представление о принципе асинхронного чтения, да еще и на «сквозном» примере.
И так приступим:
1) Поместим на форму следующие компоненты; Listbox — 1шт, Button — 4шт и компонент Memo — 1шт. Расставим их примерно как на рисунке ниже:
Для чего? Мы с Вами напишем программу с помощью которой нажав кнопку — «Сканировать», сможем увидеть доступные COM порты в нашем ListBoxе. Кликнув по выделенному порту двойным щелчком мыши, мы к нему подключимся.
После подключения нам станет доступна опция чтения, которая после того как мы нажмем на кнопку — «Начать чтение», запустится и будет крутиться в отдельном потоке цикл прослушивания порта, и по мере обнаружения информации в буфере, будет помещать ее в компонент Memo. Ну и собственно на любом этапе работы программы, мы сможем очистить содержимое приема или вовсе разорвать связь с текущим портом, чтобы переключиться на любой другой свободный COM порт, ну или вовсе завершить работу нашего приложения. И так поехали дальше.
2) Объявим глобально следующие переменные:
Form1:TForm1;
Adr:PWideChar; //Переменная номера COM порта;
W:WideString; //Промежуточная переменная;
ComFile:THandle; //Хендл ком порта;
Dcb:TDCB; //Структура настроек порта;
ComStat:TComStat; //Переменная состояния порта;
Timeouts:TCommTimeouts; //Переменная таймаутов;
OverRead:TOverlapped;
Buffer:array [0..255] of AnsiChar; //Массив данных AnsiChar;
Btr, Temp, Mask, Signal:DWORD;
Свойство Enabled у Button2 и Button3 установим в false, свойство ReadOnly компонента Memo установим в true;
В событии OnClick Button1 пропишем код для пересчета существующих портов и помещения их в наш ListBox:
procedure TForm1.Button1Click(Sender: TObject);
Var i:Integer;
begin
for i:=0 to 10 do
begin
ComFile:=CreateFile(Pchar(‘COM’+intToStr(i+1)), Generic_Read or Generic_Write, 0, nil, open_existing, file_flag_overlapped,0);
if ComFile<>invalid_handle_value then
begin
Listbox1.Items.Add(‘COM’+ IntToStr(i+1));
CloseHandle(ComFile);
end;
Button1.Enabled:=False; //Деактивируем клавишу сканирования;
end;
end;
3) B событии OnDblClick нашего ListBoxа запускаем и настраиваем выбранный порт
procedure TForm1.ListBox1DblClick(Sender: TObject);
begin
W:=Form1.ListBox1.Items.Strings[form1.ListBox1.ItemIndex];
Open_Existing, File_Flag_Overlapped , 0); >
if ComFile=Invalid_Handle_Value then
begin
ShowMessage(‘ Не удалось открыть порт ‘);
exit;
end;
PurgeComm(ComFile, Purge_TXabort or Purge_RXabort or Purge_TXclear or Purge_RXclear); //Очищаем буферы приема и передачи и очередей чтения/записи;
GetCommState(ComFile, DCB); //Настраиваем DCB настройки порта;
with DCB do
begin
BaudRate:=9600;
ByteSize:=8;
Parity:=NoParity;
StopBits:=OneStopBit;
end;
if not SetCommState(ComFile, DCB) then
begin
ShowMessage(‘Порт не настроен’); //Если не удается выводим сообщение об ошибке;
CloseHandle(ComFile);
exit;
end;
if ComFile <> INVALID_HANDLE_VALUE then
begin
GetCommTimeouts(ComFile, Timeouts); < Чтение текущих таймаутов и настройка параметров структуры CommTimeouts >
Timeouts.ReadIntervalTimeout:=MAXDWORD; //Таймаут между двумя символами;
Timeouts.ReadTotalTimeoutMultiplier:=0; //Общий таймаут операции чтения;
Timeouts.ReadTotalTimeoutConstant:=0; //Константа для общего таймаута операции чтения;
Timeouts.WriteTotalTimeoutMultiplier:=0; //Общий таймаут операции записи;
Timeouts.WriteTotalTimeoutConstant:=0; //Константа для общего таймаута операции записи;
SetCommTimeouts(ComFile, Timeouts); //Установка таймаутов;
end;
SetupComm(ComFile, 4096, 4096); //Настройка буферов;
if not SetupComm(ComFile, 4096, 4096) then //Ошибка настройки буферов;
begin
ShowMessage(‘ Ошибка настройки буферов ‘);
CloseHandle(ComFile);
exit;
end;
SetCommMask(ComFile, EV_RXchar);
ListBox1.Enabled:=False; // Деактивируем listbox;
Button2.Enabled:=True; // Активируем кнопку «Разъединить»;
Button3.Enabled:=True; //Деактивируем кнопку «Начать чтение»;
end;
Что мы тут сделали?
Во-первых открыли порт для асинхронной работы: — File_Flag_Overlapped . Во-вторых настроили скорость обмена (9600 бод), количество бит в посылке (8), контроль четности (NoParity), указали количество стоповых бит (OneStopBit). Также мы настроили таймауты и размеры буферов порта, но по большому счету, для нашего примера можно обойтись и без них (если их не указывать и не настраивать, система все настроит автоматически), но раз уже мы их настроили, то пусть будут. В-третьих, мы установили маску — EV_RXchar — ожидание прихода байта. Это необходимо для нашего потока чтения. Смысл какой? В отдельном потоке, который мы сейчас создадим будет крутиться цикл, для которого приход байта в порт (Mask and EV_RXchar) <>0 — будет сигналом для чтения состояния порта, получения количества этих байт и если это количество не равно 0, (If Btr.Size<>0) то запуску чтения содержимого в
Form1.Memo1.Lines.Text:=Form1.Memo1.Lines.Text+(String(buffer));
Buffer:=»; //Очищаем переменную буфера;
Источник: delartidea.blogspot.com