Имя: Пароль:
1C
1С v8
Запросы из Delphi к 1С
0 NickM73
 
25.12.12
11:50
Приспичило связать программку c 1C8 через dll написанную на Delphi, связь dll с 1С через Com, это все сделал, но всплыла такая проблема, что как получить результаты запроса и передача параметров в запрос.
Пример
...
 Var
   objsel, TabRez : Variant;
    objsel := v8obj.NewObject('Запрос');
    objsel.УстановитьПараметр('НомерКарты',CardNo);
    objsel.Текст := 'ВЫБРАТЬ Сотрудники.Ссылка Как Сотрудник ИЗ Справочник.Сотрудники КАК Сотрудники ГДЕ Сотрудники.Карты.НомерКарты = &НомерКарты';
    TabRez := objsel.Выполнить().Выгрузить();
а как добраться до результата запроса?
и продолжение, теперь как полученную ссылку из запроса вставить в другой запрос?
   objsel1 := v8obj.NewObject('Запрос');

    objsel1.Текст := 'ВЫБРАТЬ ... ГДЕ ОстаткиИОбороты.Сотрудник.Ссылка = &ВыбСотрудник ' ;
    DecodeDate(Date(), Year, Month, Day);
   objsel1.УстановитьПараметр('ВыбСотрудник', Stuff);
       objsel1.УстановитьПараметр('НачалоПериода',DateToStr(EndOfAMonth(Year, Month)));
       objsel1.УстановитьПараметр('КонецПериода',DateToStr( StartOfTheMonth(Date())));

Здесь ругается На неверные параметры операции сравнения..., пытался сделать objsel1.УстановитьПараметр('ВыбСотрудник', IDispatch(Stuff));
тоже самое.
1 H A D G E H O G s
 
25.12.12
11:52
Ниче не понял
2 1C-band
 
25.12.12
11:52
(0) Потому, что &ВыбСотрудник понимается как внутренняя ссылка 1С. Используй примитивные типы: Код, Табельный номер и т. д..
3 H A D G E H O G s
 
25.12.12
11:53
queryRes:=objsel.Выполнить().Выбрать();
if queryRes.Следующий()=true Then begin
objsel1 := v8obj.NewObject('Запрос');

    objsel1.Текст := 'ВЫБРАТЬ ... ГДЕ ОстаткиИОбороты.Сотрудник.Ссылка = &ВыбСотрудник ' ;
    DecodeDate(Date(), Year, Month, Day);
   objsel1.УстановитьПараметр('ВыбСотрудник', queryRes.Сотрудник);
       objsel1.УстановитьПараметр('НачалоПериода',DateToStr(EndOfAMonth(Year, Month)));
       objsel1.УстановитьПараметр('КонецПериода',DateToStr( StartOfTheMonth(Date())));
4 H A D G E H O G s
 
25.12.12
11:54
И копрозапрос

ГДЕ ОстаткиИОбороты.Сотрудник.Ссылка = &ВыбСотрудник

поправь
5 NickM73
 
