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

Улучшить запрос

Автор Max92, 30 авг 2024, 09:36

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

Max92

Помогите пожалуйста получить все данные одним запросом Не получаеться и делал функцией но работает долго Пробовал вложеным запросом но дублируються
Недавно начал изучать 1с  :trhregerhg:


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

з = Новый Запрос(тз);
з.УстановитьПараметр("Склад",Справочники.Склады.НайтиПоКоду("1979"));
з.УстановитьПараметр("ГП",_ГП);
з.УстановитьПараметр("Номер",_Номер);

з.УстановитьПараметр("НачПериода",_НачПериода);
з.УстановитьПараметр("КонПериода",Новый Граница(КонецДня(_КонПериода),ВидГраницы.Включая));

Выборка = з.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда

ОстатокНев = Выборка.КоличествоНачальныйОстаток;
ОстатокКонНев = Выборка.КоличествоКонечныйОстаток;

Else
ОстатокНев = 0;
ОстатокКонНев = 0;

КонецЕсли;

Результат = Новый Структура;
Результат.Вставить("ОстатокНев", ОстатокНев);
Результат.Вставить("ОстатокКонНев", ОстатокКонНев);

Возврат Результат;


EndFunction

Процедура ВсеОтчеты(Элемент)

Склад = Справочники.Склады.ПустаяСсылка();


TablitaRem = New ValueTable;
TablitaRem.Columns.Add("ВидРемонта", Новый ОписаниеТипов("ПеречислениеСсылка.ВидыРемонта"));
TablitaRem.Columns.Add("ОстатокНачалоНев",ПолучитьОписаниеТиповЧисла(18,5));
TablitaRem.Columns.Add("ОстатокКонецНев",ПолучитьОписаниеТиповЧисла(18,5));
TablitaRem.Columns.Add("ОстатокНачалоГот",ПолучитьОписаниеТиповЧисла(18,5));
TablitaRem.Columns.Add("ОстатокКонецНГот",ПолучитьОписаниеТиповЧисла(18,5));
TablitaRem.Columns.Add("Приход",ПолучитьОписаниеТиповЧисла(18,5));
TablitaRem.Columns.Add("Расход",ПолучитьОписаниеТиповЧисла(18,5));
    TablitaRem.clear();


ЭлементыФормы.т.Очистить();
Макет = ПолучитьМакет("ВсеРемонты");

Секция = Макет.ПолучитьОбласть("Шапка");
Секция.Параметры.НачПериода = Формат(НачПериода,"ДЛФ=Д");
Секция.Параметры.КонПериода = Формат(КонПериода,"ДЛФ=Д");
//Секция.Параметры.Склад = "";
ЭлементыФормы.т.Вывести(Секция);

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

з = Новый Запрос(тз);
з.УстановитьПараметр("Склад",Склад);
з.УстановитьПараметр("СкладМат",Справочники.Склады.НайтиПоКоду("1979"));
з.УстановитьПараметр("СкладПрод",Справочники.Склады.НайтиПоКоду("1973"));
з.УстановитьПараметр("Ссылка",Номенкл);

з.УстановитьПараметр("НачПериода",НачПериода);
з.УстановитьПараметр("КонПериода",Новый Граница(КонецДня(КонПериода),ВидГраницы.Включая));

итНачОстНев = 0;
итКонОстНев = 0;

итНачОст = 0;
итКонОст = 0;

итПриход = 0;
итРасход = 0;
итОтгрузка = 0;
ном = 0;

н = 0;


ВыборкаПрих = з.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,"ДокументПрихода");
Пока ВыборкаПрих.Следующий() Цикл

н = н + 1;
ном = ном + 1;
Если не ЗначениеЗаполнено(ВыборкаПрих.ДокументПрихода) Тогда
Продолжить;
КонецЕсли;
Секция = Макет.ПолучитьОбласть("Строка");
Секция.Параметры.ном = ном;
Секция.Параметры.н = Формат(ВыборкаПрих.ДокументПрихода.Номер,"ЧГ=");
Секция.Параметры.ДатаПрихода = Формат(ВыборкаПрих.ДокументПрихода.Дата,"ДЛФ=Д");
Секция.Параметры.Гар = ВыборкаПрих.ДокументПрихода.ВидРемонта;
Секция.Параметры.ГП = ВыборкаПрих.ДокументПрихода.Номенклатура;



  If Not ВыборкаПрих.КоличествоНачальныйОстаток + ВыборкаПрих.КоличествоКонечныйОстаток = 0   Then
Результат =  ОстатокКонНев(ВыборкаПрих.ДокументПрихода.Номенклатура, ВыборкаПрих.ДокументПрихода.Номер, НачПериода, КонПериода);

КоличествоНачальныйОстатокНев = Результат.ОстатокНев;
КоличествоКонечныйОстатокНев =  Результат.ОстатокКонНев;


    Else
