Запрос не выполняется в модуле внешнего отчета, в консоли выполняется

1. wasyagal 18 27.08.18 20:26 Сейчас в теме
Добрый день.
Помогите с проблемой: простой запрос, в консоли работает как нужно, в модуле внешнего отчета нет. Не могу понять в чем причина.
    ЗапросСостояние = Новый Запрос();
    ЗапросСостояние.Текст = "ВЫБРАТЬ
                            |    СостояниеРаботниковОрганизаций.Сотрудник КАК Сотрудник,
                            |    СостояниеРаботниковОрганизаций.Состояние КАК Состояние,
                            |    СостояниеРаботниковОрганизаций.Период КАК Период,
                            |    СостояниеРаботниковОрганизаций.ПериодЗавершения
                            |ИЗ
                            |    РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
                            |ГДЕ
                            |    СостояниеРаботниковОрганизаций.Период >= &НачПериода
                            |    И СостояниеРаботниковОрганизаций.Период <= &КонПериода
                            |    И СостояниеРаботниковОрганизаций.Сотрудник.ВидЗанятости = &осн
                            |    И СостояниеРаботниковОрганизаций.Сотрудник = &сотрудник
                            |
                            |УПОРЯДОЧИТЬ ПО
                            |    Сотрудник,
                            |    Период";

    ЗапросСостояние.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
    ЗапросСостояние.УстановитьПараметр("НачПериода", НачалоДня(НачПериода));
    ЗапросСостояние.УстановитьПараметр("осн", Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы);
    ЗапросСостояние.УстановитьПараметр("сотрудник", Сотр);
    РезультатЗапросаСостояние = ЗапросСостояние.Выполнить();
    Состояние = РезультатЗапросаСостояние.Выбрать();
//****************************************************************************************
    
    ДатНачЗаболевания = '00010101';
    Пока Состояние.Следующий() Цикл
        Если Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.Работает  Тогда
            Если  БольничныйНаНачПериода = 1 Тогда
                квоДней=(НачалоДня(Состояние.Период)-НачалоДня(НачПериода))/86400;   //(60*60*24+1)   НачалоДня(ВыборкаБольн1.Период)
                ДатНач = НачалоДня(НачПериода);    //НачалоДня(ВыборкаБольн1.Период);
                ДатКон = НачалоДня(Состояние.Период);
            Иначе
                квоДней=(НачалоДня(Состояние.Период)-НачалоДня(ДатНачЗаболевания))/86400;   //(60*60*24+1)   НачалоДня(ВыборкаБольн1.Период)
                ДатНач = НачалоДня(ДатНачЗаболевания);
                ДатКон = НачалоДня(Состояние.Период);
                ДатНачЗаболевания = '00010101';
            КонецЕсли;
        ИначеЕсли Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.Заболевание ИЛИ
                    РезультатЗапросаБольн.Состояние = Перечисления.СостоянияРаботникаОрганизации.ПоУходуЗаРебенком Тогда
            ДатНачЗаболевания = РезультатЗапросаСостояние.Период;
        КонецЕсли;
        Если Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускЕжегодный ИЛИ
            Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускУчебный ИЛИ
            Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускПоБеременностиИРодам  Тогда
            Если  НачалоДня(Состояние.ПериодЗавершения) >= НачалоДня(КонПериода) Тогда
                квоДней = (НачалоДня(КонПериода) - НачалоДня(Состояние.Период))/86400;
                ДатКон = НачалоДня(КонПериода);
            Иначе    
                квоДней=(НачалоДня(Состояние.ПериодЗавершения)-НачалоДня(Состояние.Период))/86400;  //(60*60*24+1)
                ДатКон = КонецДня(Состояние.ПериодЗавершения);
            КонецЕсли;
            ДатНач = НачалоДня(Состояние.Период);
        КонецЕсли;    
    КонецЦикла;


