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

Оптимизировать запрос

Автор Antonio, 21 апр 2023, 10:17

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

Antonio

Добрый день, прошу подсказать как лучше оптимизировать данные запросы, привести в нормальный вид. Возможно ли сделать всё одним запросом
&НаСервере
Функция СформироватьПечатнуюФорму(МассивОбъектов)   Экспорт
ТаблДокум = Новый ТабличныйДокумент;
ТаблДокум.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ";
//область Адрессклада
Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СкладыКонтактнаяИнформация.Представление КАК Представление
|ИЗ
| Справочник.Склады.КонтактнаяИнформация КАК СкладыКонтактнаяИнформация
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
| ПО СкладыКонтактнаяИнформация.Ссылка.Наименование = ЗаказКлиента.Склад.Наименование
|ГДЕ
| ЗаказКлиента.Ссылка В(&Ссылка)
| И СкладыКонтактнаяИнформация.НомерСтроки = 1";
Запрос.УстановитьПараметр("Ссылка", МассивОбъектов);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетЗап = РезультатЗапроса.Выбрать();


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

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

Запрос.УстановитьПараметр("Ссылка", МассивОбъектов);

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи= РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьШапка.Параметры.НомерДокумента = ВыборкаДетальныеЗаписи.Номер;
ОбластьШапка.Параметры.Контрагент = ВыборкаДетальныеЗаписи.КонтрагентНаименование;
ОбластьШапка.Параметры.ДатаПечати = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy")
КонецЦикла;

ТаблДокум.Вывести(ОбластьШапка);

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

Запрос.УстановитьПараметр("Ссылка", МассивОбъектов);

РезультатЗапроса = Запрос.ВыполнитьПакет();
      Выборка1 = РезультатЗапроса[0].Выбрать();
Выборка2 = РезультатЗапроса[1].Выбрать();


Пока Выборка1.Следующий() и Выборка2.Следующий()  Цикл
ОбластьОрганизацияКонтрагент.Параметры.Контрагент = Выборка1.ПартнерНаименование;
ОбластьОрганизацияКонтрагент.Параметры.АдресКонтрагента = Выборка1.АдресДоставки;
ОбластьОрганизацияКонтрагент.Параметры.ТелефонКонтрагента = "Tel: " + Выборка2.НомерТелефона;
    ОбластьОрганизацияКонтрагент.Параметры.АдресЭПКонтрагент =" E-Mail: " + Выборка1.АдресЭП;
КонецЦикла;
//ОРГАНИЗАЦИЯ

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ОрганизацииКонтактнаяИнформация.Представление КАК Представление,
| ЗаказКлиента.Организация.Наименование КАК ОрганизацияНаименование
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК ОрганизацииКонтактнаяИнформация
| ПО ЗаказКлиента.Организация.Наименование = ОрганизацииКонтактнаяИнформация.Ссылка.Наименование
|ГДЕ
| ЗаказКлиента.Ссылка В(&Ссылка)
| И ОрганизацииКонтактнаяИнформация.НомерСтроки = 1
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОрганизацииКонтактнаяИнформация.Представление КАК Представление
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК ОрганизацииКонтактнаяИнформация
| ПО ЗаказКлиента.Организация.Наименование = ОрганизацииКонтактнаяИнформация.Ссылка.Наименование
|ГДЕ
| ЗаказКлиента.Ссылка В(&Ссылка)
| И ОрганизацииКонтактнаяИнформация.НомерСтроки = 3
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОрганизацииКонтактнаяИнформация.Представление КАК Представление
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Организации.КонтактнаяИнформация КАК ОрганизацииКонтактнаяИнформация
| ПО ЗаказКлиента.Организация.Наименование = ОрганизацииКонтактнаяИнформация.Ссылка.Наименование
|ГДЕ
| ЗаказКлиента.Ссылка В(&Ссылка)
| И ОрганизацииКонтактнаяИнформация.НомерСтроки = 5";

Запрос.УстановитьПараметр("Ссылка", МассивОбъектов);
РезультатЗапроса = Запрос.ВыполнитьПакет();
      Выборка1 = РезультатЗапроса[0].Выбрать();
