Новости для бухгалтера, бухучет, налогообложение, отчетность, ФСБУ, прослеживаемость и маркировка, 1С:Бухгалтерия

Вход или Регистрация

Показывать по 10 20 40 сообщений
Новая тема Ответить
Письмо в техподдержку 1С
[1С:Предприятие 7.7]

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

Cyril
читатель
офлайн
Дата регистрации: 06.08.2003
Сообщений: 79
Пост №1
 
08.12.2017 13:27

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

Ответили: пост №2
Valentin46
читатель
офлайн
Дата регистрации: 10.02.2011
Сообщений: 1041
Пост №2
 
08.12.2017 14:01
Ответ на пост №1

Cyril, во первых, следовало бы указать конфигурацию.
Во вторых - показать хотя бы фрагмент запроса, которым отбираются документы.

А так, самая общая подсказка - написать соответствующий запрос.

Ответили: пост №3
Cyril
читатель
офлайн
Дата регистрации: 06.08.2003
Сообщений: 79
Пост №3
 
08.12.2017 14:16
Ответ на пост №2

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

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

Денис (САМАРА)
читатель
офлайн
Дата регистрации: 09.04.2008
Сообщений: 8351
Пост №4
 
08.12.2017 16:53

Тот случай, когда понимаешь, что "восьмерошные" запросы это благо для разработчика после "семерошных". :)

Vladko
читатель
офлайн
Дата регистрации: 27.08.2007
Сообщений: 2649
Пост №5
 
11.12.2017 14:12

Cyril пишет:

Цитата

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

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

Кошки Рулят
активный пользователь
офлайн
Дата регистрации: 20.04.2017
Сообщений: 50
Пост №6
 
20.12.2017 03:52

Cyril пишет:

Цитата

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

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

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

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

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

      

А так, желательно сюда ещё добавить функцию,
Чушь.

Показывать по 10 20 40 сообщений

Читают тему:

1 гостей
Быстрый переход
Для технических специалистов
  • Книга жалоб и предложений по работе сайта
  • Для технических специалистов
  • Представление регламентированной отчетности
  • Говорильня
  • Бухгалтерский учет: обсуждаем проекты нормативных актов и рекомендаций по ведению учета от БМЦ
  • Новый порядок применения ККТ (онлайн кассы с передачей сведений в ФНС)
  • Интернет-конференция: Оформление командировок по новым правилам
  • МАРКИРОВКА
  • ЕГАИС
  • Учет, налогообложение, автоматизация