Показать
По теме из базы знаний
Найденные решения
20. wasyagal 18 28.08.18 10:32 Сейчас в теме
(19)нет, в последнем изменении я поменял алгоритм отбора невыходов по требованию бухов и этот отбор сейчас не могу запустить (функция "ОтпускБольничныйИзРегистраСостояний(Сотр = неопределено,ВыборкаРабочий,ВыборкаПредпраздничный, СуммаОтп=0)")
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. pavl_vs 27.08.18 20:43 Сейчас в теме
(1), а что оказалось неожиданным?
Судя по тексту запроса отчет какой-то странный - что Вы от него хотите?
3. wasyagal 18 27.08.18 21:11 Сейчас в теме
(2)А что в нем странного?
За конкретный период отбираются состояния по сотруднику с видом занятости "основное рабочее место". В частности у сотрудника за февраль 2018 есть состояние "заболевание" и "работа" - выход на работу. В консоли запросов это все работает
11. tata_1211 65 28.08.18 08:49 Сейчас в теме
(1) Еще два варианта. 1-й: в отладчике сделать Запрос.Выполнить().Выгрузить(). Если дело не в параметрах - в таблице увидите свой результат. Если результат есть, тогда дело в названии переменной выборки. Синтакс-помощник показывает, что есть такая зарезервированная переменная.
12. Xershi 1535 28.08.18 09:01 Сейчас в теме
(1) судя по вопросу кривой синтаксис или параметры.

Что конкретно работает не правильно?

РезультатЗапросаБольн


Сделай везде "РезультатЗапроса" и "Выборка", а то непонятно что написал!

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

    ЗапросСостояние.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
    ЗапросСостояние.УстановитьПараметр("НачПериода", НачалоДня(НачПериода));
    ЗапросСостояние.УстановитьПараметр("осн", Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы);
    ЗапросСостояние.УстановитьПараметр("сотрудник", Сотр);
    Состояние = ЗапросСостояние.Выполнить().Выбрать();      //РезультатЗапроса
    //Состояние = РезультатЗапросаСостояние.Выбрать();
//****************************************************************************************
    
    ДатНачЗаболевания = '00010101';
    Пока Состояние.Следующий() Цикл
        Если Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.Работает  Тогда
            Если  БольничныйНаНачПериода = 1 Тогда
                квоДней=(НачалоДня(Состояние.Период)-НачалоДня(НачПериода))/86400;   //(60*60*24+1)   НачалоДня(ВыборкаБольн1.Период)
                ДатНач = НачалоДня(НачПериода);    //НачалоДня(ВыборкаБольн1.Период);
                ДатКон = НачалоДня(Состояние.Период);
            Иначе
                квоДней=(НачалоДня(Состояние.Период)-НачалоДня(ДатНачЗаболевания))/86400;   //(60*60*24+1)   НачалоДня(ВыборкаБольн1.Период)
                ДатНач = НачалоДня(ДатНачЗаболевания);
                ДатКон = НачалоДня(Состояние.Период);
                ДатНачЗаболевания = '00010101';
            КонецЕсли;
        ИначеЕсли Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.Заболевание ИЛИ
                    РезультатЗапросаБольн.Состояние = Перечисления.СостоянияРаботникаОрганизации.ПоУходуЗаРебенком Тогда
            ДатНачЗаболевания = Состояние.Период;
        КонецЕсли;
        Если Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускЕжегодный ИЛИ
            Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускУчебный ИЛИ
            Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускПоБеременностиИРодам  Тогда
            Если  НачалоДня(Состояние.ПериодЗавершения) >= НачалоДня(КонПериода) Тогда
                квоДней = (НачалоДня(КонПериода) - НачалоДня(Состояние.Период))/86400;
                ДатКон = НачалоДня(КонПериода);
            Иначе    
                квоДней=(НачалоДня(Состояние.ПериодЗавершения)-НачалоДня(Состояние.Период))/86400;  //(60*60*24+1)
                ДатКон = КонецДня(Состояние.ПериодЗавершения);
            КонецЕсли;
            ДатНач = НачалоДня(Состояние.Период);
        КонецЕсли;    
    КонецЦикла;
    Если ДатНачЗаболевания <> '00010101' Тогда
        квоДней = (НачалоДня(КонПериода) - НачалоДня(ДатНачЗаболевания))/86400;
        ДатНач = НачалоДня(ДатНачЗаболевания);
        
    КонецЕсли;    
    Для Сч=0 По квоДней Цикл
        
         ДатаВЦикле = ДатНач + 86400 * Сч;
        //ДатаВЦикле = Дата(ДатаВЦикле);
        Если ВыборкаРабочий.Количество() <> 0   Тогда
            Для Индекс = 0 по ВыборкаРабочий.ВГраница() Цикл
                Если Формат(ВыборкаРабочий.Получить(Индекс),"ДЛФ=Д") = Формат(ДатаВЦикле,"ДЛФ=Д") Тогда
                    СуммаОтп = СуммаОтп + 8;
                    прервать;
                КонецЕсли;    
            КонецЦикла;
            Для Индекс = 0 по ВыборкаПредпраздничный.ВГраница() Цикл
                Если Формат(ВыборкаПредпраздничный.Получить(Индекс),"ДЛФ=Д") = Формат(ДатаВЦикле,"ДЛФ=Д") Тогда
                    СуммаОтп = СуммаОтп + 7;
                    прервать;
                КонецЕсли;    
            КонецЦикла;
        Иначе
        КонецЕсли;
        
    КонецЦикла;
    Возврат СуммаОтп;
    
    