Выборка2 = РезультатЗапроса[1].Выбрать();
Выборка3 = РезультатЗапроса[2].Выбрать();


Пока Выборка1.Следующий() и Выборка2.Следующий() и Выборка3.Следующий() Цикл
ОбластьОрганизацияКонтрагент.Параметры.Организация = Выборка1.ОрганизацияНаименование;
ОбластьОрганизацияКонтрагент.Параметры.АдресОрганизации = Выборка1.Представление;
ОбластьОрганизацияКонтрагент.Параметры.ТелефонОрганизации = "Tel: "+ Выборка2.Представление;
ОбластьОрганизацияКонтрагент.Параметры.АдресЭПОрганизации ="E-Mail: " + Выборка3.Представление;
КонецЦикла;

ТаблДокум.Вывести(ОбластьОрганизацияКонтрагент);

//ОБЛАСТЬ ТАБЛИЧНОЙ ЧАСТИ


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
| ЗаказКлиентаТовары.Количество КАК Количество,
| ЗаказКлиентаТовары.Цена КАК Цена,
| ЗаказКлиентаТовары.Сумма КАК Сумма,
| ЗаказКлиента.СуммаДокумента КАК СуммаДокумента,
| ЗаказКлиента.Валюта.Наименование КАК Валюта
|ИЗ
| Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ЗаказКлиента КАК ЗаказКлиента
| ПО ЗаказКлиентаТовары.Ссылка = ЗаказКлиента.Ссылка
|ГДЕ
| ЗаказКлиента.Ссылка В(&Ссылка)";

Запрос.УстановитьПараметр("Ссылка", МассивОбъектов);

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

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

ОбластьШапкаТабЧасти = Макет.ПолучитьОбласть("ШапкаТабЧасти");
ОбластьПодвал = Макет.ПолучитьОбласть("ДеталиТаблЧасти");

ТаблДокум.НачатьАвтогруппировкуСтрок();
ТаблДокум.Вывести(ОбластьШапкаТабЧасти);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьПодвал.Параметры.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
ОбластьПодвал.Параметры.Количество = ВыборкаДетальныеЗаписи.Количество;
ОбластьПодвал.Параметры.Цена =  ВыборкаДетальныеЗаписи.Цена;
ОбластьПодвал.Параметры.Сумма = ВыборкаДетальныеЗаписи.Сумма;;
ТаблДокум.Вывести(ОбластьПодвал);
КонецЦикла;
ТаблДокум.ЗакончитьАвтогруппировкуСтрок();
      ОбластьИтог = Макет.ПолучитьОбласть("Итог");
ОбластьИтог.Параметры.Итоги = ВыборкаДетальныеЗаписи.СуммаДокумента;
ОбластьИтог.Параметры.Валюта = ВыборкаДетальныеЗаписи.Валюта;
ТаблДокум.Вывести(ОбластьИтог);



  //ТаблДокум.Очистить();


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

Запрос.УстановитьПараметр("Ссылка", МассивОбъектов);

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

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьПодвал.Параметры.БИК = "BIC/SWIFT: " + ВыборкаДетальныеЗаписи.БИК;
ОбластьПодвал.Параметры.БАН ="IBAN: " + ВыборкаДетальныеЗаписи.IBAN;
ОбластьПодвал.Параметры.Банк=  "Bank: " + ВыборкаДетальныеЗаписи.Банк;
ОбластьПодвал.Параметры.Город = "Address: " + ВыборкаДетальныеЗаписи.Город;
КонецЦикла;

  ТаблДокум.Вывести(ОбластьПодвал);

ТаблДокум.АвтоМасштаб = Истина;
ТаблДокум.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТаблДокум.ПолеСлева = 5;
ТаблДокум.ПолеСправа = 5;
ТаблДокум.ВывестиГоризонтальныйРазделительСтраниц();
Возврат ТаблДокум;    

КонецФункции

Antonio

+ к этому  как возможно избавиться здесь от запроса в цикле?
ТабДокРез = Новый ТабличныйДокумент();
    Для Каждого СсылкаНаДок ИЗ МассивОбъектов Цикл
        ТабДок = СформироватьПечатнуюФорму(СсылкаНаДок, ОбъектыПечати);
        Если ТабДокРез.ВысотаТаблицы <> 0 Тогда
            ТабДокРез.ВывестиГоризонтальныйРазделительСтраниц();
        КонецЕсли;
        ТабДокРез.Вывести(ТабДок);
      КонецЦикла;
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Макет", "Макет", ТабДокРез);

