8.х Цикл с делением пополам

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Rocsi, 12 май 2010.

  1. TopicStarter Overlay
    Rocsi
    Offline

    Rocsi

    Регистрация:
    4 май 2010
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Есть готовый запрос продажи по контрагентам,который отображает контрагентов,периоды,которым соответствует его покупка и сумма продажи.В этом запросе нужно написать цикл,который постоянно дробит этот период на два,проверяя наличие продаж в каждом полученном периоде и в случае отсутствия продаж останавливается.В общем цикл находит характерный период для каждого контрагента,главное чтобы в этом периоде была хотя бы одна продажа.Помогите с написанием этого цикла,пожалуйста?????Запрос прилагается!

    Вложения:

  2. Доктор Руфус Бейли
    Offline

    Доктор Руфус Бейли Опытный в 1С

    Регистрация:
    7 апр 2010
    Сообщения:
    277
    Симпатии:
    0
    Баллы:
    26
    Можно чуть (а лучше, сильно) подробнее (желательно, с примером)? Может, у меня голова по жаре не варит, но я не совсем понял задачу (если быть точнее, я её совсем не понял).
  3. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    :unsure: Доктор Руфус Бейли, тут тема была на днях, ее посмотрите. (http://www.1c-pro.ru/index.php?showtopic=23554)
  4. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    Рекурсивную процедуру сделайте. Правда она пойдет или в одну сторону (к началу периода или к концу периода). Нужно подумать над условиями выхода из процедур. Я вам дам направление, а развивайте его вами:
    Код:
    Функция КоличествоПродажЗаПериод(НачалоПериода,КонецПериода)
    
    // запрос количества продаж за период
    Запрос = Новый Запрос;
    Запрос.Текст = "
    |ВЫБРАТЬ
    |	ПродажиОбороты.ДокументПродажи,
    |	1 КАК КоличествоПродаж
    |ИЗ
    |	РегистрНакопления.Продажи.Обороты(&НачалоПериода, КОНЕЦПЕРИОДА(&КонецПериода,ДЕНЬ), , ) КАК ПродажиОбороты
    |ИТОГИ
    |	СУММА(КоличествоПродаж)
    |ПО
    |	ОБЩИЕ";
    
    Запрос.УстановитьПараметр("НачалоПериода",НачалоПериода);
    Запрос.УстановитьПараметр("КонецПериода",КонецПериода);
    
    Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Выборка.Следующий(); 
    
    Если Выборка.КоличествоПродаж = Неопределено Тогда
    Сообщить("Продажи в периоде: " + НачалоПериода + " - " + КонецПериода + " не найдены.",СтатусСообщения.Важное);
    Возврат Неопределено;
    Иначе
    Сообщить("Продажи в периоде: " + НачалоПериода + " - " + КонецПериода + ", составляют " + Выборка.КоличествоПродаж,СтатусСообщения.Информация);
    СерединаПериода = НачалоДня(НачалоПериода + (КонецПериода-НачалоПериода)/2);
    КоличествоПродажЗаПериод(НачалоПериода,СерединаПериода);
    КоличествоПродажЗаПериод(СерединаПериода,КонецПериода);
    КонецЕсли; 
    
    
    КонецФункции
    

Поделиться этой страницей