Как сделать программу com

Один из вариантов обмена данными между базами 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+ соединение для 1С. Рис.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

В появившемся окошке с сообщением об успешной регистрации библиотеки необходимо нажать “ОК”:

COM+ соединение для 1С. Рис.0

Папку bin надо искать по пути, куда у вас установлена текущая версия платформы 1С. На момент написания статьи – её номер 8.3.6.2390.

2. Запускаем консоль “Службы компонентов”: Пуск -> Администрирование -> Службы компонентов . Раскрываем ветку “Службы компонентов”. Вызываем меню, кликнув правой клавишей мыши по ветке “Приложения COM +” и выбираем Создать -> Приложение :

COM+ соединение для 1С. Рис.2

3. У вас откроется приветственное окно “Мастера установки приложений COM +”, в котором необходимо нажать “Далее”:

COM+ соединение для 1С. Рис.3

4. В следующем окне нажмите на “Создать новое приложение”:

COM+ соединение для 1С. Рис.4

5. Введите желаемое имя для нового приложения. В примере используется V83_ComConnector, отметьте способ активации, как “Серверное приложение” и нажмите далее:

COM+ соединение для 1С. Рис.5

6. В следующем окне выберите учетную запись, которую использует при старте агент сервера 1С. В примере – это учетная запись локального администратора сервера. Введите пару логин/пароль и нажмите “Далее”:

COM+ соединение для 1С. Рис.6

7. В следующем окне “Мастера…” нажмите “Далее”:

COM+ соединение для 1С. Рис.7

8. На следующем шаге, вам необходимо добавить (если имеет смысл) пользователя, от имени которого стартует агент сервера 1С и, соответственно, учетная запись которого будет использована для удостоверения работы нашего нового COM + приложения. В окне данного примера указан только доменный администратор, от имени которого запущен “Мастер установки приложений COM +”, нажмите кнопку “Добавить”:

COM+ соединение для 1С. Рис.8

9. В следующем окне введите имя учетной записи, от имени которой работает агент сервера 1С, и нажмите “ОК”:

COM+ соединение для 1С. Рис.9

10. Вернувшись к “Мастеру…”, убедитесь, что искомая учетная запись добавилась и нажмите “Далее”:

COM+ соединение для 1С. Рис.10

11. Закройте “Мастер установки приложений COM +”, нажав “Готово”:

COM+ соединение для 1С. Рис.11

12. Мы вернулись к окну консоли “Службы компонентов”. Убедитесь, что приложение COM + с вашим именем (в примере – V83_ComConnector) создан:

Читайте также:
Сколько существует программ траектория вычислений

COM+ соединение для 1С. Рис.12

13. Раскройте дерево созданного приложения и, вызвав меню правой кнопкой мыши по ветви “Компоненты”, создайте новый компонент Создать -> Компонент :

COM+ соединение для 1С. Рис.13

14. У вас откроется приветственное окно “Мастера установки компонентов COM +”, в котором необходимо нажать “Далее”:

COM+ соединение для 1С. Рис.14

15. В следующем окне нажмите на “Установка новых компонентов”:

COM+ соединение для 1С. Рис.15

16. С помощью окна explorer выберите библиотеку comcntr.dll, находящуюся по пути C:Program Files (x86)1cv88.3.6.2390bin , которую мы зарегистрировали в системе на первом шаге. Убедитесь, что путь к этой библиотеке совпадает с вашей версией платформы. В примере – это 8.3.6.2390. И нажмите “Открыть”:

COM+ соединение для 1С. Рис.16

17. В следующем окне “Мастера…” нажмите “Далее”:

COM+ соединение для 1С. Рис.17

18. Закройте “Мастера установки компонентов COM +”, нажав “Готово”:

COM+ соединение для 1С. Рис.18

19. Вы вернетесь к окну консоли “Службы компонентов”. Убедитесь, что в нашем приложении COM + создалась новая компонента:

COM+ соединение для 1С. Рис.19

20. Вызовите её свойства:

COM+ соединение для 1С. Рис.20

21. И на вкладке “Безопасность” в окошке “Явно установленные для выделенных объектов роли:” отметьте мышкой CreatorOwner и нажмите “ОК”:

COM+ соединение для 1С. Рис.21

22. Вернувшись к консоли “Службы компонентов” закройте её и перезагрузите сервер.

После выполнения указанных действий, завершение “подвисших” сеансов в 1С версии 8.3 происходило без проблем. Единственное неудобство – теперь после каждого обновления платформы 1С на новую версию, необходимо проделывать данную операцию.

Поделиться

Twitter Vkontakte Facebook MyWorld Odnoklassniki LiveJournal Blogger Google+ Email

Просмотров статьи: 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

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru