Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 14:07

Как получить параметры из запроса.

Автор vdn, 30 сен 2010, 17:00

0 Пользователей и 1 гость просматривают эту тему.

vdn

Здравствуйте!

Необходимо получить параметры из текста запроса.
Запрос.НайтиПараметры  дает список параметров. Как потом оттуда вытащить имя параметра и его тип? Запрос.НайтиПараметры.ИмяПараметра не работает, метод Получить тоже.

Пишется модуль на Делфи, подключаюсь с помощью COM, простые запросы работают(правда что-то долго, буду переделывать), не могу с параметрами сделать.

Анализ текста запроса не подходит(поиск &ИмяПараметра), т.к. в последствии может поменяться синтаксис запросов в 1С.

Помогите пожалуйста.

mohock

А где формируется текст запроса? Если на Делфи, то порви его и засунь параметры, какие надо. А вобще конкретней опиши, что делаешь.

vdn

Запрос либо ручками пишется, либо вставляется как текст.
Например: ВЫБРАТЬ Банки.Наименование, Банки.Город, Банки.Адрес ИЗ Справочник.Банки КАК Банки ГДЕ Банки.Город = &Город

Дальше запрос отправляется в 1С там обрабатывается, возвращается результат запроса, и результаты уже выводятся в другом приложении.

Необходимо перед выполнением запроса найти все параметры в запросе вывести их тип и предложить подставить в них значения. Это только начало, дальше все это будет дорабатываться. Но функция поиска всех параметров в запросе необходима.

Рвать не получится, желательно использовать команды 1С т.к. синтаксис запроса в 1С может поменяться он же вроде не утвержден.

mohock

Из текста запроса на выборку из другого приложения ты не получишь типы данных. Ибо это запрос на выборку и в этом случае предполагается, что тип данных известен просителю.  :D Это касается всех видов реляционных БД. Для выяснения структуры БД и типов данных таблиц следует оперировать другим языком запросов - запросами по структуре. В любом языке запросов к любой БД язык делится на две части. Одна занимеестя данными, а другая структурой. В 1С это зовется таинственным словом - метаданные. Так вот текстового языка запросов по работе с метаданными (структурой) в 1С нет.  :fdbsdfbsd: Но к метаданным можно достучаться. В 1С это делается средствами языка 1С. Если надо получить структуру БД 1С извне, то следует использовать, что-то вроде ADO.
В общем для твоего проекта, следует структуру 1С ч/з ADO сохранить в БД с которой работает твое Делфи - приложение. А потом соорудить мастер запросов для 1С, в котором пользователь не пишет ручками, а выбирает из сохраненной структуры.

vdn

Чет тогда я не пойму...

Есть такой тип в 1С:
ОписаниеПараметраЗапроса (QueryParameterDescription)
Свойства:
Имя (Name)
ТипЗначения (ValueType)

Описание:
Содержит описание параметра запроса.
Сериализуется.

У него есть имя и тип значения. Мне вот это и надо, то что со структурой БД в 1С через АДО работать это тоже понятно.

По идеи же в 1С есть Запрос.НайтиПараметры - эта функция работает, видно по количеству и если осуществить поиск по названию параметра тоже все проходит. Да вот только в том и проблема что имен параметров я могу не знать.

Если разбирать текст запроса, то он не стандартизован и неизвестно что с ним будет дальше. Хотя я тоже другого выхода не вижу. На данный момент необходимо отправлять запросы к 1С и вырывать из запросов параметры.

vdn

Сейчас пишется класс который обрабатывает запросы к 1С. Работать должен примерно так:
Получил запрос - Обработал - Вывел список параметров и тип(можно как строку все равно в тексте запроса это будет строка) - получил значения параметров - подставил значения в запрос - отправил 1С - получил ответ. Все

mohock

Цитата: vdn от 30 сен 2010, 18:19
Чет тогда я не пойму...

ОписаниеПараметраЗапроса (QueryParameterDescription)


Ага  :D Так вот эта штука работает, когда у тебя есть объект в оперативке из 1С под названием Запрос.
Т.е. этот объект должен быть создан в 1С. А у тебя, как я понимаю все иначе...  :D

vdn

Ole1C := CreateOleObject(Edit1.Text);
Resopen := Ole1C.Connect(Edit2.Text);
Ole1C.visible := true;
query := Ole1C.NewObject('Запрос');
vv := query.FindParameters;
ShowMessage(vv.Count) показывает число равное количеству параметров.
Если сделать так:
vv1 := vv.find('параметр1');
то
ShowMessage(vv1.name); выдает параметр1

У меня вот так  :mellow:

mohock

Цитата: vdn от 30 сен 2010, 18:27
Сейчас пишется класс который обрабатывает запросы к 1С. Работать должен примерно так:
Получил запрос - Обработал - Вывел список параметров и тип(можно как строку все равно в тексте запроса это будет строка) - получил значения параметров - подставил значения в запрос - отправил 1С - получил ответ. Все

Ну вот ты сам и пишешь. "Получил запрос". Получил от кого - от создателя! А создатель и определяет типы данных. Если средствами ADO создаешь объект в 1С - Запрос. То и параметры с типами прийдется создавать. А из голого текста запроса, без стравнения со структурой и подавно не получишь типы данных.

mohock

Цитата: vdn от 30 сен 2010, 18:36
Ole1C := CreateOleObject(Edit1.Text);
Resopen := Ole1C.Connect(Edit2.Text);
Ole1C.visible := true;
query := Ole1C.NewObject('Запрос');
vv := query.FindParameters;
ShowMessage(vv.Count) показывает число равное количеству параметров.
Если сделать так:
vv1 := vv.find('параметр1');
то
ShowMessage(vv1.name); выдает параметр1

У меня вот так  :mellow:


Ключевая фраза - query := Ole1C.NewObject('Запрос');
Ты создал объект.
vv := query.FindParameters; - эта штука в тексте смотрит значки &Параметр
Т.о. ты получаешь количество параметров.
Однако создав объект ты не задал значения параметров.
Поэтому их тип не известен.
НЕТУ ТУТ ТИПОВ ПАРАМЕТРОВ
В конце концов ты можешь ошибочно задать не тот параметр и во
время выполнения запроса получишь ошибку...

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск