Cyril пишет:
Цитата |
---|
Есть документы - договора, в которых поля: ФИО, Начало, Окончание (даты). Нужно в обработке подсчитать договора. Но таким образом, что считать только те договора, в которых пересекаются сроки. Т.е., если один договор является продолжением другого - его не считать. Подскажите как. |
Условие подсчета выглядит бессмысленным.
Почему договора разных ФИО у которых не пересекаются сроки считаются продолжением?
А так, ответ на вопрос очевиден: за один проход организовать проверку такого условия внутри самого запроса не получится.
Или двумя запросами, или с использованием внешней функции, которая будет выполнять по сути роль итогов первого запроса при выполнении второго.
А причина проблем с запросом - в неправильном проектировании базы. Данные необходимые для отчета должны быть в готовом виде уже в самой базе. Перебирать (не суть запросом или перебором) все документы в базе за все периоды - это не просто дурной тон программирования, это не допустимо в принципе. Подобные запросы с ростом базы сначала начнут тормозить, потом виснуть, а потом будут просто валить базу.
А так-то вот код "в два прохода"
Код |
---|
Перем ТаблЗн;
Функция ЯвляетсяПродолжением(Договор,СрокС,СрокПо)
Рез=0;
ТаблЗн.ВыбратьСтроки();
Пока ТаблЗн.ПолучитьСтроку() = 1 Цикл
Если ТаблЗн.Договор=Договор Тогда
Продолжить;
КонецЕсли;
Если ((ТаблЗн.СрокС>=СрокС) И (ТаблЗн.СрокПо<=СрокС)) ИЛИ ((ТаблЗн.СрокС<=СрокПо) И (ТаблЗн.СрокПо>=СрокПо)) Тогда
Рез=1;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Рез;
КонецФункции
Процедура Сформировать()
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса ="
|ОбрабатыватьДокументы все;
|Обрабатывать НеПомеченныеНаУдаление;
|Договор = Документ.Договор.ТекущийДокумент;
|СрокС = Документ.Договор.Начало;
|СрокПо = Документ.Договор.Окончание;
|Группировка Договор;
|"
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
ТаблЗн=СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТаблЗн,"Договор,СрокС,СрокПо");
ТекстЗапроса =
"
|ОбрабатыватьДокументы все;
|Обрабатывать НеПомеченныеНаУдаление;
|Договор = Документ.Договор.ТекущийДокумент;
|СрокС = Документ.Договор.Начало;
|СрокПо = Документ.Договор.Окончание;
|Группировка Договор;
|Условие((СрокС<=КонДата) и (СрокПо>=НачДата));
|Условие(ЯвляетсяПродолжением(Запрос.Договор,Запрос.СрокС, Запрос.СрокПо)=0);
|"
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
ТаблЗн.Очистить();
Запрос.Выгрузить(ТаблЗн,"Договор");
КолВоДокументов=ТаблЗн.КоличествоСтрок();
Сообщить(""+КолВоДокументов+" договоров");
КонецПроцедуры |
Если "за один проход", то ТаблЗн нужно заполнять в самой функции.
Vladko пишет:
Цитата |
---|
А так, желательно сюда ещё добавить функцию, |
Чушь.