Имя: Пароль:
1C
 
Странное поведение запроса из Бух8
,
0 zerik
 
22.03.24
15:21
Добрый день.
Вот при закрытии месяца выполняется один из запросов и вешает клиента на мертво, помогает только сброс текущего серверного вызова, да база в sql 16.
Если во втором запросе убрать "ПЕРВЫЕ 1" то запрос выполняется и всё хорошо, на 2.5 млн строк выборка, но выполняет и не тупит.
База обслужена, индексы перестроены, статистика обновлена.
Далее база выгружена и загружена в чистую, та же история...
Далее база загружена в файловую версию, в файловой нет проблем.
Кто сталкивался помогите понять... я его уже простил =)

ВЫБРАТЬ ПЕРВЫЕ 1
    ТаблицаПоследовательности.Регистратор КАК Регистратор,
    ТаблицаПоследовательности.Период КАК Период,
    ИСТИНА КАК ЭтоДанныеПоследовательности
ИЗ
    Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности
ГДЕ
    ТаблицаПоследовательности.Организация = &Организация
    И ТаблицаПоследовательности.Период >= &НачинаяСДаты

ОБЪЕДИНИТЬ ВСЕ

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

УПОРЯДОЧИТЬ ПО
    Период,
    Регистратор
1 Волшебник
 
22.03.24
15:24
Такие запросы обязаны вешать базу. В этом их фишка
2 zerik
 
22.03.24
15:25
Во втором запросе "ВЫБРАТЬ ПЕРВЫЕ 1", а если убрать то выполняет норм.
3 zerik
 
