Имя: Пароль:
1C
1С v8
Народ поделитесь опытом
0 Fergus
 
05.01.13
09:10
Люди поделитесь опытом как вы разбираете большие запросы. К примеру в типовых конфигурациях есть процедуры включающие в себя некий большой расчет, который изобилует проверками, условиями и в конце формируется огромный текст запроса. Как вы его разбираете, какие уловки применяете
Вот к примеру текст запроса (сразу скажу, запрос мною разобран)

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

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

понятно, сразу посыпятся, что именно я хочу? что не понятно? все очень просто? и т.д.
У меня простой ясный вопрос - как вы разбираете большие запросы, сколько у вас уходит на это время, есть ли какие-нибудь методы чтения по-диагонали, не знаю.
1 Xapac_2
 
05.01.13
09:13
если уж вообще попец, то находим строчку "Запрос.Выполнить()"

идем в отладку, смотрим Запрос.Текст и Запрос.Параметры

повторяем в консольке. и разбираемся.
2 Fergus
 
05.01.13
09:14
ясень пень, что не в блокноте надо разбирать :), а сколько по времени на это дело уходит?
3 Lama12
 
05.01.13
09:25
(2) Когда как.
Иногда и до нескольких дней.
А вообще, разбиваешь запрос на части и по кусочку выполняешь.
Результаты кусочков сам соединяешь как буд-то сам выполняешь запрос общий.
Все обычно становится ясно.

(0)Да тут вроде и запрос не сложный.
Хуже когда есть несколько подряд идущих запросов собирающих несколько временных таблиц, а и тоговый на их основании что-то делает.
Вот тут иногда приходится и без конслои разбирать. В голове.
Обычно это зарплатные и кадровые запросы.
Но даже и здесь можно извратиться :)
ТЗ сериализуются ;-)
Промежуточные результаты можно выгружать из отладчика в файлы а в обычной конслои загружать как параметры... ну почти.
4 Fergus
 
05.01.13
09:48
да, я так и делаю, разбиваю на кусочки, разбираю, а зарплатные и кадровые запросы реально выносят мозг, но ведь люди которые их пишут, пишут не из головы? так? последнее время я облазил весь нет в поисках истины, как пишут прогеры большие запросы, это либо приходит с опытом, либо нужно изначально правильно ставить перед собой цели, либо купить блин доску домой и как в сериале "Теория большого взрыва" рисовать кружочки - вот этот кружочок времен тз №1, вот этот кружочок времен тз №2 и т.д. а вот здесь мы все эти тз соединяем опа вот и запрос!!!!!!
5 Odin1C
 
05.01.13
10:27
есть функция показатьвременнуютаблицу во всех типовых конфах, вставляем ее вызовы куда нужно и смотрим что хотим
6 Jolly Roger
 
05.01.13
10:28
(0) ставь вопрос шире: как работать с индийским/китайским кодом? как и задумано - выкидывать старый и писать свой...
7 i-rek
 
05.01.13
10:34
А не надо лазить в большие запросы вообще.
При этом самому себе писать большие запросы можно, но в чужие лазить никакого смысла нет.
Можно только поглядеть на него, убедиться что какой то показатель считается не правильно и посчитать отдельно именно этот показатель самому рядышком (простым понятным запросом в цикле)
8 Сергей Д
 
05.01.13
12:22
(4) Как, как. По кусочкам и пишут. Один запросик. Потом его как подзапрос во второй. Потом все это в третий. И т.д.