Запрос не выполняется в модуле внешнего отчета, в консоли выполняется
Добрый день.
Помогите с проблемой: простой запрос, в консоли работает как нужно, в модуле внешнего отчета нет. Не могу понять в чем причина.
Помогите с проблемой: простой запрос, в консоли работает как нужно, в модуле внешнего отчета нет. Не могу понять в чем причина.
ЗапросСостояние = Новый Запрос();
ЗапросСостояние.Текст = "ВЫБРАТЬ
| СостояниеРаботниковОрганизаций.Сотрудник КАК Сотрудник,
| СостояниеРаботниковОрганизаций.Состояние КАК Состояние,
| СостояниеРаботниковОрганизаций.Период КАК Период,
| СостояниеРаботниковОрганизаций.ПериодЗавершения
|ИЗ
| РегистрСведений.СостояниеРаботниковОрганизаций КАК СостояниеРаботниковОрганизаций
|ГДЕ
| СостояниеРаботниковОрганизаций.Период >= &НачПериода
| И СостояниеРаботниковОрганизаций.Период <= &КонПериода
| И СостояниеРаботниковОрганизаций.Сотрудник.ВидЗанятости = &осн
| И СостояниеРаботниковОрганизаций.Сотрудник = &сотрудник
|
|УПОРЯДОЧИТЬ ПО
| Сотрудник,
| Период";
ЗапросСостояние.УстановитьПараметр("КонПериода", КонецДня(КонПериода));
ЗапросСостояние.УстановитьПараметр("НачПериода", НачалоДня(НачПериода));
ЗапросСостояние.УстановитьПараметр("осн", Перечисления.ВидыЗанятостиВОрганизации.ОсновноеМестоРаботы);
ЗапросСостояние.УстановитьПараметр("сотрудник", Сотр);
РезультатЗапросаСостояние = ЗапросСостояние.Выполнить();
Состояние = РезультатЗапросаСостояние.Выбрать();
//****************************************************************************************
ДатНачЗаболевания = '00010101';
Пока Состояние.Следующий() Цикл
Если Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.Работает Тогда
Если БольничныйНаНачПериода = 1 Тогда
квоДней=(НачалоДня(Состояние.Период)-НачалоДня(НачПериода))/86400; //(60*60*24+1) НачалоДня(ВыборкаБольн1.Период)
ДатНач = НачалоДня(НачПериода); //НачалоДня(ВыборкаБольн1.Период);
ДатКон = НачалоДня(Состояние.Период);
Иначе
квоДней=(НачалоДня(Состояние.Период)-НачалоДня(ДатНачЗаболевания))/86400; //(60*60*24+1) НачалоДня(ВыборкаБольн1.Период)
ДатНач = НачалоДня(ДатНачЗаболевания);
ДатКон = НачалоДня(Состояние.Период);
ДатНачЗаболевания = '00010101';
КонецЕсли;
ИначеЕсли Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.Заболевание ИЛИ
РезультатЗапросаБольн.Состояние = Перечисления.СостоянияРаботникаОрганизации.ПоУходуЗаРебенком Тогда
ДатНачЗаболевания = РезультатЗапросаСостояние.Период;
КонецЕсли;
Если Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускЕжегодный ИЛИ
Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускУчебный ИЛИ
Состояние.Состояние = Перечисления.СостоянияРаботникаОрганизации.ОтпускПоБеременностиИРодам Тогда
Если НачалоДня(Состояние.ПериодЗавершения) >= НачалоДня(КонПериода) Тогда
квоДней = (НачалоДня(КонПериода) - НачалоДня(Состояние.Период))/86400;
ДатКон = НачалоДня(КонПериода);
Иначе
квоДней=(НачалоДня(Состояние.ПериодЗавершения)-НачалоДня(Состояние.Период))/86400; //(60*60*24+1)
ДатКон = КонецДня(Состояние.ПериодЗавершения);
КонецЕсли;
ДатНач = НачалоДня(Состояние.Период);
КонецЕсли;
КонецЦикла;
ПоказатьПо теме из базы знаний
- Сравнение 1С8 и Navision
- Консоль запросов для управляемых форм 8.3
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- Генератор внешних печатных форм
- Расследование ошибки "TCP Provider: An existing connection was forcibly closed by the remote host" и неожиданные результаты
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2)А что в нем странного?
За конкретный период отбираются состояния по сотруднику с видом занятости "основное рабочее место". В частности у сотрудника за февраль 2018 есть состояние "заболевание" и "работа" - выход на работу. В консоли запросов это все работает
За конкретный период отбираются состояния по сотруднику с видом занятости "основное рабочее место". В частности у сотрудника за февраль 2018 есть состояние "заболевание" и "работа" - выход на работу. В консоли запросов это все работает
(1) Еще два варианта. 1-й: в отладчике сделать Запрос.Выполнить().Выгрузить(). Если дело не в параметрах - в таблице увидите свой результат. Если результат есть, тогда дело в названии переменной выборки. Синтакс-помощник показывает, что есть такая зарезервированная переменная.
(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)Весь отчет уже давно работает, пришлось поменять только этот кусок с отбором невыходов по требованию бухов. Вот мой отчет.
Прикрепленные файлы:
Сверхурочка Новая версия от 24.08.2018.erf
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот