Добрый день.
Помогите с проблемой: простой запрос, в консоли работает как нужно, в модуле внешнего отчета нет. Не могу понять в чем причина.

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

    ЗапросСостояние.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
    ЗапросСостояние.УстановитьПараметр("НачПериода", НачалоДня(НачПериода));
    ЗапросСостояние.УстановитьПараметр("осн", Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы);
    ЗапросСостояние.УстановитьПараметр("сотрудник", Сотр);
    РезультатЗапросаСостояние = ЗапросСостояние.Выполнить();
    Состояние = РезультатЗапросаСостояние.Выбрать();
    //****************************************************************************************

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

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

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

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

Плюс сравнивать нужно выборку, а не результат запроса!
---
вот вся моя функция в которой два запроса:

```1c
    Функция ОтпускБольничныйИзРегистраСостояний(Сотр = неопределено,ВыборкаРабочий,ВыборкаПредпраздничный, СуммаОтп=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;
    прервать;
    КонецЕсли;
    КонецЦикла;
    Иначе
    КонецЕсли;

    КонецЦикла;
    Возврат СуммаОтп;

    КонецФункции
```
---
дата блин уже б давно кинул сам отчет

а то у меня по основным вроде норм в консоли выдаёт, а так - лень писать
---
Весь отчет уже давно работает, пришлось поменять только этот кусок с отбором невыходов по требованию бухов. Вот мой отчет.
---
Весь отчет уже давно работает т.е. всё нормально уже?
---
нет, в последнем изменении я поменял алгоритм отбора невыходов по требованию бухов и этот отбор сейчас не могу запустить (функция "ОтпускБольничныйИзРегистраСостояний(Сотр = неопределено,ВыборкаРабочий,ВыборкаПредпраздничный, СуммаОтп=0)")
---
уберите пока из 1 запросаИ СостояниеРаботниковОрганизаций.Сотрудник = &сотрудник
---
спасибо за идею, редко приходится заниматься такими вещами, поэтому некоторые простые вещи не улавливаю
---
написать 1 запрос и получить результат, а не жонглировать циклами и запросами!
---
Проверьте какие даты передаются в параметры запроса , может у вас в НачПериода на самом деле конечная дата
---
Спасибо, проверил, здесь все ок, к тому же в консоли все работает
---
Тоже склоняюсь к тому, что что-то не так с параметрами. Проверьте все параметры в консоли и в отчете. Может, сотрудник в отчете пустая ссылка, может не совпадает тип по виду занятости.
---
прошел снова в отладчике: все параметры правильные, при первом же анализе цикла пока Состояние.Следующий() - вываливаемся из цикла, т.е. нет записей, хотя должно быть 2 записи
---
Если выполняется в консоли и не выполняется в коде - 99%, что дело в параметрах. Проверяйте не только значения, но и типы.
---
спасибо за совет, дело именно в типах параметров
---
хотя должно быть 2 записи глянуть бы обработку - где вы параметры определяете и когда
---
как вы запускаете этот внешний отчет? нет ли у него пересечения по имени с доп отчетом другим ?
---
```1c
    И СостояниеРаботниковОрганизаций.Сотрудник.ВидЗанятости = &осн
    И СостояниеРаботниковОрганизаций.Сотрудник = &сотрудник
```

Условие какое-то избыточное. Может перепутан основной сотрудник и совместитель?
---
думаю избыточности нет т.к. отчет может еще работать с подразделениями, в этом случае посыплются все сотрудники и их нужно отфильтровывать
---
НачПериода и КонПериода не заданы.
---
остальное все работает как нужно