Версия для печати темы (https://pro1c.org.ua/index.php?s=14cfc3b56525f4c1ae6f2c1712f4164b&showtopic=66790)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Запрос работает неверно

Автор: andrew76 04.11.21, 16:06

Добрый вечер !

Имеется запрос на выборку данных из справочника.Вот только работает он не совсем корректно.
В выборку попадают записи,которых там быть не должно,а именно не выполняется условие (Перев_ф>=КонДата)
В отчет попадают все записи ,у которых заполнено значение поля из запроса Перев_ф,а должны попадать
записи,значение даты у которых должны быть больше или равны дате окончания периода КонДата.
В общем не выполняется последнее условие.
НачДата и КонДата -реквизиты начала и окончания периода на форме отчета.


Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Обрабатывать НеПомеченныеНаУдаление;
|Период с  НачДата по КонДата;
|Сотр       = Справочник.Данные.ТекущийЭлемент;
|Таб         = Справочник.Данные.ТекущийЭлемент.Код;  
|Прием_д  = Справочник.Данные.ТекущийЭлемент.ПриказОприеме.ДатаПриема;
|Перев_ф  = Справочник.Данные.ТекущийЭлемент.ПриказОПеревВФилиал.ДатаПеревода;
|Увол_д     = Справочник.Данные.ТекущийЭлемент.ПриказОбУвольнении.ДатаУвольнения;
|Увол_пр   = Справочник.Данные.ТекущийЭлемент.ПриказОбУвольнении;
|Без итогов;
|группировка Сотр;
|Условие((Стаж<=КонДата));
|Условие((ДатаЧисло(Увол_д)=0) или (Увол_д>=НачДата) или (Увол_д>=КонДата) или (Перев_ф>=КонДата));
|"//}}ЗАПРОС
;


Автор: Sharzem 04.11.21, 17:23

Цитата(andrew76 @ 04.11.21, 17:06) *
|Условие((ДатаЧисло(Увол_д)=0) или (Увол_д>=НачДата) или (Увол_д>=КонДата) или (Перев_ф>=КонДата));

Вас здесь ничего не смущает ?

Автор: andrew76 04.11.21, 17:29

Sharzem @ Сегодня, 20:23 * ,

Смущает то, что запрос как надо не работает.То ли скобок нет,то ли лишние скобки...

Автор: Sharzem 04.11.21, 17:41

andrew76 @ Сегодня, 18:29 * ,
Хорошо.
1. Зачем: (ДатаЧисло(Увол_д)=0) ?
2. Почему: (Увол_д>=НачДата) или (Увол_д>=КонДата) 44000000.gif (Какая разница ?)
3. Считаю что нужно заменить: или на и (Перев_ф>=КонДата). Если считаете правильными свои условия с Увол_д.

Мое мнение с которым Вы можете не соглашаться: Сделайте через выборку справочника с условием. Работать будет быстрее (проверено).

Автор: andrew76 04.11.21, 17:51

Цитата(Sharzem @ 04.11.21, 20:41) *
andrew76 @ Сегодня, 18:29 * ,
Хорошо.
1. Зачем: (ДатаЧисло(Увол_д)=0) ?
2. Почему: (Увол_д>=НачДата) или (Увол_д>=КонДата) 44000000.gif (Какая разница ?)
3. Считаю что нужно заменить: или на и (Перев_ф>=КонДата)

Мое мнение с которым Вы можете не соглашаться: Сделайте через выборку справочника с условием. Работать будет быстрее (проверено).


вообще то запрос не мною писан.и вопрос к самой организации данных тоже есть...
1.Увол_д = Справочник.Данные.ТекущийЭлемент.ПриказОбУвольнении.ДатаУвольнения;

по пункту 1.В выборку должны попадать сотрудники, у которых дата увольнения пустая-поэтому (ДатаЧисло(Увол_д)=0)
по пункту 2.Также в выборку должны попасть уволеные сотрудники ,даты увольнения которых должны быть больше или равны КонДата и больше или равны НачДата.
Также должны попадать в выборку те сотрудники у которых должно быть по условию (Перев_ф>=КонДата)

Автор: Sharzem 04.11.21, 18:10

andrew76 @ Сегодня, 18:51 * ,
Тогда так:
Условие(((ДатаЧисло(Увол_д)=0) или (Увол_д>=НачДата)) или (Перев_ф>=КонДата));
Должны попадать уволенные и не уволенные, а также те кого перевели.

Автор: andrew76 05.11.21, 17:14

Sharzem @ Вчера, 21:10 * ,

Запрос отработал также как и до переделки,т.е. опять не корректно, пока не переписал заново условие выборки :

|Условие(Стаж<=НачДата);
|Условие(((ДатаЧисло(Перев_ф)>0) и (Перев_ф>=КонДата)) ИЛИ ((Увол_д>=НачДата) И (ДатаЧисло(Перев_ф)=0)) ИЛИ ((ДатаЧисло(Увол_д)=0) И (ДатаЧисло(Перев_ф)=0)));

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua