7.7 как создать переменную в запросе

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

  1. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Запрос лопатит документы.
    Вопрос как создать переменную чтобы означала Итог("Сумма") многострочной части документа.
  2. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Чтобы получить итоговую сумму используйте функцию Сумма:
    Код:
    "
    |ТекущийДокумент = Документ.{ИмяДокумента}.ТекущийДокумент;
    |Сумма = Документ.{ИмяДокумента}.Сумма;
    |Функция СуммаИтого = Сумма(Сумма);
    |Группировка ТекущийДокумент;
    |"
    
    
  3. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    У меня не получается всунуть Эту переменную (СуммаИтого) в условие запроса. Ругается.
    Делаю так:
    Код:
    	
    "//{{ЗАПРОС(Сформировать)
    |Период с НачДата по КонДата;
    |СуммаВзаиморасчетов = Документ.ЗаявкаПокупателя.СуммаВзаиморасчетов;
    |Сумма = Документ.ЗаявкаПокупателя.Сумма;
    |Функция СуммаИтого = Сумма(Сумма);
    |Группировка Документ;
    |Условие(СуммаВзаиморасчетов <>  СуммаИтого);
    |"//}}ЗАПРОС
    
    
    Мне нужно запросом взять только те документы в которых Взаиморасчеты не равны итоговой стоимости. Без этого условия смысла нет брать документы запросом, потому что все равно придется их перебором отсеивать.
  4. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    В условие значение агрегатной функции "засунуть" не получиться.
    Либо перебирать все документы, либо в документ добавлять реквизит (например, СуммаДокумента), который будет заполняться при записи документа.
  5. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Понял. Спасибо
  6. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Полный БРЕД. Можно и нужно использовать результат функции в запросе.

    Вот так вот сделайте:

    Код:
    |Условие(СуммаВзаиморасчетов <>  Запрос.СуммаИтого);
    
    
    
    
    [off]Asttoxa, вы похоже использовали какого-то робота для формирования заявок в ТиС и забыли про реквизит шапки....
    Иных поводов для написания такой проверки я не вижу.[/off]
  7. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Понял спасибо. Попробую сделать так.
    Эту проверку хочу сделать чтобы проверить на наличие таких документов. Потому что 1 документ мне попался с разными этими суммами. Других документов не обнаружено. Сейчас пытаюсь найти ошибку почему в этом документе была сумма различна.

    А вообще для чего сделали отдельный реквизит шапки "СуммаВзаиморасчетов" ?? Я как встречал этот реквизит используется в отчетах. Не ужели для того чтобы не использовать выше приведенные примеры запроса? :)
  8. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Если заявки не создаются сторонними разработками то смотрите в процедуре ПересчетСуммыВзаиморасчетов() модуля формы документа. Там эта переменная вычисляется.

    А вообще этот реквизит присутствует практически в большинстве документах ТиС - удобнее "двигать" регистры например.
  9. TopicStarter Overlay
    Asttoxa
    Offline

    Asttoxa Опытный в 1С

    Регистрация:
    18 май 2010
    Сообщения:
    525
    Симпатии:
    0
    Баллы:
    26
    Да скорее всего какой то внешняя обработка повлияла.
    Спасибо за пример буду использовать в будущем!
  10. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Сами то хоть код пробовали?

    Для примера.
    Есть 2 документа:
    Посмотреть вложение 8213

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

    Что я делаю не так?

    Вложения:

    • 0045.PNG
      0045.PNG
      Размер файла:
      18,8 КБ
      Просмотров:
      33
  11. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    А вы думаете нет?
    Посмотреть вложение 8214

    Вот пример запроса по вопросу из темы
  12. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Может я чего не так делаю, но приведенный код корректно работает только при наличии одной строки в табличной части и отсутствии номера группировки в выборе результата запроса.
  13. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Не знаю... У меня работает. После вашего примера проверял на 2х строках заявки (изначально действительно была одна). Работает
  14. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Попробуйте с двумя строками и равенством сумм (чтобы условие не выполнялось).
    У меня отбирает эти документы, как соответствующие условию.
  15. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Как ни странно но вот так (к примеру")
    Код:
    |Условие(800 = ТекущийДокумент.Итог(""Сумма""));
    
    
    работает
  16. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Вот же ж. Действительно работает.
  17. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    На счет использования функций в условиях, Угодник абсолютно прав - их не то, что бы можно, их НУЖНО использовать в условиях.
  18. Requin
    Offline

    Requin Опытный в 1С

    Регистрация:
    10 май 2010
    Сообщения:
    1.911
    Симпатии:
    2
    Баллы:
    29
    Вот про "нужность" по-подробнее.
    Значения функций, как я понимаю, накапливаются и сворачиваются по всем уровням группировок. С методологической точки зрения что дает условие на результат функции? На какие данные накладываются ограничения? На каждый уровень группировки, на старший уровень ("Итого"), на младший?

    И хоть убейте, не добился я работоспособности кода при наличии больше одной строки в табличной части (не говоря уже при наличии нескольких группировок) :angry:

    Код:
    Код:
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "
    |Период с НачДата по КонДата;
    |Без итогов;
    |ТекущийДокумент = Документ.ЗатратыУбоя_Эк.ТекущийДокумент;
    |Сумма = Документ.ЗатратыУбоя_Эк.Сумма;
    |СуммаЗатрат = Документ.ЗатратыУбоя_Эк.СуммаЗатрат;
    |Функция СуммаСумма = Сумма(Сумма);
    |Группировка ТекущийДокумент;
    |Условие(СуммаЗатрат <> Запрос.СуммаСумма);
    |";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    
    Пока Запрос.Группировка() = 1 Цикл
    Сообщить("" + Запрос.ТекущийДокумент);
    КонецЦикла;
    
    Пример 1:
    Два документа. В каждом по две строки. В документе №1 итоговая сумма по ТЧ равна сумме реквизита шапки, в документе №2 - нет.
    Посмотреть вложение 8218
    Результат:
    Пример 2:
    Те же условия, только в документе по одной строке.
    Посмотреть вложение 8219
    Результат:
    Пример 3:
    Меняем условие запроса на равенство. Документы из примера 1:
    Результат:
    Нулевой - ни один документ не найден.

    Короче: Стою на асфальте у лыжи абуты... :D

    Вложения:

    • 0046.PNG
      0046.PNG
      Размер файла:
      18,7 КБ
      Просмотров:
      15
    • 0047.PNG
      0047.PNG
      Размер файла:
      16,5 КБ
      Просмотров:
      15
  19. WaRDeR
    Offline

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

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Полагаю, что в этой строке
    Код:
    |Условие(СуммаЗатрат <> Запрос.СуммаСумма);
    
    Слово "запрос." лишнее.
  20. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    Не лишнее.. Без этого ключика - не взлетит))))) Попробуй

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