Подсчёт документов

Новая тема
Есть документы - договора, в которых поля: ФИО, Начало, Окончание (даты).
Нужно в обработке подсчитать договора. Но таким образом, что считать только те договора, в которых пересекаются сроки. Т.е., если один договор является продолжением другого - его не считать. Подскажите как.
Ответили: пост #2
Ответ на пост №1
Cyril, во первых, следовало бы указать конфигурацию.
Во вторых - показать хотя бы фрагмент запроса, которым отбираются документы.

А так, самая общая подсказка - написать соответствующий запрос.
Ответили: пост #3
Ответ на пост №2
Valentin46, конфигурация самописная на 1С 7.7.
Запрос такой:

Код
|ОбрабатыватьДокументы все;
|Обрабатывать НеПомеченныеНаУдаление;
|ФИО = Документ.Договор.ФИО;
|Договор = Документ.Договор.ТекущийДокумент;
|СрокС = Документ.Договор.Начало;
|СрокПо = Документ.Договор.Окончание;
|Группировка ФИО упорядочить по ФИО.Наименование без групп;  
|Условие((СрокС<=КонДата) и (СрокПо>=НачДата));
Тот случай, когда понимаешь, что "восьмерошные" запросы это благо для разработчика после "семерошных".  :)
Cyril пишет:
Цитата

Ответ на
пост №2
Valentin46 , конфигурация самописная на 1С 7.7.
Запрос такой:

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

      
      
Есть документы - договора, в которых поля: ФИО, Начало, Окончание (даты).
Нужно в обработке подсчитать договора. Но таким образом, что считать только те договора, в которых пересекаются сроки. Т.е., если один договор является продолжением другого - его не считать. Подскажите как.
Условие подсчета выглядит бессмысленным.
Почему договора разных ФИО у которых не пересекаются сроки считаются продолжением?
А так, ответ на вопрос очевиден: за один проход организовать проверку такого условия внутри самого запроса не получится.
Или двумя запросами, или с использованием внешней функции, которая будет выполнять по сути роль итогов первого запроса при выполнении второго.
А причина проблем с запросом - в неправильном проектировании базы. Данные необходимые для отчета должны быть в готовом виде уже в самой базе. Перебирать (не суть запросом или перебором) все документы в базе за все периоды - это не просто дурной тон программирования, это не допустимо в принципе. Подобные запросы с ростом базы сначала начнут тормозить, потом виснуть, а потом будут просто валить базу.

А так-то вот код "в два прохода"

Код
Перем ТаблЗн;
Функция ЯвляетсяПродолжением(Договор,СрокС,СрокПо) 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Рез=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ТаблЗн.ВыбратьСтроки();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Пока ТаблЗн.ПолучитьСтроку() = 1 Цикл
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Если ТаблЗн.Договор=Договор Тогда
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Продолжить;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;КонецЕсли;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Если ((ТаблЗн.СрокС>=СрокС) И (ТаблЗн.СрокПо<=СрокС)) ИЛИ ((ТаблЗн.СрокС<=СрокПо) И (ТаблЗн.СрокПо>=СрокПо)) Тогда
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Рез=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Прервать;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;КонецЕсли;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;КонецЦикла; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возврат Рез;
КонецФункции 
Процедура Сформировать()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Запрос = СоздатьОбъект("Запрос");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ТекстЗапроса ="
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|ОбрабатыватьДокументы все;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Обрабатывать НеПомеченныеНаУдаление;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Договор = Документ.Договор.ТекущийДокумент;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|СрокС = Документ.Договор.Начало;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|СрокПо = Документ.Договор.Окончание;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Группировка Договор; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возврат;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;КонецЕсли; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ТаблЗн=СоздатьОбъект("ТаблицаЗначений");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Запрос.Выгрузить(ТаблЗн,"Договор,СрокС,СрокПо");

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ТекстЗапроса = 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|ОбрабатыватьДокументы все;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Обрабатывать НеПомеченныеНаУдаление;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Договор = Документ.Договор.ТекущийДокумент;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|СрокС = Документ.Договор.Начало;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|СрокПо = Документ.Договор.Окончание;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Группировка Договор; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Условие((СрокС<=КонДата) и (СрокПо>=НачДата)); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|Условие(ЯвляетсяПродолжением(Запрос.Договор,Запрос.СрокС, Запрос.СрокПо)=0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Возврат;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;КонецЕсли; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ТаблЗн.Очистить();
 Запрос.Выгрузить(ТаблЗн,"Договор"); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;КолВоДокументов=ТаблЗн.КоличествоСтрок(); 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Сообщить(""+КолВоДокументов+" договоров");
КонецПроцедуры
Если "за один проход", то ТаблЗн нужно заполнять в самой функции.

Vladko пишет:
Цитата

      

А так, желательно сюда ещё добавить функцию,
Чушь.
Читают тему
(гостей: 1)

Быстрый переход