22.03.24
15:35
экспериментальным путём выяснил, что вешается если этот первый 1 "Операция" т.е. получается есть ручная операция и она не в последовательности как это может так работать =((((
4 Волшебник
 
22.03.24
15:37
(3) Объясните смысл этого запроса, а уж потом будем разбираться, что в нём переделать. Это вообще зачем?
5 Eiffil123
 
22.03.24
16:03
(1) а в чем вы видите проблему с запросом?
6 Гена
 
гуру
22.03.24
16:16
(4) Список пропускаемых документов соответствует служебным обязанностям замГБ.
Скорее всего она попросила программиста сварганить какой-то отчёт по чужим для неё докам.
7 Гена
 
гуру
22.03.24
16:19
Коллеги, мне непонятно, а что даёт это условие, можете пояснить?
И ТаблицаПоследовательности.Регистратор ЕСТЬ NULL

Просто я привык видеть НЕ ЕСТЬ NULL...
8 Волшебник
 
22.03.24
16:26
(7) Это условие обратное тому, к которому Вы привыкли. Ваш Кэп.

Нижний запрос выберет те документы, которых нет в последовательности.
9 Garykom
 
гуру
22.03.24
16:51
(2) Не вижу у тебя двух запросов
Вижу один запрос с ОБЪЕДИНИТЬ ВСЕ
10 Garykom
 
гуру
22.03.24
16:52
(9)+ два и более запросов это когда между ними есть ";"
11 Eiffil123
 
22.03.24
17:27
(3) похоже на платформенный глюк
12 Волшебник
 
22.03.24
17:29
(10) Это один пакетный запрос
13 Garykom
 
гуру
22.03.24
17:40
(12) Угу, который состоит из обычных запросов (не пакетных)
Теоретически да можно сказать что у него сложный запрос с объединить, состоящих из двух простых запросов
14 ptiz
 
22.03.24
17:39
(0) Если в типовой бухгалтерии дата документа совпадает с датой движений, то в соединение добавь условие:
ПО Хозрасчетный.Период = ТаблицаПоследовательности.Период
15 Волшебник
 
22.03.24
21:22
(14) А запрос к проводкам для выборки документов для перепроведения Вас не смутил?
16 zerik
 
23.03.24
00:39
Это запрос из типовой конфы. Общий модуль РаботаСПоследовательностями функция МоментВремениПервогоДокументаВПоследовательности
эта функция вызывается из функции ПроверитьАктуальность в модуле обработки ЗакрытиеМесяца перед выполнением закрытия.
Это происходит в фоновом задании которое зависает при исполнении этого запроса... Если выполняю запрос из консоли запроса, то клиент виснет пока не сброшу серверный вызов.
Зачем это так придумано ХЗ. Я не понимаю на, что влияет ПЕРВЫЕ 1. Видимо надо анализировать план запроса, но я в этом не шарю.
17 zerik
 
23.03.24
00:42
(11) Поймал на платформе 23.2040 обновлял, добрался до актуальной 24.1467 всё также.
18 zerik
 
23.03.24
00:43
Лицуха, ИТС, все дела на месте , кроме кукухи... =)
19 zerik
 
23.03.24
00:46
(3) <- не актально, вешается если выборка меньше 5, т.е выбрать первые 5 и более ОК, выбрать первые 4 и меньше зависон =(
20 youalex
 
23.03.24
02:43
(16) >Видимо надо анализировать план запроса, но я в этом не шарю.
Хороший повод начать) Как минимум посмотреть в профайлере /консоле что там строится на стороне скуля.

Ну или экспериментировать. Например - разбить ОБЪЕДИНИТЬ на 2 ВТ (ВЫБРАТЬ ПЕРВЫЕ 1 ... ПОМЕСТИТЬ ВТ1 ... УПОРЯДОЧИТЬ ПО...) дальше выбирать ПЕРВЫЕ 1 из их объединения.
Или дикое условие на проверку типа заменить на ТИПЗНАЧЕНИЯ(Регистратор) НЕ В (&МассивТипов)
21 youalex
 
23.03.24
02:55
(20) * а лучше ТИПЗНАЧЕНИЯ(Регистратор) В (&МассивТипов) , полный массив типов взять можно из Метаданные.РегистрыБухгалтерии.Хозрасчетный.СтандартныеРеквизиты.Регистратор.Тип.Типы() например
22 АНДР
 
23.03.24
08:22
Что должно вернуть первые 1 для каждого из выбрать, если упорядочивание применяется к итоговой выборке!?
23 АНДР
 
23.03.24
08:27
Где применяется к результату соединения, по этой причине условия на организацию и дату во втором выбрать должны быть в условии соединения и для обеих соединяемых таблиц!!!
Где проверять типы - вопрос дискуссионный.
24 Фёдор14
 
23.03.24
09:34
(0) А где у тебя упорядочивание в первом запросе?
В чем тогда смысл ВЫБРАТЬ ПЕРВЫЕ 1?
25 Фёдор14
 
23.03.24
09:39
А, там же объединение...
Ну да, это сложный запрос получится. Неудивительно, что долго работает.
26 youalex
 
23.03.24
11:14
(23) во втором члене объединения (назовем его так) проверка на типы видимо исключает типы, не входящие в последовательность. С условиями там логически все верно.
27 ДедМорроз
 
23.03.24
11:49
Чтобы получить первые,нужно выполнить запрос и сделать упорядочивание,а только потом выбрать первую строку.
Упорядочивание документов,которые в разных таблицах,задача очень непростая.
А влияние количества - возможно,что при большом количестве все отдают SQL,а он более оптимизирован,а попытка делать сравнение на лету приводит к поиску по таблицам для каждой строки,то есть получается аналог запроса в цикле.
При исполнении в sql цикл получается не по строкам,а по типам документов,так как сравнивать моменты времени можно и без заглядывается в таблицы.
28 zerik
 
23.03.24
13:37
(24) Так это не у меня, это в типовой бух
29 zerik
 
23.03.24
13:40
всем спасибо, разбираться нет времени, перевод в файловую решает, может позже с обновлением платформы верну в скуль проверю
30 Гена
 
гуру
23.03.24
15:39
(28) Нет в типовой такого кода. Есть другой:

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

Видно, что у вас там код переписан. И в исключение добавлена своя куча документов.
31 Гена
 
гуру
23.03.24
15:47
Кстати, Волшебник, вот этой строчки раньше в коде не было:
И ТаблицаПоследовательности.Регистратор ЕСТЬ NULL
У меня есть релиз БП полугодичной давности - там её нет, она появилась недавно, в 150.29 уже есть

Вот чем-то она мне не нравится )
32 Гена
 
гуру
23.03.24
15:50
т.е. концовка для ранешних платформ была такой:
        |ВЫБРАТЬ ПЕРВЫЕ 1
        |    Хозрасчетный.Регистратор,
        |    Хозрасчетный.Период,
        |    ЛОЖЬ КАК ЭтоДанныеПоследовательности
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
        |ГДЕ
        |    Хозрасчетный.Организация = &Организация
        |    И Хозрасчетный.Период >= &НачинаяСДаты
        |    И &УсловиеПоРегистратору
        |    И НЕ (Хозрасчетный.Регистратор ССЫЛКА Документ.СчетФактураПолученный)
        |    И НЕ (Хозрасчетный.Регистратор ССЫЛКА Документ.СчетФактураВыданный)";
33 Сияющий Асинхраль
 
23.03.24
19:39
(31) Ага, странное условие.
34 Волшебник
 
23.03.24
20:57
(31) Мне вообще этот запрос не нравится
35 zerik
 
24.03.24
17:14
(30) конфа на замке, этот запрос собирается, я просто готовый текст выкатил который исполняется, "&УсловиеПоРегистратору" заменяется на описание регистраторов. строка 1042 в БП 3.0.147.30
36 Волшебник
 
24.03.24
17:15
(35) Гнилые отмазки
37 zerik
 
25.03.24
01:42
(36) хех - колбасный цех
Программист всегда исправляет последнюю ошибку.