![]() |
![]() |
![]() |
|
Запросы из 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
|
Кстати можешь использовать Диспинтерфейсы. И синтаксический контроль и правильные вызовы.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |