7.7 Непонятки с запросом

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем warden, 27 сен 2010.

  1. TopicStarter Overlay
    warden
    Offline

    warden

    Регистрация:
    9 мар 2010
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Почти типовая ТИС.
    Использую следующую конструкцию:
    Код:
    |Основание = Регистр.ПартииНаличие.ТекущийДокумент.ПеремещениеТМЦ.ДокОснование;
    |Функция Сумма2 = Максимум(ПолучитьСумму(Основание)) Когда (Основание.Вид() = ""ЗаявкаПокупателя"");
    
    
    Смысл - в случае, если основанием перемещения служит заявка покупателя, то сумму надо брать из нее (здесь сделано через внешнюю функцию, но можно и по другому; кроме максимума, можно использовать и минимум и среднее). Однако получаемая сумма округляется до целых величин. Как преодолеть?
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Использование внешних функций в запросе - дурной тон. Приведите полный текст запроса. Как группируете?
  3. TopicStarter Overlay
    warden
    Offline

    warden

    Регистрация:
    9 мар 2010
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Правда ваша, ну что поделать, если здесь язык не такой гибкий, как в 8.
    Текст запроса (конечно, ужас, но такие стоят задачи):
    Код:
    //{{ЗАПРОС(Реестр)
    Период С {ДатаН} По {ДатаК};
    Склад = Регистр.ПартииНаличие.Склад;
    ОтправительМагазин = Регистр.ПартииНаличие.Склад.Магазин;
    ПолучательМагазин = Регистр.ПартииНаличие.ТекущийДокумент.ПеремещениеТМЦ.СкладПолучатель.Магазин;
    ТекущийДокумент = Регистр.ПартииНаличие.ТекущийДокумент;
    Основание = Регистр.ПартииНаличие.ТекущийДокумент.ПеремещениеТМЦ.ДокОснование;
    Автор = Регистр.ПартииНаличие.ТекущийДокумент.Автор;
    Сумм = Регистр.ПартииНаличие.СуммаРуб;
    СуммПрод = Регистр.ПартииНаличие.ПродСтоимость;
    Группировка Автор;
    Группировка ТекущийДокумент;
    Функция Сумма = Расход(Сумм) Когда ((Основание.Вид() <> "ЗаявкаПокупателя") и (ПолучательМагазин = 1) и (ОтправительМагазин = 0));
    Функция Сумма2 = Максимум(ПолучитьСумму(Основание)) Когда ((Основание.Вид() = "ЗаявкаПокупателя") и (ПолучательМагазин = 1) и (ОтправительМагазин = 0));
    Функция СуммаРеал = Расход(СуммПрод); 
    
    
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Хм... А почему не получить сумму просто обращением к итогам документа в самом запросе? И для чего обязательно регистр? Можно же просто запросом к документам
  5. TopicStarter Overlay
    warden
    Offline

    warden

    Регистрация:
    9 мар 2010
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Это скорее из-за того, что изначально запрос был простым и держался полностью на регистре, это потом пришлось вводить хитрые условия, и все равно, даже сейчас, удобнее получать основную инфу из регистров, и уже отдельные суммы из документов.
    Возвращаясь к теме, можно сделать, например, так:
    Код:
    Сумма2 = Максимум(Основание.ПолучитьАтрибут("СуммаВзаиморасчетов"))
    
    или так:
    Код:
    Сумма2 = Максимум(Основание.Итог("Сумма"))
    
    То есть реализовать это без внешней процедуры можно, но на выходе получаешь тот же округленный результат. Гуру, откликнитесь! Где собака порылась?
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Попробуйте умножить на 100 и при выводе уже поделить...
  7. TopicStarter Overlay
    warden
    Offline

    warden

    Регистрация:
    9 мар 2010
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Любопытно...
    Работает, но только при использовании внешней функции, если умножать в самом запросе, то умножает уже округленную сумму.
    Еще столкнулся с тем, что неправильно считает итоги по автору в данной графе.
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    1)Умножение нужно производить ВНУТРИ функции запроса - допускается
    Код:
    Сумма2 = Максимум(Основание.Итог("Сумма")*100);
    
    
    2) КАК именно не правильно считается? Выводит "левые" цифры? Не верю. Попробуйте выгрузить результаты запроса в ТаблицуЗначений (с выводом функций и доп. преременных) и глянуть
  9. TopicStarter Overlay
    warden
    Offline

    warden

    Регистрация:
    9 мар 2010
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    1. В принципе можно, и умножает правильно, проблема в том, что умножает уже неправильную цифру - округленную.
    2. Здесь недоглядел сам - у меня функция максимум, поэтому и в итогах не сумма, а максимум.
    Замкнутый круг - функцию суммы нельзя поставить, потому что я получаю сразу итоговую цифру по доку (построчно нельзя, т.к. если поставить "Основание.Сумма", ругается на нецифровую переменную), а "Основание.Итог("Сумма")" запрос запрашивает столько раз, сколько строк в доке, то есть получится итог*количество строк. Кроме того, еще и округляет. Поэтому использую внешнюю функцию для получения итога и не использую функцию "сумма".
    Я в принципе понимаю, что раз у меня используется
    Код:
    	|Основание = Регистр.ПартииНаличие.ТекущийДокумент.ПеремещениеТМЦ.ДокОснование;
    
    
    и вид документа основания заранее не определен, то не выйдет просто указать строчный реквизит, который надо суммировать - запрос не знает, будет ли там такой реквизит, и ругается сразу. Если указывать строчный реквизит через ПолучитьАтрибут, работает, но тогда нет привязки к конкретной строке документа, и суммирует 0. То есть работает одно из двух - у меня либо правильно рассчитывается итого по документу, но тогда нельзя ставить функцию "сумма" и итог по колонке не такой, как надо, либо, если поставить функию "сумма", итог по колонке считает правильно, но суммы документов получаются заоблачные. Тупик?
    Еще один момент - с регистров не слезешь, ибо перемещения в типовой торговле, если идут не по розничному складу, сумму не учитывают в принципе, там сумма - только в движениях.
    Выход пока что вижу лишь один - делать тот же запрос без итогов, сливать в ТЗ и уже там свертками получать итоги. Может, у уважаемых гуру есть более элегантное решение?
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Ваше решение - один из выходов. Можно идти "от обратного" - вы цикле выбираем перемещения (тут же анализируем основание по условию), а суммы берем из используя метод ВыбратьДвиженияДокумента - здесь уже дело вкуса
  11. TopicStarter Overlay
    warden
    Offline

    warden

    Регистрация:
    9 мар 2010
    Сообщения:
    49
    Симпатии:
    0
    Баллы:
    1
    Согласен. Единственное - мне кажется, это не совсем дело вкуса, если учитывать, что скорость при выборке запросом и при помощи метода ВыбратьДокументы различается что-то около 10 раз. Плюс во втором случае еще и ВыбратьДвиженияДокумента к каждому применить надо.
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Опять же не могу не согласиться. Самое оптимальное - запросом с выгрузкой в ТЗ. Просто я хотел сказать что есть и альтернативный вариант
  13. PavelBaryshev
    Offline

    PavelBaryshev Опытный в 1С

    Регистрация:
    9 сен 2008
    Сообщения:
    316
    Симпатии:
    0
    Баллы:
    26
    Помогите с запросом пожалуйста, я в 77 вообще не работал, есть запрос который получает остатки товара на дату, мне нужно чтоб он еще получал себестоимость этого товара, вот сам запрос:
    Код:
    ТекстЗапроса="//{{ЗАПРОС(ОстаткиТоваров)
    |ПЕРИОД С ДатаКонца По ДатаКонца;";
    
    ТекстЗапроса = ТекстЗапроса +
    "//{{ЗАПРОС(ТоварыЗаПериоды)
    |Фирма=Регистр.ОстаткиТоваров.Фирма;
    |Склад=Регистр.ОстаткиТоваров.Склад;     
    |Цена=Регистр.ОстаткиТоваров.Товар.РозничнаяЦена;
    |ФлагУчета=Регистр.ОстаткиТоваров.ФлагУчета;
    |Товар=Регистр.ОстаткиТоваров.Товар;
    |Док=Регистр.ОстаткиТоваров.ТекущийДокумент;
    |Кол=Регистр.ОстаткиТоваров.ОстатокТовара; 
    |Функция НачКол  = НачОст(Кол);
    |Функция КонКол  = КонОст(Кол);
    |Функция ПрихКол = Приход(Кол);
    |Функция РасхКол = Расход(Кол);
    |Группировка Товар упорядочить по Товар.Наименование;
    //	|Условие (Фирма=ВыбФирма);
    |Условие (Фирма=ПустаяФирма);
    |"//}}ЗАПРОС
    
    что нужно дописать чтоб получить себестоимость?
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Озвучте конфигурацию.
    Не помню чтобы в стандартных конфах в регистре остатков была себестоимость... Только в партиях
  15. PavelBaryshev
    Offline

    PavelBaryshev Опытный в 1С

    Регистрация:
    9 сен 2008
    Сообщения:
    316
    Симпатии:
    0
    Баллы:
    26
    Верно, есть регистр ПартииТоваров, с него и нужно получить, вот только я не заню можно ли в 77 в одном запросе все это выбрать?
  16. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    да.
    Код:
    ...
    Товар=Регистр.ОстаткиТоваров.Товар,Регистр.ПартииТоваров.Товар;
    ...
    Себестоимость=Регистр.ПартииТоваров.Себестоимость;
    ....
    
    
    
    
    Только потом придется выгружать результат в таблицу значений для консолидации данных. Или учесть этот момент при выводе

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