Имя: Пароль:
1C
1С v8
Вопрос по запросу из ЗУПа.
0 mzelensky
 
26.08.11
09:43
Доброго времени суток! Объясните плиз вот такую вещь.
Типовой ЗУП "Зарплата и Управление Персоналом, редакция 2.5 (2.5.36.3)".
Документ "Зарплата к выплате организаций", печать отчета "Список плательщиков в банк". Есть там такая функция:

Функция СформироватьЗапросПоДокументу(ДокументСсылка)

   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
       
   // Установим параметры запроса
   Запрос.УстановитьПараметр("ДокументСсылка",   ДокументСсылка);
   Запрос.УстановитьПараметр("ДатаДокумента",      ДокументСсылка.Дата);

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


   Возврат Запрос.Выполнить();

КонецФункции // СформироватьЗапросДляПечати()


я понять не могу, нафига там 3 запроса, которые выполняются по очереди в одну переменную, если возвращается ток последний???? ИЛИ я чего-то не догоняю????
1 mzelensky
 
26.08.11
09:44
И буквально следующая функция в этом же модуле(относится туда же):

Функция СформироватьЗапросДляПечатиПеречняПеречислений(ПечатаемыйДокумент, Ведомости, ФИОСокращенно)

   Запрос = Новый Запрос;
   Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;

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

   Возврат Запрос.Выполнить();
   
КонецФункции // СформироватьЗапросДляПечатиПеречняПеречислений()
2 almar
 
26.08.11
09:45
(0) В первых двух запросах формируются временные таблицы. Сейчас обычно это делают в одном пакетном запросе, но когда-то в стародавние времена пакетных запросов еще не было
3 mzelensky
 
26.08.11
09:47
(2) ага ,увидел...я чет вот эту строчку из вида упустил "ПОМЕСТИТЬ ВТОтветственныеЛица".

Хотя все-равно не понимаю зачем так делать (разделять в смысле). Платформа 8.2, конфа тоже относительно свежая...почему не пакетный запрос???
4 almar
 
26.08.11
09:48
(3) Это написано, когда пакетных запросов еще не было.