Afinogen

вот такое соединение сразу нафиг

ПО СкладыКонтактнаяИнформация.Ссылка.Наименование = ЗаказКлиента.Склад.Наименование
Достаточно

ПО СкладыКонтактнаяИнформация.Ссылка= ЗаказКлиента.Склад

Afinogen

для всех соединений с контактной информацией можно сделать пакет типа такого

ВЫБРАТЬ
ЗаказКлиента.Ссылка КАК ЗаказКлиента,
СкладыКонтактнаяИнформация.Ссылка,
СкладыКонтактнаяИнформация.Тип,
СкладыКонтактнаяИнформация.Вид,
СкладыКонтактнаяИнформация.НомерСтроки,
ВЫБОР
КОГДА СкладыКонтактнаяИнформация.НомерСтроки = 1
ТОГДА "нужное значение"
ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ КАК Поле1,
ВЫБОР
КОГДА СкладыКонтактнаяИнформация.НомерСтроки = 2
ТОГДА "нужное значение"
ИНАЧЕ НЕОПРЕДЕЛЕНО
КОНЕЦ КАК Поле2
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады.КонтактнаяИнформация КАК СкладыКонтактнаяИнформация
ПО ЗаказКлиента.Склад = СкладыКонтактнаяИнформация.Ссылка
ГДЕ
ЗаказКлиента.Ссылка = &Ссылка
И СкладыКонтактнаяИнформация.НомерСтроки В (1, 2, 3)

Afinogen

Делать левое соедиенение заказа клиента с его же таб частью  не нужно, достаточно

ВЫБРАТЬ
...
ИЗ
Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары

Afinogen

Хотите красивее код сделайте так

Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ
| ЗаказКлиента.Ссылка
|ПОМЕСТИТЬ втЗаказКлиента
|ИЗ
| Документ.ЗаказКлиента КАК ЗаказКлиента
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втЗаказКлиента.Ссылка.Склад,
| СкладыКонтактнаяИнформация.Представление
|ИЗ
| втЗаказКлиента КАК втЗаказКлиента
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Склады.КонтактнаяИнформация КАК СкладыКонтактнаяИнформация
| ПО втЗаказКлиента.Ссылка.Склад = СкладыКонтактнаяИнформация.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЗаказКлиентаТовары.Ссылка,
| ЗаказКлиентаТовары.Номенклатура
|ИЗ
| Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары";

весь код не рисовал, только идею кидаю, у вас все запросы однотипные

Kvark5d

Antonio, При выводе на печать Вам приходится делать Цикл потому что в функции СформироватьПечатнуюФорму() несмотря на то, что в нее передается МассивОбъектов, все данные собраны в кучу. Ее необходимо переделать.
Интересно почему предполагается, что в табличной части Контактная информация данные записываются в строго определенном порядке? Т.е. Адрес склада первая строка, телефон вторая и т.д. Обычно там есть реквизиты Тип и Вид по которым уже определяется тип инфы - телефон или адрес или что то другое. И отбор в запросе делается по ним.
Какая у Вас конфигурация? В каком документе эти функции?


Antonio

Kvark5d, хмм, пока затрудняюсь с мыслью о том, как же функцию переделать тогда. Думал, что можно именно процедуру печать как то переписать.( По контактной информации: Изначально действительно искал по типу/виду. Я точно не помню сейчас, какие то проблемы были при получении по типу/виду кстати, какое то время заняло понять как лучше эти данные получить. Конечно когда искал по номеру строки, то проверял, всегда ли такой поиск будет правильным и да, вроде с этим все нормально, по крайней мере такое решение приняли. Переделать именно нужно запрос в цикле и привести в порядок вот это множество запросов, сделать чтобы запрос был один(если вообще возможно). Выполняю в конфигурации УТ 11, документ ЗаказКлиента. Код написан для внешней печатной формы

Antonio

Afinogen, Спасибо, принял!

Теги:

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

Рейтинг@Mail.ru

Поиск