В delphi как в 1с
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
1C + Delphi 5: Как проверить активность пользователя в 1С (7.7)?
После многочисленных вопросов, типа :
- "Посмотрел программу "Список пользователей 1С" и решил сделать все тоже самое, но с помощью самой 1С и столкнулся с тем, что . "
- ". Как всё таки происходит определение подключен до сих пор пользователь из файла links.tmp, или нет . "
- ". каким образом определяется активность из этого файла, ведь при выходе пользователя информация в нем не меняется?"
Я решил выложить здесь исходные тексты программы GetUsers1C (Считывание списка активных Пользователей для указанной Базы Данных 1С). Тексты можно использовать по своему усмотрению (но только freeware ).
Да. И еще. Текст программы GetUsers1C размещен здесь в том виде, как он есть (версия 105 от 24.12.2003). В настоящий момент моя деятельность уже НЕ связана с 1С. Т.е., просьба вопросов по исходникам не задавать. Описания все равно не будет .
Вкратце, что делает программа GetUsers1C.
Windows-95/98/2000/XP (версия 1.05 от 24.12.2003)
Считывание списка активных Пользователей для указанной Базы Данных 1С (аналог монитора пользователей 1С)
Версия 1.00
1) Список Баз Данных 1С считывается из системного реестра копьютера.
2) Список активных Пользователей для данной версии программы определяется след. образом.
2.1 Для указанной Б.Д. на винч. локального компа копируется файл Links.tmp (из подкаталога SYSLOG)
2.2 Из этого файла (на локальном компе) создается список Пользователей
2.3 Активность Пользователя определяется по информации в файле Links.tmp из каталога SYSLOG (для указанной Б.Д.)
3) Файл Links.tmp копируется в папку запуска программы. Если программа запустилась с CD, файл Links.tmp копируется в папку
C:\TMP\ (если папки нет - программа попытается ее создать)
Версия 1.02
Дополнительно к версии 1.00
1) Теперь программа умеет считывать список Баз Даннх 1С не только из реестра, но и из текстового файла (по нажатию соотв. кнопки).
Формат файла : 1 строка - 1 база данных
Формат строки :
ИмяБазыДанных Разделитель ПутьКБазеДанных
ИмяБазыДанных - не имеет значения
Разделитель - цепочка символов |=> ПутьКБазеДанных - также, как указано в реестре
2) Программа понимает параметры, передаваемые в командной строке при запуске. Параметры :
/I: - следующая за параметром строка интерпретируется в двух возможных вариантах :
- как имя текст.файла, где хранится список баз данных 1С (формат см. выше)
- как путь доступа к конкретной базе данных 1С
/R: - следующее за параметром Число - номер строки (в списке Баз Данных),
куда установить курсор (для этой базы будет считываться список пользователей).
По умолчанию = 1.
Имеет смысл только, если в качестве парметра для команды I был передан список с Базами Данных
/O: - следующая за параметром строка интерпретируется, как имя выходного текст.файла, куда будет направлен список считанных Пользователей базы данных, указанной в паметрах /I: и /R:
/С: - команды (пока что понимает только одну команду) :
Close - после выполнения вышеуказанных действий, закрыть программу.
1) Прочитать список Баз данных из файла : C:\ListDB1.txt и установить курсор на строку N 2. Список Пользователей вывести в файл C:\ListUsers.txt. Закрыть программу.
/I:C:\ListDB1.txt / R:2 /O:C:\ListUsers.txt /C:Close
2) Прочитать список Пользователей для Базы Данных : \\server1\1c\1cv77\kpx.sql\. Список пользователей вывести в файл "C:\321\List Users for this bases.txt". Закрыть программу.
/I:\\server1\1c\1cv77\kpx.sql\ /O:"C:\321\List Users for this bases.txt" /C:Close
Версия 1.03 от 17.12.2003
Дополнительно к версии 1.02
1) Программа умеет оповещать, когда список активных Пользователей пуст или содержит не менее указанного кол-ва Пользователей или есть комп. с заданным именем.
/I:D:\ListDB1.txt /M:USER-1:D:\Mess.txt /C:Close
Версия 1.04
Дополнительно к версии 1.03
ВНИМАНИЕ! На действие команды /М: это не влияет
Версия 1.05
Дополнительно к версии 1.04
Теперь, собственно, исходники.
Сначала небольшой кусочек кода, как это делается :
.
Var
NUser : integer; //Номер Пользователя
FFileHandle : THandle;
cFN : array[0..255] of Char;
NUser:=1; //Номер Пользователя
//NameLinskTMP-полное имя файла Links.tmp
//(в подкаталоге SYSLOG)
StrPCopy(cFN,NameLinskTMP);
FFileHandle:= CreateFile (cFN,
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ OR FILE_SHARE_WRITE,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if not ( LockFile (FFileHandle, $1E8481 + NUser , 0, 1, 0)) then begin
ShowMessage(IntToStr( NUser )+' Пользователь активен');
end
else begin
UnLockFile (FFileHandle, $1E8481 + NUser , 0, 1, 0);
ShowMessage(IntToStr( NUser )+' Пользователь НЕактивен');
end;
Исходники программы GetUsers1C, Delphi-5 (скачать, 130 кб). Тексты можно использовать по своему усмотрению (но только freeware ).
Все здорово но что это за интерфейс IV81COMConnector? Как мне его подключить? Откуда взять?
И еще вопрос. Попробовал реализовать через V8.Application (Automation). Автор пишет что проблема с русскими именами пропала. А у меня както она на месте. Все теже "Метод Справочники не поддерживается объектом автоматизации". Что я делаю не так? Где чего не подключил-включил?
Работаю на Delphi2005+1C v8.1 (v8.0 таже проблема)
Заранее благодарен за любую полезную информацию на эту тему. А то с 8 всего 3 дня как познакомились в отличии от 7. И отношения никак не наладятся ;)
Дай ссылку на тему, где я написал, что проблема решена. Не могу сам найтиУ меня такое подозрение что в Delphi2005 что-то с OLE изменили. Работают только английские аналоги методов 1C да и то не все а через 1. ж(
Кураж - Спасибо. Это я уже читал. Про Эмуляцию EvalExpr там хорошо написано. Но вот с остальным. Беда в том что я пока вобще не могу так настроить соединение с 1С чтобы мог использовать конструкции языка на русском. ж(
shachneff - А ты не мог бы поделится каркасом приложения? Интересует как ты до интерфейса IV81COMConnector достучался. Может быть у меня в этом проблема?
shachneff - буду признателен за помошь. Срок исполнения как всегда вчера, но я пока всеравно ковыряюсь безуспешно, так что буду ждать. Если озарение прийдет раньше отпишусь.
А может быть кто нибудь скажет, что лучше Delphi или Visual Studio?
1C советует все делать на Visual Studio, а я в институте Delphi изучал. Он мне понятнее. В чем между ними разница с точки зрения создания Web приложений для 1С?
Вот мой код, который был в примере, но поправленный под 8.1.
Обрати внимание на 2 последних модуля в секции uses.
Так же необходимо импортировать в проект модуль V81_TLB (Project - Import Type Library. Встать на "1CV81 COM Connector". Нажать Create Unit. Для того, чтобы это получилось, на компе должна быть установлена 1С 8.1
Hadgehogs- соединится получается. Соединение есть. А вот конструкции типа s1C8_ole.Справочники выдают ошибку. Вот что конкретно не работает.
shachneff- Вот ведь. Project - Import Type Library нету такого пункта в Delphi2005 ж(
Так. Новые сведения с полей.
Вобщем как подключить V81_TLB в Delphi2005 разобрался. Новый Com Object Delphi 32 и там в качестве родителя выбираем IV8COMConnector.
Теперь беда другая.
Method 'P P C oPг'PoPSPSC<P ' not supported by automation object.
Такое впечатление что русские наименования после компиляции не подходят под кодировку с которой работает 1С. Есть соображения на этот счет?
(16) Плюс я натравил Дельфю на типовую Управление Торговлей. У тебя таких метаданных может не быть!.
shachneff метаданные точно есть. Типовая Бухгалтерия.
В отладчике пишет
Project SDIAPP.exe raised exception class EOleError with message 'Method 'Meтaдaнныe' not supported by
automation object'.
А вот в рантайме выводит
shachneff метаданные точно есть. Типовая Бухгалтерия.
В отладчике пишет
Project SDIAPP.exe raised exception class EOleError with message 'Method 'Meтaдaнныe' not supported by
automation object'.
А вот в рантайме выводит
Method 'P P C oPг'PoPSPSC<P ' not supported by automation object.
Если меняю Meтaдaнныe на синони Metadata то пишет тоже самое но для Справочники
Если их меняю на Catalogs то ругается на Банки и т.д.
Нашол в настройках проекта пункт code page. Может с ним поиграться?
Ну поиграйся с преобразованием строки в кодировку UTF-8, а затем эту строку выполни.
Вроде как 1С работает с кодировкой UTF-8 Я прав? А числовое представление этой кодировки что-то найти не могу. В code page можно только числовое значение ввести.
shachneff ж) Опередил.
ShowMessage(MainObject.Метаданные.Справочники.Банки.Комментарий);
Задать в UTF-8 ? этож посути команда. блин.. что-то я туплю ж(
стабильно работает только запуск через командную строку
БиньковскийВиталий- ;) Если бы все было так просто ж) Это не решение.
Балабес - это к чему?
Числовое представление нашол 65001. Поменял. Не помогло. Поменял кодировку у pas. Не помогло. Не представляю куда теперь двигаться дальше. Срочно нужна помошь ж)
(28) Специально ради тебя дома скачаю Дельфю 2005 и покажу, как решить твою проблему. Решу виртуально, поэтому стребую виртуальное пиво.
shachneff - не вопрос ж) Я даже реального согласен поставить с доставкой ж)
Ситуация у тя сложная, если верно(22), в 2005 текст юникоде. Есть сложный путь, как то делал. Нужно подменить делфевый механизм диспетчеризации типа Variant. у меня в результате было примерно так (коммент из реализации) (не пинайте, писалось хрен знает когда)
<
всегда необходим по крайней мене для опознавания типа искомого значения.
последний из них может не заканчиваться '\'.
передаваемые параметры могут иметь тип Variant, но тогда должны быть
инициализированны(иметь тип), иначе будет сгенерированно исключение.
for i := 0 to HeaderSections.Count - 1 do
>
никто не говорил что реализация тривиална.
когда вы обращаетесь к полям вариантной переменной, делфи вызывает функцию диспетчеризации. в вашем случае - MainObject.Метаданные. при старте её адрес лежит в VarDispProc. я её подменяю при инициализации модуля:
Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.
1C + Delphi 5: Простой пример подключения к Базе Данных 1C
(через OLE; в данном случае рассматривается подключение к "1C-предприятие версии 7.7")
Создадим простое приложение, которое считывает список из справочника "ФизическиеЛица".
Пример (в формате MS Word) можно скачать здесь (792 Кб)
Шаг N 1. (скачать, 177 Кб)
Создадим проект с именем Project1
Положим на форму 2-а компонента типа TPanel (у Panel1 свойство Align установим равным AlTop, а у Panel2 - AlClient)
На Panel1 положим кнопку Button1 (TButton) и установим свойство Caption = "Соединить"
Положим на Panel1 еще 4 компонента :
Label1, Edit1, Label2, Edit2
Установим :
- свойство Caption :
Label1.Caption - "Имя 1C-сервера Строка инициализации V77.Application"
Edit2.Text - "/DF:\1CV77\ATCDEMO"
Должно получиться что-то вроде этого:
Некоторые пояснения.
Edit1.Text содержит имя 1C, как OLE - сервера автоматизации.
В нашем случае мы указали : V77.Application
Возможные значения (согласно документации по 1C) :
- V1СEnterprise.Application - версия независимый ключ;
- V77.Application - версия зависимый ключ;
- V77S.Application - версия зависимый ключ, SQL версия;
- V77L.Application - версия зависимый ключ, локальная версия;
- V77M.Application - версия зависимый ключ, сетевая версия.
Edit2.Text содержит строку инициализации 1C
В нашем случае мы указали : /D F:\1CV77\ATCDEMO
Т.е., указали только местонахождение Базы Данных, к которой желаем подключиться
(в этом примере : указан каталог F:\1CV77\ATCDEMO)
Возможные значения ключей (согласно документации по 1C) :
/D - Имя каталога (папки), где располагается База Данных
/N - Имя Пользователя
/P - Пароль доступа
Пример : /DC:\1CV77\ATCDEMO /NАдмин /P123
В исходном тексте программы добавим следующее (выделено жирным красным цветом) :
uses
ComObj,
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
< Private declarations >
Ole1C : OleVariant;
public
< Public declarations >
end;
Переменная Ole1C (типа OleVariant) будет использована в дальнейшем, как указатель на объект 1C (OLE - сервер автоматизации).
Сделаем двойной щелчок по компоненту Button1 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button1Click(Sender: TObject);
Var
ResOpen : integer;
begin
Ole1C := CreateOleObject(Edit1.Text);
ResOpen:=Ole1C.Initialize(Ole1C.RMTrade, Edit2.Text, '');
end;
Строка :
Ole1C := CreateOleObject(Edit1.Text);
собственно, "запускает" программу 1C, как OLE - сервер автоматизации (имя указано в Edit1.Text)
Строка :
ResOpen:=Ole1C.Initialize(Ole1C.RMTrade, Edit2.Text, '');
инициализирует 1C, согласно нашим "указаниям" (Edit2.Text)
Более подробно можно почитать соотв. документацию по 1C
Откомпилируем и запустим приложение Project1.exe
Нажмите на кнопку " Соединить ".
Если все указано корректно (содержание Edit1.Text и Edit2.Text ),
программа 1C должна запуститься (как OLE сервер автоматизации).
Если в строке инициализации НЕ указаны имя пользователя и(или) пароль доступа, то следует запрос :
Если не корректно указан каталог Базы Данных, то следует запрос :
После загрузки и инициализации программы 1C, ссылка на 1C хранится в переменной Ole1C.
Следует помнить, что программа 1С:Предприятие (как и все создаваемые объекты OLE Automation), выступающая в качестве объекта OLE Automation в другой программе, будет находиться в памяти компьютера до удаления или изменения значения переменной, содержащей ее в качестве объекта.
Именно поэтому, мы вынесли объявление переменной Ole1C "за пределы" обработчика : TForm1.Button1Click
Явных (видимых) признаков того, что мы запустили 1C - нет.
Для того, что убедиться в этом, нужно запустить диспетчер задач (по комбинации Ctrl+Alt+Del).
В списке задач можно увидеть :
Следует отметить, что после того, как Project1.exe будет закрыт - автоматически выгрузится из памяти и 1C.
Шаг N 2. (скачать, 180Кб)
Продолжим наш проект.
На Panel2 положим компонент ListBox1 (TListBox). Свойство Align установим равным AlClient.
Рядом с кнопкой Button1 ("Соединить") положим на Panel1 кнопку Button2 (установим свойство Caption = ФизЛица)
Получится что-то вроде этого :
В исходном тексте программы добавим описание переменной OleFizLica
private
< Private declarations >
Ole1C : OleVariant;
OleFizLica : OleVariant;
public
< Public declarations >
end;
Сделаем двойной щелчок по компоненту Button2 и изменим стандартный обработчик события - нажатие на кнопку - следующим образом :
procedure TForm1.Button2Click(Sender: TObject);
begin
OleFizLica := Unassigned;
if not VarIsEmpty(Ole1C) then begin
OleFizLica:=Ole1C.CreateObject('Справочник.ФизическиеЛица');
end;
end;
Строка :
OleFizLica := Unassigned;
Здесь "обнуляется" значение переменной OleFizLica.
Тем самым, если ранее был создан какой-либо OLE-объект, на который ссылалась эта переменная, он будет уничтожен.
Строка :
if not VarIsEmpty(Ole1C) then begin
Здесь проверяется, чтобы значение переменной Ole1C не было "пустым".
Т.е., если Ole1C имеет "не пустое" значение, то это значит (в контексте нашего проекта), что программа 1C запущена и связь с ней установлена.
Строка :
OleFizLica:=Ole1C.CreateObject('Справочник.ФизическиеЛица');
Здесь создается объект, который ссылается на справочник "ФизическиеЛица".
Если такой справочник существует, то в дальнейшем, переменная OleFizLica будет содержать ссылку на него.
Шаг N 3. (скачать, 184 Кб)
Сделаем двойной щелчок по компоненту Button2 и еще раз изменим обработчик события нажатия на кнопку следующим образом :
Строки N 3,4,5,6 теперь понятны.
Строка N 7 :
if not VarIsEmpty(OleFizLica) then begin
Здесь проверяется, что объект, ссылающийся на справочник "ФизическиеЛица" действительно создан.
Строки N 8..13
Здесь реализован стандартный алгоритм на языке 1C по перебору элементов справочника.
Строка N 11
ListBox1.Items.Add(OleFizLica.Код+' '+OleFizLica.Наименование);
Здесь продемонстрирован один из вариантов обращения к реквизитам справочника по именам.
Строка N 16
OleFizLica := Unassigned;
Здесь "обнуляется" значение переменной OleFizLica.
Тем самым, мы уничтожаем созданный нами объект, чтобы зря не занимать ресурсы.
Следует отметить, что поскольку (в нашем случае) мы используем переменную OleFizLica только в "пределах" обработчика
procedure TForm1.Button2Click(Sender: TObject), то мы могли бы и объявить эту переменную в этом обработчике.
Откомпилируем и запустим приложение Project1.exe
Нажмите на кнопку " Соединить ". После того, как загрузится программа 1C, нажмите на кнопку " ФизЛица ".
Если все указано корректно , то в ListBox1 будет содержание справочника "ФизическиеЛица".
Т.е., будет что-то вроде этого :
Интеграция csv в Delphi
Здравствуйте, у меня такая проблема, есть большой csv файл, нужно из него каким то образом.
Интеграция программы на Delphi в сайт
Всем привет! Интересуюсь интеграцией собственноручно написанной программы в сайт, вот по этому.
Интеграция формы access в Delphi
Весь инет облазил, ничего не нашел. Какой компонент лучше использовать для вывода формы в делфи? И.
Интеграция новостей с dle в delphi
Помогите как сделать интеграцию новостей через базу данных mysql в delphi
А у вас прав хватает на получение этого списка?
Добавлено через 1 минуту
И потом, почему-бы не посмотреть, что вы получаете в sel_res?
Добавлено через 1 минуту
кстати ошибка такая: Method 'Имя' not supported by automation object
ну это надо в 1с смотреть как оно хранится, а в делфи использовать запросы из 1с
это как код vba запускать из офиса - сначала делаешь макрос в экселе\ворде, потом его переносишь в делфи
попробовал вывести список пользователей, все работает,а вот как из массива users вывести имена пользователей я что то не могу понять.
users[0] не катит, ругается.
Добавлено через 9 минут
Для Каждого ЭлементМассива Из Выборка Цикл Как именно ругается? А users[0].Имя или users[1].Имя тоже ошибку порождают и какую?
users[0].Имя и users[1].Имя , и то и то выдают ошибку "Invalid argument"
Добавлено через 48 секунд
Общее кол-во пользователей 3
users.Количество показывает все верно
сразу хочу предупредить - пишу код, найденный поиском, очень вероятно, что это бред и работать не будет.
Но попробовать можно.
Method "Выбрать" not supported by automation object
Добавлено через 1 минуту
users это массив, и из этого массива мне надо как нить все вытащить
?!
это точно не массив.
но как решить вашу задачу я не знаю..
Method "ПолучитьЭлемент" not supported by automation objectРешил, точнее нашел решение=) тут
надо было вот так:
Всем спасибо за помощь.
Что лучше брать Delphi XE2, Delphi XE, Delphi 7?
Привет форумчане! У меня вопрос: что лучше брать Delphi XE2, Delphi XE, Delphi 7? Как вообще.
Интеграция с 1С
Всем привет! суть моей проблемы: 1С не может выгрузить данные каталога на сайт магазин. из-за.
Интеграция
Пишу диплом. Не могу разобраться со связью приложений. Мне необходимо создать кнопку, при нажатии.
1с интеграция
Всем снова здравствуйте.. Подскажите пожалуйста, есть ли где-нибудь статья, или мануал, где.
Интеграция БД
Здравствуйте все. У меня очень простой вопрос направленный на соискание опытного подтверждения.
Читайте также: