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

Проблема с запросом

Автор JOG, 15 ноя 2014, 17:36

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

JOG

Подскажите пожалуйста как организовать запрос для получения нескольких реквизитов. Суть в следующем:

&НаСервере
Функция ПолучитьСуммуОценкиНаСервере(НомерЗБ)
СОЗапрос = Новый Запрос;
СОЗапрос.Текст =
"ВЫБРАТЬ
| НомерЗБ.СуммаОценки
|ИЗ
| Справочник.НомерЗБ КАК НомерЗБ
|ГДЕ
| НомерЗБ.Ссылка = &Ссылка";
СОЗапрос.Установитьпараметр("Ссылка",НомерЗБ);
РезультатЗапроса = СОЗапрос.Выполнить().Выгрузить();
Возврат РезультатЗапроса[0].СуммаОценки;
КонецФункции

Помимо СуммыОценки нужно выцепть СуммуКредита. Ок. Но что нужно возвращать в итоге?

&НаСервере
Функция ПолучитьСуммуОценкиНаСервере(НомерЗБ)
СОЗапрос = Новый Запрос;
СОЗапрос.Текст =
"ВЫБРАТЬ
| НомерЗБ.СуммаОценки,
| НомерЗБ.СуммаКредита
|ИЗ
| Справочник.НомерЗБ КАК НомерЗБ
|ГДЕ
| НомерЗБ.Ссылка = &Ссылка";
СОЗапрос.Установитьпараметр("Ссылка",НомерЗБ);
РезультатЗапроса = СОЗапрос.Выполнить().Выгрузить();
Возврат РезультатЗапроса[0].СуммаОценки; /* как меняется запрос, чтобы не переписывать функции на получение каждого реквизита?*/
КонецФункции


sertak

РезультатЗапроса = СОЗапрос.Выполнить().Выгрузить();
Возврат РезультатЗапроса;

Вернется ТаблицаЗначений. Правда, если вы с клиента вызываете, надо протестить, корректно ли таблица передастся с сервера на клиента. Были затыки какие-то. Лучше в этом случае, наверное, преобразовать таблицу значений в массив структур. Если с сервера вызываете, то все будет нормально.

JOG

Цитата: sertak от 15 ноя 2014, 18:05
РезультатЗапроса = СОЗапрос.Выполнить().Выгрузить();
Возврат РезультатЗапроса;

Вернется ТаблицаЗначений. Правда, если вы с клиента вызываете, надо протестить, корректно ли таблица передастся с сервера на клиента. Были затыки какие-то. Лучше в этом случае, наверное, преобразовать таблицу значений в массив структур. Если с сервера вызываете, то все будет нормально.

а как же разграничить\вытащить из этой таблицы именно то, что мне нужно?
Для одного делал так:
&НаКлиенте
Процедура НомерЗБПриИзменении(Элемент)
ТекСтрока = Элементы.Билеты.ТекущиеДанные;
ТекСтрока.СуммаОценки = ПолучитьСуммуОценкиНаСервере(ТекСтрока.НомерЗБ);
КонецПроцедуры

а для двух как сделать если там таблица значений? может через цикл как то?

sertak

МояТЗ = ФункцияПолученияТЗ();
Если МояТЗ.Количество() > 0 Тогда
Перем1 = МояТЗ[0].Реквизит1;
Перем2 = МояТЗ[0].Реквизит2;
КонецЕсли
Добавлено: 15 ноя 2014, 19:12


Вообще наверное вместо ТЗ лучше использовать структуру.
Если вам нужная только первая строка запроса, тогда и загоняйте ее в структуру, и  возвращайте. Тогда и на клиент должно нормально передаться.
Добавлено: 15 ноя 2014, 19:22


Например:
    РеквизитыСправочника = Новый Структура;
    РеквизитыСправочника.Вставить("СуммаОценки",0);
    РеквизитыСправочника.Вставить("СуммаКредита",0);   
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующая() Тогда
        ЗаполнитьЗначенияСвойств(РеквизитыСправочника,Выборка);
    КонецЕсли;
    Возврат РеквизитыСправочника;
Добавлено: 15 ноя 2014, 19:23


ЦитироватьЕсли Выборка.Следующая() Тогда
Если Выборка.Следующий() Тогда

JOG

Спасибо! Буду пробовать
Добавлено: 16 ноя 2014, 09:27


Цитата: sertak от 15 ноя 2014, 19:10
МояТЗ = ФункцияПолученияТЗ();
Если МояТЗ.Количество() > 0 Тогда
Перем1 = МояТЗ[0].Реквизит1;
Перем2 = МояТЗ[0].Реквизит2;
КонецЕсли
Добавлено: 15 ноя 2014, 19:12


