Имя: Пароль:
1C
 
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

Там советуется делать так:

 OleFizLica := Unassigned; //16
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С, доводим до "закрыть - сведения" путем открытия любого журнала документов
 - переиндексация баз ...