25.12.12
13:44
(2)А какая была красивая задумка получаешь ссылку и с ней работаешь как в 1С:(

Поправил запрос чтоб возвращал наименование сотрудника
objsel.Текст := 'ВЫБРАТЬ Сотрудники.Наименование ИЗ Справочник.Сотрудники КАК Сотрудники ГДЕ Сотрудники.Карты.НомерКарты = &НомерКарты';
queryRes := objsel.Выполнить().Выгрузить();
ShowMessage(queryRes.Наименование);
но выдается ошибка Method 'Наименование' not supported by automation object видимо чтото еще надо
6 H A D G E H O G s
 
25.12.12
13:46
(5)
"А какая была красивая задумка получаешь ссылку и с ней работаешь как в 1С:

Задумка глупа, но работоспособна.

Глупа она по причине медлительности COM
7 H A D G E H O G s
 
25.12.12
13:46
queryRes - это ТЗ

Какое наименование ты хочешь у него получить?
8 H A D G E H O G s
 
25.12.12
13:47
queryRes := objsel.Выполнить().ВЫБРАТЬ();
if queryRes.Следующий()=true then
ShowMessage(queryRes.Наименование);
9 Reset
 
25.12.12
13:47
(5) Даже мне, тупому одинеснику, ясно, что у таблицы значений нет свойства Наименование
10 samozvanec
 
25.12.12
13:50
написать все в 1ске и метод дергать не предлагать?
11 Serginio1
 
25.12.12
13:55
Вообще проще например создать внешний отчет или обработку, а уж её дергать с клиента
например
v8: Можно ли по OLE выполнять запросы из 1с 7.7 в 1с 8.2

преимущество отладка, гибкость, скорость
12 NickM73
 
25.12.12
14:30
(8) Спасибо помогло, краткость сестра таланта.


Помоему будет перебор, программа дергает dll из нее внешнюю обработку, а она уже работает с 1С. Слишком много звеньев :(

(6) База не велика (1 справочник, 1 документ и 3 регистра) + комп только для нее, тормозить особо не должна, но посмотрим на быстродействие, как разверну тестовую систему. Если будет тормозить прийдется переходить на внешние обработки.
13 Serginio1
 
25.12.12
14:35
(12) Ты хотя бы отладь для начала в 1С, а потом код переноси на Delphi.
А так и получается пока все отладишь,то уже и незачем переносить, так как проще код обработки запустить.
14 NickM73
 
29.12.12
12:01
(6)  Задумка глупа, но работоспособна.
Работает довольно шустро
(13) в 1С уже написал и работает, но в Com есть подводные камни, забавные до ужаса

Осталось последнее создать документ, но там нужна ссылка пытаюсь сделать так

docDinner := v8obj.Документы.Обед.СоздатьДокумент();
docDinner.Дата := Date();
docDinner.Сотрудник := obj.Справочники.Сотрудники.НайтиПоРеквизиту('ТабНомер', 22035484);
docDinner.Сумма := 100500;
docDinner.Записать(v8obj.РежимЗаписиДокумента.Проведение);

Документ создается, но поле Сотрудник пусто :(, ссылка не пустая.
Как обмануть систему?
15 hhhh
 
29.12.12
12:17
а табНОмер - это число должно быть разве? Тип поля какой у ТабНомер?
16 hhhh
 
29.12.12
12:21
(14) надо как-то так

docDinner.Сотрудник := obj.Справочники.Сотрудники.НайтиПоРеквизиту('ТабНомер', 22035484);
if docDinner.Сотрудник.Пустая() then
 ShowMessage('Не найден сотрудник с табельным номером ' + 22035484);
17 NickM73
 
29.12.12
12:33
(16) Тип число, сообщений никаких не выдает :(, 1с возвращает ссылку, но delphi как-то странно работает с ней. По совету (0) использовал примитивные типы, но вот здесь нужна именно ссылка.
18 hhhh
 
29.12.12
12:45
(17) сделайте табномер строку. Кому в голову у вас там пришла такая мысль про число? Зачем неприятности на свою задницу искать?
19 NickM73
 
29.12.12
13:02
(18) Даже если это строка, не работает.
20 Serginio1
 
29.12.12
14:18
Проверь внешним отчетом.
В свое время в семерке все параметры из Delphi передавались по ссылке.
Выход был типа ''+str.
Или используя процедуру с параметрами const.
21 NickM73
 
29.12.12
15:21
(20)А можно по подробнее Выход был типа ''+str., плиз

В обработке все нормально находится и пишется.
22 Serginio1
 
29.12.12
15:35
Все параметры Delphi передает по ссылке, для того, что бы передавало по значению нужно либо через процедуры с параметрами типа const, либо как выражение 1+1, или ''+строковая_переменная
23 NickM73
 
29.12.12
15:59
(22) те чтобы передать в docDinner.Сотрудник := СсылкаСотрудник;
мне надо сделать так docDinner.Сотрудник := ''+строковая_переменная я правильно понял?
но я не могу вытащить из
строковая_переменная := obj.Справочники.Сотрудники.НайтиПоРеквизиту('ТабНомер', '22035484');
тк это Dispatch и всю голову сломал как оттуда вытащить данные
24 NickM73
 
29.12.12
16:40
Все тема закрыта, оказывается писал не в ту базу, пора идти есть мандаринки и пить горькую.

А помогло вот что

 var
    docDinner, nn: Variant;
....
 nn := v8obj.Справочники.Сотрудники; --- чистое шаманство
 docDinner := v8obj.Документы.Обед.СоздатьДокумент();
 docDinner.Дата := Date();
 docDinner.Сотрудник := nn.НайтиПоРеквизиту('ТабНомер', '22035484');
 docDinner.Сумма := 53;
 docDinner.Записать(v8obj.РежимЗаписиДокумента.Проведение);

Всех с Новым Годом!
25 Serginio1
 
09.01.13
10:54
Кстати можешь использовать Диспинтерфейсы. И синтаксический контроль и правильные вызовы.