КонецФункции


Показать
17. ben19791010 28.08.18 10:02 Сейчас в теме
(14)
дата
блин уже б давно кинул сам отчет

а то у меня по основным вроде норм в консоли выдаёт, а так - лень писать
18. wasyagal 18 28.08.18 10:18 Сейчас в теме
(17)Весь отчет уже давно работает, пришлось поменять только этот кусок с отбором невыходов по требованию бухов. Вот мой отчет.
Прикрепленные файлы:
Сверхурочка Новая версия от 24.08.2018.erf
19. ben19791010 28.08.18 10:26 Сейчас в теме
(18)
Весь отчет уже давно работает
т.е. всё нормально уже?
20. wasyagal 18 28.08.18 10:32 Сейчас в теме
(19)нет, в последнем изменении я поменял алгоритм отбора невыходов по требованию бухов и этот отбор сейчас не могу запустить (функция "ОтпускБольничныйИзРегистраСостояний(Сотр = неопределено,ВыборкаРабочий,ВыборкаПредпраздничный, СуммаОтп=0)")
23. ben19791010 28.08.18 10:47 Сейчас в теме
(20) уберите пока из 1 запросаИ СостояниеРаботниковОрганизаций.Сотрудник = &сотрудник
24. wasyagal 18 28.08.18 20:20 Сейчас в теме
(23)спасибо за идею, редко приходится заниматься такими вещами, поэтому некоторые простые вещи не улавливаю
22. Xershi 1535 28.08.18 10:46 Сейчас в теме
(14) написать 1 запрос и получить результат, а не жонглировать циклами и запросами!
ben19791010; +1 Ответить
4. ajuice 27.08.18 22:10 Сейчас в теме
Проверьте какие даты передаются в параметры запроса , может у вас в НачПериода на самом деле конечная дата
5. wasyagal 18 27.08.18 22:41 Сейчас в теме
(4)Спасибо, проверил, здесь все ок, к тому же в консоли все работает
6. tata_1211 65 27.08.18 22:57 Сейчас в теме
Тоже склоняюсь к тому, что что-то не так с параметрами. Проверьте все параметры в консоли и в отчете. Может, сотрудник в отчете пустая ссылка, может не совпадает тип по виду занятости.
7. wasyagal 18 27.08.18 23:46 Сейчас в теме
(6)прошел снова в отладчике: все параметры правильные, при первом же анализе цикла пока Состояние.Следующий() - вываливаемся из цикла, т.е. нет записей, хотя должно быть 2 записи
8. catena 110 28.08.18 06:47 Сейчас в теме
(7)Если выполняется в консоли и не выполняется в коде - 99%, что дело в параметрах. Проверяйте не только значения, но и типы.
25. wasyagal 18 28.08.18 20:23 Сейчас в теме
(8)спасибо за совет, дело именно в типах параметров
9. ben19791010 28.08.18 07:29 Сейчас в теме
(7)
хотя должно быть 2 записи
глянуть бы обработку - где вы параметры определяете и когда
10. ducks01 28.08.18 07:57 Сейчас в теме
как вы запускаете этот внешний отчет? нет ли у него пересечения по имени с доп отчетом другим ?
13. RustRR 28.08.18 09:16 Сейчас в теме
И СостояниеРаботниковОрганизаций.Сотрудник.ВидЗанятости = &осн
И СостояниеРаботниковОрганизаций.Сотрудник = &сотрудник

Условие какое-то избыточное. Может перепутан основной сотрудник и совместитель?
16. wasyagal 18 28.08.18 09:40 Сейчас в теме
(13)думаю избыточности нет т.к. отчет может еще работать с подразделениями, в этом случае посыплются все сотрудники и их нужно отфильтровывать
15. RustRR 28.08.18 09:39 Сейчас в теме
НачПериода и КонПериода не заданы.
21. wasyagal 18 28.08.18 10:34 Сейчас в теме
остальное все работает как нужно
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот