8.х Как посчитать в запросе))

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

  1. TopicStarter Overlay
    TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Ребята при открытии чека ККМ рассчитывается сдача документа, вот процедура.
    Код:
    Процедура РассчитатьСдачу()
       
        СтруктураПоиска = Новый Структура;
        СтруктураПоиска.Вставить("ВидОплаты", ПредопределенноеЗначение("Справочник.ВидыОплатЧекаККМ.Наличные"));
       
        СуммаНаличных  = 0;
        СтрокиНаличных = Объект.Оплата.НайтиСтроки(СтруктураПоиска);
       
        Для каждого СтрокаНаличных Из СтрокиНаличных Цикл
            СуммаНаличных = СуммаНаличных + СтрокаНаличных.Сумма;
        КонецЦикла;
       
        Сдача = Макс(Объект.Оплата.Итог("Сумма") - СуммаВсего, 0);
        Сдача = Мин(Сдача, СуммаНаличных);
       
    КонецПроцедуры
    
    Так вот мне надо получить сдачу в запросе для каждого чека, все выделенные значения имеются в запросе в виде отдельных полей, Мин Макс мне не катит, я правильно понимаю надо брать разницу и смотреть на то отрицательное значение или нет и так выбирать мин макс?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    В запросе ты не выберешь мин/макс просто :)
    Сдача - это ж разница между количеством денег оплаченных по факту и стоимости товаров в чеке.
    Если ты знаешь какая сумма была для оплаты каждого чека, то считается СуммаОплаты - СуммаЧека :)
  3. TopicStarter Overlay
    TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Да в том то и дело что в сумму оплаты могут войти другие оплаты, безнал, бонусы, и т.д. А сдача только с наличных дается).. Ну значит буду через вычитание и смотреть меньше нуля или больше)
  4. flax
    Offline

    flax Новичок в 1С

    Регистрация:
    21 авг 2015
    Сообщения:
    9
    Симпатии:
    2
    Баллы:
    4
    думаю можно поставить в запросе условие ( ВидОплаты = Значение(Справочник.ВидыОплатЧекаККМ.Наличные)) далее как правильно заметил nomad_irk СуммаОплаты - СуммаЧека, а далее можно сделать как отдельный пакет на вычисление Сдачи.
  5. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.431
    Симпатии:
    372
    Баллы:
    104
    Если есть процедура которая рассчитывает сдачу в чеке, то полученное значение где-то в чеке и фиксируется скорее всего
  6. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    нет, сдача - это реквизит формы ЧекаККМ ибо хранить эту информацию вообще бессмысленно.
  7. TopicStarter Overlay
    TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Молодой да активный или бот чей?))
    Смысл в том что оплата может быть и безналом и бонусами и их соотношение не известно, он может наличкой оплатить 1000 рублей, а вот сколько сдачи ему дать не понятно) но я уже сделал как хотел работает.

    Код:
    ВЫБРАТЬ
        СУММА(ЧекККМ.СуммаДокумента) КАК СуммаДокумента,
        ЧекККМ.Ссылка
    ПОМЕСТИТЬ СуммаЧека
    ИЗ
        Документ.ЧекККМ КАК ЧекККМ
    ГДЕ
        ЧекККМ.Проведен = ИСТИНА
        И ЧекККМ.ПометкаУдаления = ЛОЖЬ
        И ЧекККМ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
    
    СГРУППИРОВАТЬ ПО
        ЧекККМ.Ссылка
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ЧекККМОплата.Ссылка.Ссылка,
        СУММА(ЕСТЬNULL(ЧекККМОплата.Сумма, 0)) КАК Сумма
    ПОМЕСТИТЬ СуммаОплатыНаличнымиПоЧеку
    ИЗ
        Документ.ЧекККМ.Оплата КАК ЧекККМОплата
    ГДЕ
        ЧекККМОплата.ВидОплаты = ЗНАЧЕНИЕ(Справочник.ВидыОплатЧекаККМ.Наличные)
    
    СГРУППИРОВАТЬ ПО
        ЧекККМОплата.Ссылка.Ссылка
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        СУММА(ЕСТЬNULL(ЧекККМОплата.Сумма, 0)) КАК Сумма,
        ЧекККМОплата.Ссылка.Ссылка
    ПОМЕСТИТЬ СуммаОплатыПоЧеку
    ИЗ
        Документ.ЧекККМ.Оплата КАК ЧекККМОплата
    
    СГРУППИРОВАТЬ ПО
        ЧекККМОплата.Ссылка.Ссылка
    ;
    
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        СуммаЧека.Ссылка КАК Чек,
        СуммаЧека.СуммаДокумента,
        ЕСТЬNULL(СуммаОплатыНаличнымиПоЧеку.Сумма, 0) КАК ОплатаНаличными,
        СуммаОплатыПоЧеку.Сумма КАК ОплатаВсего,
        ЕСТЬNULL(ВЫБОР
                КОГДА СуммаОплатыНаличнымиПоЧеку.Сумма - (СуммаОплатыПоЧеку.Сумма - СуммаЧека.СуммаДокумента) > 0
                    ТОГДА СуммаОплатыПоЧеку.Сумма - СуммаЧека.СуммаДокумента
                ИНАЧЕ СуммаОплатыНаличнымиПоЧеку.Сумма
            КОНЕЦ, 0) КАК Сдача
    ИЗ
        СуммаЧека КАК СуммаЧека
            ЛЕВОЕ СОЕДИНЕНИЕ СуммаОплатыНаличнымиПоЧеку КАК СуммаОплатыНаличнымиПоЧеку
            ПО СуммаЧека.Ссылка = СуммаОплатыНаличнымиПоЧеку.Ссылка
            ЛЕВОЕ СОЕДИНЕНИЕ СуммаОплатыПоЧеку КАК СуммаОплатыПоЧеку
            ПО СуммаЧека.Ссылка = СуммаОплатыПоЧеку.Ссылка
    
    УПОРЯДОЧИТЬ ПО
        Чек
  8. flax
    Offline

    flax Новичок в 1С

    Регистрация:
    21 авг 2015
    Сообщения:
    9
    Симпатии:
    2
    Баллы:
    4
  9. TopicStarter Overlay
    TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Да вопрос не в том чтобы ограничить, наличку я выбрал, мне надо было посчитать сдачу, а точнее меня интересовало как реализовать вот этот кусок кода

    Код:
    Сдача = Макс(Объект.Оплата.Итог("Сумма") - СуммаВсего, 0);
        Сдача = Мин(Сдача, СуммаНаличных);
  10. flax
    Offline

    flax Новичок в 1С

    Регистрация:
    21 авг 2015
    Сообщения:
    9
    Симпатии:
    2
    Баллы:
    4
    Остальное математика, сложностей не вижу. Вариантов решений, масса.
    Можно было выбрать одну сумму с условием ВидОплаты = Значение(Справочник.ВидыОплатЧекаККМ.Наличные)
    Вторую с условием НЕ ВидОплаты = Значение(Справочник.ВидыОплатЧекаККМ.Наличные)
    И пожалуйста вычитать Сумму документа в разных вариациях и получится сдача.
  11. TopicStarter Overlay
    TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Ну так я вроде с ней справился)) просто затуп был.. вот и обратился.
  12. flax
    Offline

    flax Новичок в 1С

    Регистрация:
    21 авг 2015
    Сообщения:
    9
    Симпатии:
    2
    Баллы:
    4
    Возможно, а возможно ошибка все же есть. Все зависит от логики прикладного решения..
    Но если сумма оплаты по чеку может быть меньше суммы документа, то мне кажется что в сдачу будут вылетать отрицательные числа. Но возможно я ошибаюсь. Если не ошибаюсь , то я бы переделал:
    КОГДА СуммаОплатыНаличнымиПоЧеку.Сумма - (СуммаОплатыПоЧеку.Сумма - СуммаЧека.СуммаДокумента) > 0 //Минус на минус может быть плюс
    ТОГДА СуммаОплатыПоЧеку.Сумма - СуммаЧека.СуммаДокумента
    ИНАЧЕ СуммаОплатыНаличнымиПоЧеку.Сумма
    КОНЕЦ
    На
    КОГДА СуммаОплатыПоЧеку.Сумма - СуммаЧека.СуммаДокумента > 0
    ТОГДА СуммаОплатыПоЧеку.Сумма - СуммаЧека.СуммаДокумента
    ИНАЧЕ 0
    КОНЕЦ
  13. TopicStarter Overlay
    TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    По факту это был бы анулированный чек.. он бы не провелся.. а я только проведенные беру.Решение типовое поэтому эта ситуация исключается.
  14. flax
    Offline

    flax Новичок в 1С

    Регистрация:
    21 авг 2015
    Сообщения:
    9
    Симпатии:
    2
    Баллы:
    4
    В таком случае все это условие вообще не нужно:
    КОГДА СуммаОплатыНаличнымиПоЧеку.Сумма - (СуммаОплатыПоЧеку.Сумма - СуммаЧека.СуммаДокумента) > 0
    ТОГДА СуммаОплатыПоЧеку.Сумма - СуммаЧека.СуммаДокумента
    ИНАЧЕ СуммаОплатыНаличнымиПоЧеку.Сумма
    КОНЕЦ
    Ваша сдача всегда считается как: СуммаОплатыПоЧеку.Сумма - СуммаЧека.СуммаДокумента
    Впрочем, думаю что это уже не важно, всего хорошего успехов!

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