8.х Агрегатные функции

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

  1. TopicStarter Overlay
    planfin
    Offline

    planfin

    Регистрация:
    17 май 2010
    Сообщения:
    48
    Симпатии:
    0
    Баллы:
    1
    Нетиповое решение. Версия 1С:Предприятие 8.1 (8.1.14.72)

    Уровень:начинающий

    Проблема состоит в следующем:

    Имеются два справочника: Доходы и Подразделения. Код дохода описан в данные как код и представляет собой строку цифр типа 38603010000000000180. Наименование подразделение описано в данных как Наименование тип строка. Индексация в описаниях данных везде разрешена.

    Далее в объекте Документы имеется база смет разных подразделений, где имеются суммы доходов по различным статьям доходов. Причем по отдельному подразделению может быть несколько смет с одним и тем же источником дохода.

    Задача состоит в том, чтобы сформировать сводную смету, где будут указаны суммы по всем статьям
    доходов.

    Код программы:

    Код:
    Выборка = Справочники.Доходы.Выбрать(); 
    Пока Выборка.Следующий() Цикл 
    Наименование = Выборка.Наименование; 
    КодДоходаПодраз = Выборка.Код;
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("КодДох", КодДоходаПодраз);
    Запрос.УстановитьПараметр("Подраз", Подразделение);
    //  Сообщить ("КД= "+КодДоходаПодраз +" Под= "+Подразделение);
    Запрос.Текст = "ВЫБРАТЬ
    |СУММА(Документ.БазаСмет.СуммаДохода) КАК СуммаПоСтатье  
    |ИЗ
    |Документ.БазаСмет
    |ГДЕ
    |Документ.БазаСмет.КодДохода = &КодДох И Документ.БазаСмет.Подразделение =           &Подраз ";
    
    Результат = Запрос.Выполнить().Выбрать();
    Результат.Следующий(); 
    Сумма = Результат.СуммаПоСтатье;
    //  Сообщить("сумма = "+Сумма);
    
    КонецЦикла; 
    
    
    
    
    

    В сообщениях Код дохода и Подразделение выдаются правильно, а сумма получается пустая.
    Подскажите, пожалуйста, что я делаю не так.
  2. sharik1c
    Offline

    sharik1c Опытный в 1С

    Регистрация:
    7 июл 2010
    Сообщения:
    56
    Симпатии:
    0
    Баллы:
    26
    КодДоходаПодраз = Выборка.Код
    заменить на
    КодДоходаПодраз = Выборка.Ссылка
  3. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    А что впринципе за кусок кода? Зачем запрос в цикле? Почему нельзя написать вместо всего этого один запрос с группировкой по "Документ.БазаСмет.КодДохода"?
  4. TopicStarter Overlay
    planfin
    Offline

    planfin

    Регистрация:
    17 май 2010
    Сообщения:
    48
    Симпатии:
    0
    Баллы:
    1
    Потому что надо найти суммы до каждому источнику дохода. Когда я нахожу общую сумму по всем доходам подразделения я использую запрос с группировкой по "Документ.БазаСмет.КодДохода, но после этого мне надо найти сумму по каждому источнику, а их может быть несколько - вот в чем фокус. Я, думаю, что это единственно возможный вариант в этом случае.
  5. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Не понимаю. Поясните "Источник дохода" - это что? (в приведенном куске кода, где фигурирует?) Почему нельзя добавить несколько группировок?
  6. TopicStarter Overlay
    planfin
    Offline

    planfin

    Регистрация:
    17 май 2010
    Сообщения:
    48
    Симпатии:
    0
    Баллы:
    1
    Источник дохода выражается кодом в тексте программы - КодДоходаПодраз = Выборка.Код.

    Я только начинаю работать с запросами и поэтому не могу представить себе как это сделать с несколькими группировками, ведь коды могут добавляться и даже изменяться, не вручную же их в программе вбивать? Коды я всегда буду брать из Справочники.Доходы.
  7. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Код:
    "ВЫБРАТЬ
    Документ.БазаСмет.КодДохода,
    СУММА(Документ.БазаСмет.СуммаДохода) КАК СуммаПоСтатье  
    ИЗ
    Документ.БазаСмет
    ГДЕ
    Документ.БазаСмет.Подразделение = &Подраз
    СГРУППИРОВАТЬ ПО
    Документ.БазаСмет.КодДохода
    ИТОГИ ПО
    ОБЩИЕ"
    
    
    Текст запроса как-то так. Подсуньте его "Конструктору запроса с обработкой результата", он вам сформирует циклы обхода.
  8. sharik1c
    Offline

    sharik1c Опытный в 1С

    Регистрация:
    7 июл 2010
    Сообщения:
    56
    Симпатии:
    0
    Баллы:
    26
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    | Доходы.Ссылка КАК Доход,
    | Доходы.Наименование,
    | БазаСмет.СуммаДохода КАК СуммаДохода,
    | БазаСмет.Ссылка КАК Регистратор
    |ИЗ
    | Справочник.Доходы КАК Доходы
    | ЛЕВОЕ СОЕДИНЕНИЕ Документ.БазаСмет КАК БазаСмет
    | ПО Организации.Ссылка = БазаСмет.КодДохода
    |ИТОГИ
    | СУММА(СуммаДохода)
    |ПО
    | ОБЩИЕ,
    | Доход";
    Результат = Запрос.Выполнить();
    ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    ВыборкаОбщийИтог.Следующий();
    // ВыборкаОбщийИтог
    ВыборкаДоход = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаДоход.Следующий() Цикл
    Сообщить("" + ВыборкаДоход.Наименование + " на сумму: " + ВыборкаДоход.СуммаДохода);
    ВыборкаДеталиРегистратор = ВыборкаДоход.Выбрать();
    Пока ВыборкаДеталиРегистратор.Следующий() Цикл
    // ВыборкаДеталиРегистратор если нужно
    // если нет то из запроса убрать
    КонецЦикла;
    КонецЦикла;
  9. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    sharik1c
    вот здесь "| ПО Организации.Ссылка = БазаСмет.КодДохода" вы вероятно хотели написать "| ПО Доходы.Ссылка = БазаСмет.КодДохода"
  10. sharik1c
    Offline

    sharik1c Опытный в 1С

    Регистрация:
    7 июл 2010
    Сообщения:
    56
    Симпатии:
    0
    Баллы:
    26
    Угу Побытрому конструктором на примере организации и др документа собрал пример и видать не все переименовал
  11. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Да, и кстати, проверить у меня естественно нет возможности, но есть такое предположение что может заработать не так как вы предполагали.
    (т.е. в итоговой выборке будут все равно только те "КодДохода", движения по которым отличны от 0, нулевых может не быть.
  12. TopicStarter Overlay
    planfin
    Offline

    planfin

    Регистрация:
    17 май 2010
    Сообщения:
    48
    Симпатии:
    0
    Баллы:
    1
  13. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    longplan для начала поместите сам запрос в консоль запросов, посмотрите, что там выдает.
  14. TopicStarter Overlay
    planfin
    Offline

    planfin

    Регистрация:
    17 май 2010
    Сообщения:
    48
    Симпатии:
    0
    Баллы:
    1
    Исправила на Доходы.Ссылка цифры появились, но не по отдельному, выбранному подразделению, а по всем.
  15. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Добавьте в запрос условие:
    Код:
    ГДЕ
    Документ.БазаСмет.Подразделение = &Подраз
    
  16. TopicStarter Overlay
    planfin
    Offline

    planfin

    Регистрация:
    17 май 2010
    Сообщения:
    48
    Симпатии:
    0
    Баллы:
    1
    Пытаюсь отладить программу, которую вы мне предложили
    Подскажите, пожалуйста, где у меня тут ошибка в запросе
    Код:
    Запрос.Текст = 
    "ВЫБРАТЬ
    | Доходы.Ссылка КАК Доход,
    | Доходы.Наименование,
    | БазаСмет.СуммаДохода КАК СуммаДохода,
    | БазаСмет.Ссылка КАК Регистратор
    |ИЗ
    | Справочник.Доходы КАК Доходы
    | ЛЕВОЕ СОЕДИНЕНИЕ Документ.БазаСмет
    |КАК БазаСмет
    | ПО Доходы.Ссылка = БазаСмет.КодДохода
    |ИТОГИ
    | СУММА(СуммаДохода)
    |ПО
    | ОБЩИЕ,
    | Доход 
    |ГДЕ  БазаСмет.Подразделение = &Подраз  ";
    
    
  17. sharik1c
    Offline

    sharik1c Опытный в 1С

    Регистрация:
    7 июл 2010
    Сообщения:
    56
    Симпатии:
    0
    Баллы:
    26
    Условие ГДЕ
    Раньше итогов ИТОГИ
  18. TopicStarter Overlay
    planfin
    Offline

    planfin

    Регистрация:
    17 май 2010
    Сообщения:
    48
    Симпатии:
    0
    Баллы:
    1
    Все получилось, просто супер. Спасибо еще раз.
  19. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    longplan настоятельно рекомендую освоить "Конструктор запросов". От руки запросы тоже конечно хорошо уметь писать, но конструктор сэкономит вам массу времени.

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