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

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 64 28.08.18 08:49 Сейчас в теме
(1) Еще два варианта. 1-й: в отладчике сделать Запрос.Выполнить().Выгрузить(). Если дело не в параметрах - в таблице увидите свой результат. Если результат есть, тогда дело в названии переменной выборки. Синтакс-помощник показывает, что есть такая зарезервированная переменная.
12. Xershi 1551 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 1551 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 64 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 Сейчас в теме
остальное все работает как нужно
Оставьте свое сообщение

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