КоличествоНачальныйОстатокНев = 0;
КоличествоКонечныйОстатокНев = 0;
Endif;

  итНачОстНев = итНачОстНев + КоличествоНачальныйОстатокНев;
 
  Секция.Параметры.НачОстНЕВ = КоличествоНачальныйОстатокНев;
Секция.Параметры.НачОст = ВыборкаПрих.КоличествоНачальныйОстаток - КоличествоНачальныйОстатокНев;


  итКонОстНев = итКонОстНев + КоличествоКонечныйОстатокНев;
  Секция.Параметры.КонОстНЕВ = КоличествоКонечныйОстатокНев;
Секция.Параметры.КонОст = ВыборкаПрих.КоличествоКонечныйОстаток - КоличествоКонечныйОстатокНев;

Секция.Параметры.Приход = ВыборкаПрих.КоличествоПриход;
Секция.Параметры.Расход = ВыборкаПрих.КоличествоРасход;

итНачОст = итНачОст + ВыборкаПрих.КоличествоНачальныйОстаток;
итКонОст = итКонОст + ВыборкаПрих.КоличествоКонечныйОстаток;
итПриход = итПриход + ВыборкаПрих.КоличествоПриход;
итРасход = итРасход + ВыборкаПрих.КоличествоРасход;
итОтгрузка = итОтгрузка + ВыборкаПрих.КоличествоОтгрузка;
Секция.Параметры.ДокументПрихода = ВыборкаПрих.ДокументПрихода;

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

NewRow4 = TablitaRem.Add();
NewRow4.ВидРемонта = ВыборкаПрих.ДокументПрихода.ВидРемонта;

If КоличествоНачальныйОстатокНев > 0 then NewRow4.ОстатокНачалоНев = 1;  Endif;
If КоличествоКонечныйОстатокНев > 0  then NewRow4.ОстатокКонецНев = 1; Endif;

If ВыборкаПрих.КоличествоПриход > 0 Then NewRow4.Приход = 1; Endif;
If ВыборкаПрих.КоличествоРасход > 0 Then NewRow4.Расход = 1;   Endif;


If (ВыборкаПрих.КоличествоНачальныйОстаток - КоличествоНачальныйОстатокНев) > 0 Then NewRow4.ОстатокНачалоГот = 1; Endif;
If (ВыборкаПрих.КоличествоКонечныйОстаток - КоличествоКонечныйОстатокНев) > 0 Then NewRow4.ОстатокКонецНГот = 1; Endif;

ЭлементыФормы.т.Вывести(Секция);

КонецЦикла;


TablitaRemDubl = TablitaRem.Скопировать();
   
TablitaRemDubl.Свернуть("ВидРемонта", "ОстатокНачалоНев,ОстатокКонецНев,ОстатокНачалоГот,ОстатокКонецНГот,Приход,Расход");
TablitaRemDubl.Сортировать("ВидРемонта");

For Each RowM In TablitaRemDubl Do
    Секция = Макет.ПолучитьОбласть("ИтогГрупа");
  //ном = ном + 1;
Секция.Параметры.Заполнить (RowM);

ЭлементыФормы.т.Вывести(Секция);

EndDo;

    Секция = Макет.ПолучитьОбласть("ИтогГрупаВсе");
Секция.Параметры.ОстатокНачалоНев =  TablitaRemDubl.Итог("ОстатокНачалоНев");
Секция.Параметры.ОстатокКонецНев =  TablitaRemDubl.Итог("ОстатокКонецНев");
Секция.Параметры.ОстатокНачалоГот =  TablitaRemDubl.Итог("ОстатокНачалоГот");
Секция.Параметры.ОстатокКонецНГот =  TablitaRemDubl.Итог("ОстатокКонецНГот");
Секция.Параметры.Приход =  TablitaRemDubl.Итог("Приход");
Секция.Параметры.Расход =  TablitaRemDubl.Итог("Расход");

ЭлементыФормы.т.Вывести(Секция);



Секция = Макет.ПолучитьОбласть("Подвал");
Секция.Параметры.НачОст = итНачОст - итНачОстНев;
Секция.Параметры.КонОст = итКонОст - итКонОстНев;

Секция.Параметры.НачОстНЕВ = итНачОстНев;
Секция.Параметры.КонОстНЕВ = итКонОстНев;

Секция.Параметры.Приход = итПриход;
Секция.Параметры.Расход = итРасход;
Секция.Параметры.Отгрузка = итОтгрузка;

ЭлементыФормы.т.Вывести(Секция);

ЭлементыФормы.т.ФиксацияСверху = 4;
ЭлементыФормы.т.ФиксацияСлева = 4;

ЭлементыФормы.т.ТолькоПросмотр = Истина;
КонецПроцедуры


Теги:

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

Рейтинг@Mail.ru

Поиск