Вообще наверное вместо ТЗ лучше использовать структуру.
Если вам нужная только первая строка запроса, тогда и загоняйте ее в структуру, и  возвращайте. Тогда и на клиент должно нормально передаться.
Добавлено: 15 ноя 2014, 19:22


Например:
    РеквизитыСправочника = Новый Структура;
    РеквизитыСправочника.Вставить("СуммаОценки",0);
    РеквизитыСправочника.Вставить("СуммаКредита",0);   
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующая() Тогда
        ЗаполнитьЗначенияСвойств(РеквизитыСправочника,Выборка);
    КонецЕсли;
    Возврат РеквизитыСправочника;
Добавлено: 15 ноя 2014, 19:23


ЦитироватьЕсли Выборка.Следующая() Тогда
Если Выборка.Следующий() Тогда

Но мне нужна не первая строка запроса, в том то и дело.. Мне нужно каждый реквизит получить отдельно. Действительно, если использовать таблицу значений, компилятор начал ругаться на несоответствие типов или что-то вроде того.

В общем, пока что вышел из положения путём переписывания функций для каждого реквизита:(
Хотел просто сделать как-то покомпактнее.

Добавлено: 16 ноя 2014, 09:36


Стоп, я наверное чего-то не понял.. там же в запросе получается первой строкой должна вывестись и СуммаОценки и СуммаКредита?
как вызвать тогда в процедуре написанную функцию? для получения реквизитов?


&НаКлиенте
Процедура НомерЗБПриИзменении(Элемент)
ТекСтрока = Элементы.Билеты.ТекущиеДанные;
ТекСтрока.СуммаОценки = ПолучитьРеквизитыНаСервере(ТекСтрока.НомерЗБ);// тут как-то по другому надо описать запрос
ТекСтрока.СуммаКредита = ПолучитьРеквизитыНаСервере(ТекСтрока.НомерЗБ);//и тут. Если убрать ссылку на (ТекСтрока.НомерЗБ), то ругается на недостаточное количество параметров
КонецПроцедуры

&НаСервере
Функция ПолучитьРеквизитыНаСервере(НомерЗБ)
СОЗапрос = Новый Запрос;
СОЗапрос.Текст =
"ВЫБРАТЬ
| НомерЗБ.СуммаОценки,
| НомерЗБ.СуммаКредита
|ИЗ
| Справочник.НомерЗБ КАК НомерЗБ
|ГДЕ
| НомерЗБ.Ссылка = &Ссылка";
СОЗапрос.Установитьпараметр("Ссылка",НомерЗБ);
РеквизитыДокумента = Новый Структура;
        РеквизитыДокумента.Вставить("СуммаОценки",0);
        РеквизитыДокумента.Вставить("СуммаКредита",0);   
        Выборка = СОЗапрос.Выполнить().Выбрать();
       
         Если Выборка.Следующий() Тогда
            ЗаполнитьЗначенияСвойств(РеквизитыДокумента,Выборка);
        КонецЕсли;
    Возврат РеквизитыДокумента;
КонецФункции


sertak


&НаКлиенте
Процедура НомерЗБПриИзменении(Элемент)
    ТекСтрока = Элементы.Билеты.ТекущиеДанные;
    РеквизитыСправочника = ПолучитьРеквизитыНаСервере(ТекСтрока.НомерЗБ);
    ТекСтрока.СуммаОценки = РеквизитыСправочника.СуммаОценки;
    ТекСтрока.СуммаКредита = РеквизитыСправочника.СуммаКредита;
КонецПроцедуры

Добавлено: 16 ноя 2014, 12:40


Не заметил сразу: надо передавать в функцию ссслык на элемен справочника, а не номер:
Вместо ПолучитьРеквизитыНаСервере(ТекСтрока.НомерЗБ) Нужно ПолучитьРеквизитыНаСервере(ТекСтрока.<ИмяКолонкиССылка>);
Подствьте нужное имя

JOG


cska-fanat-kz

РезультатЗапроса = СОЗапрос.Выполнить().Выгрузить();
    Возврат РезультатЗапроса[0].СуммаОценки; /* как меняется запрос, чтобы не переписывать функции на получение каждого реквизита?*/

заменить на
РезультатЗапроса = СОЗапрос.Выполнить().Выгрузить();
РезультатСтруктура = Новый Структура("СуммаОценки,СуммаКредита"); //сюда по необходимости добавляем еще реквизит
ЗаполнитьЗначенияСвойств(РезультатСтруктура, РезультатЗапроса[0]);
    Возврат РезультатСтруктура;
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Теги:

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

Рейтинг@Mail.ru

Поиск