Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 8 общая

Запросы из Delphi к 1С

Запросы из Delphi к 1С
Я
   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));
тоже самое.
 
 
   H A D G E H O G s
 
1 - 25.12.12 - 11:52
Ниче не понял
   1C-band
 
2 - 25.12.12 - 11:52
(0) Потому, что &ВыбСотрудник понимается как внутренняя ссылка 1С. Используй примитивные типы: Код, Табельный номер и т. д..
   H A D G E H O G s
 
3 - 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())));
   H A D G E H O G s
 
4 - 25.12.12 - 11:54
И копрозапрос

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

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

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

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

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

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

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


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

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

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

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

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

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

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует