![]() |
![]() |
![]() |
|
Delphi+Ole+1C | ☑ | ||
---|---|---|---|---|
0
xMailer
12.07.07
✎
17:33
|
Есль приложение написанное на delphi, необходимо формировать документ в 1С из данного приложения. Вариант организации взаимодействия:
- создание 1C ole из приложения, ...Initialize... - вызов из приложения ole1C.ОткрытьФорму('Отчет',параметры проверки,'Проверки.ert'); - в результате проверок 'Проверки.ert' возврат в delphi результата проверок и в некоторый момент необходимо визуализировать пользователю 1С форму для заполнения тех или иных параметров (например: посылаем в параметрах для 'Проверки.ert' название контрагента, которого и проверяем на предмет его наличия в справочнике, если контрагент не найден переходим в 1С и открываем форму ввода нового контрагента) -повторный вызов 'Проверки.ert, возврат все ОК -формируем документ 1С со всеми необходимыми параметрами Вопрос заключается в следующем: когда приисходит визуализация 1С и какие либо работы в 1С по окончании пользователь может просто завершить работу 1С, причем в процессах будет по прежднему висеть 1cv7, т.к. инициализирован был как Ole основным Delphi приложением, и закончит работу такой объект только с окончанием работы Delphi приложения. Но работает такой остаточный Ole объект крайне неустойчиво, ряд операций проходит без ошибок, а например при обращении к документам "Ошибка на сервере". Методом исключений из Delphi пока не получилось отловить невалидность такого 1С Ole. Как определить невалидность 1С Ole? |
|||
1
ШтушаКутуша
12.07.07
✎
17:37
|
дааа
|
|||
2
romix
модератор
12.07.07
✎
17:38
|
Зацени статью
http://www.delphiplus.org/articles/delphi/1c/2/index.html Там советуется делать так: |
|||
3
ado
12.07.07
✎
17:39
|
Лучше программно нового контрагента заводи, если он не найден.
|
|||
4
xMailer
12.07.07
✎
17:46
|
OleFizLica:=Unassigned - уничтожение созданного объекта. Разговор идет об Ole экземпляре самой 1С. Вариант: При загрузке программы (при первой надобности) происходит создание Ole объекта 1С, затем я лишь использую созданный объект. Ole1C:=Unassigned приведет к завершения работы 1С, и в следующий раз я вынужден буду заново инициальзировать 1С Ole, вместо того чтобы единожды создав в сеансе работы с delphi приложением потом лишь пользовать.
|
|||
5
romix
модератор
12.07.07
✎
17:50
|
(4) Как вариант, можно не через оле, а через текстовички
Книга знаний: Отслеживание изменений в файловой системе и программирование потоков (threads) По ссылке лежит компонента. Приход текстовичка в указанную папку приводит к генерации события, и в обработчике события можно цеплять этот текстовичок. Или лучше XML. |
|||
6
xMailer
12.07.07
✎
18:05
|
может не совсем правильно изложил суть. Вариант передачи данных из delphi приложения в 1С через Ole1C.ОткрытьФорму('Отчет', param, 'Файл.ert') где param = СписокЗначений в котором все необходимое для формирования 1С документа работает на ура, и не требует вмешательства в 1С конфигурацию.
Файл.ert Процедура ПриОткрытии() Форма.Параметр...; СтатусВозврата(0); КонецПроцедуры Вопрос лишь в том чтобы проверить нужна ли переинициализация ole1C, VarIsEmpty(ole1C) говорит о том что все в порядке можно работать, но фактически ole1C уже может быть не рабочим (пользователь закрыл визуализированную 1С, снес процесс через диспетчер задач, ...) |
|||
7
xMailer
12.07.07
✎
18:12
|
кстати:
- Initialize(...); появился скрытый процесс 1cv7 - покажем 1С hW1C:=GetHandleThisWindow('1С:Предприятие',1,TRUE,TRUE); if hW1C<=32 then MessageDlg('Главное окно приложения 1С не найдено !', mtError, [mbOk], 0); if hW1C>32 then ShowWindow(hW1C,SW_SHOW); - полноценно работаем в 1С - закрывем 1С - покажем 1С снова и она покажется hW1C:=GetHandleThisWindow('1С:Предприятие',1,TRUE,TRUE); if hW1C<=32 then MessageDlg('Главное окно приложения 1С не найдено !', mtError, [mbOk], 0); if hW1C>32 then ShowWindow(hW1C,SW_SHOW); - не полноценно работаем в 1С, доводим до "закрыть - сведения" путем открытия любого журнала документов - переиндексация баз ... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |