|
УПП: Деление на 0 в модуле платежного ордера | ☑ | ||
---|---|---|---|---|
0
lamo4ok
25.04.12
✎
07:36
|
Есть такой документ в УПП, "Платежный ордер на поступление денежных средств: Приобретение иностранной валюты". При его проведении выскакивает такая вот ошибка, по кнопке "Подробно":
Ошибка при выполнении обработчика - 'ОбработкаПроведения' по причине: {ОбщийМодуль.УправлениеДенежнымиСредствами.Модуль(471)}: Ошибка при вызове метода контекста (Выполнить) по причине: Ошибка выполнения запроса по причине: Ошибка при выполнении операции над данными: Ошибка SQL: Деление на 0 по причине: Ошибка SQL: Деление на 0 по причине: Деление на 0 значения типа Numeric Подскажите, может быть в 8-ке можно как-нибудь по-человечески отлаживать запросы? Вот на всякий случай код функции, в которой происходит ошибка во время возврата значения: // Возвращает таблицу, аналогичную таблице "Расшифровка платежа" с добавленной колонкой "СуммаУпр" // Функция ПолучитьТаблицуПлатежейУпр(ДатаДокумента,ВалютаДокумента,Документ, ВидПлатежногоДокумента) Экспорт ВыбиратьДокументРасчетовСКонтрагентом = ( ВидПлатежногоДокумента = "ПлатежноеПоручениеВходящее" ИЛИ ВидПлатежногоДокумента = "ПлатежноеПоручениеИсходящее" ИЛИ ВидПлатежногоДокумента = "РасходныйКассовыйОрдер" ИЛИ ВидПлатежногоДокумента = "ПриходныйКассовыйОрдер" ИЛИ ВидПлатежногоДокумента = "ПлатежныйОрдерСписаниеДенежныхСредств" ИЛИ ВидПлатежногоДокумента = "ПлатежныйОрдерПоступлениеДенежныхСредств" ИЛИ ВидПлатежногоДокумента = "ПлатежноеТребованиеВыставленное" ИЛИ ВидПлатежногоДокумента = "ПлатежноеТребованиеПолученное" ИЛИ ВидПлатежногоДокумента = "ИнкассовоеПоручениеПолученное" ИЛИ ВидПлатежногоДокумента = "ИнкассовоеПоручениеПереданное" ИЛИ ВидПлатежногоДокумента = "АккредитивПереданный" ИЛИ ВидПлатежногоДокумента = "АккредитивПолученный"); КонтролироватьЗадолженности=( ВидПлатежногоДокумента = "ПлатежноеПоручениеИсходящее" ИЛИ ВидПлатежногоДокумента = "РасходныйКассовыйОрдер" ИЛИ ВидПлатежногоДокумента = "ПлатежныйОрдерСписаниеДенежныхСредств" ИЛИ ВидПлатежногоДокумента = "ПлатежноеТребованиеПолученное" ИЛИ ВидПлатежногоДокумента = "ИнкассовоеПоручениеПолученное" ИЛИ ВидПлатежногоДокумента = "АккредитивПереданный"); Запрос=Новый Запрос; Запрос.Текст="ВЫБРАТЬ РАЗРЕШЕННЫЕ | РасшифровкаПлатежаДок.ДоговорКонтрагента КАК ДоговорКонтрагента, | РасшифровкаПлатежаДок.ДоговорКонтрагента.ВидДоговора КАК ВидДоговора, | РасшифровкаПлатежаДок.ДоговорКонтрагента.КонтролироватьДенежныеСредстваКомитента КАК КонтролироватьДенежныеСредстваКомитента, | РасшифровкаПлатежаДок.ДоговорКонтрагента.ВалютаВзаиморасчетов КАК ВалютаВзаиморасчетов, | РасшифровкаПлатежаДок.ДоговорКонтрагента.РасчетыВУсловныхЕдиницах КАК РасчетыВУсловныхЕдиницах, | РасшифровкаПлатежаДок.ДоговорКонтрагента.ВедениеВзаиморасчетов КАК ВедениеВзаиморасчетов,"; Если КонтролироватьЗадолженности Тогда Запрос.Текст=Запрос.Текст+" | РасшифровкаПлатежаДок.ДоговорКонтрагента.КонтролироватьСуммуЗадолженности КАК КонтролироватьСуммуЗадолженности, | РасшифровкаПлатежаДок.ДоговорКонтрагента.КонтролироватьЧислоДнейЗадолженности КАК КонтролироватьЧислоДнейЗадолженности, | РасшифровкаПлатежаДок.ДоговорКонтрагента.ДопустимаяСуммаЗадолженности КАК ДопустимаяСуммаЗадолженности, | РасшифровкаПлатежаДок.ДоговорКонтрагента.ПроцентПредоплаты КАК ПроцентПредоплаты,"; Иначе Запрос.Текст=Запрос.Текст+" | ЛОЖЬ КАК КонтролироватьСуммуЗадолженности, | ЛОЖЬ КАК КонтролироватьЧислоДнейЗадолженности, | 0 КАК ДопустимаяСуммаЗадолженности, | 0 КАК ПроцентПредоплаты,"; КонецЕсли; Запрос.Текст=Запрос.Текст+" | ВЫБОР КОГДА НЕ РасшифровкаПлатежаДок.ДоговорКонтрагента=&ПустойДоговор | Тогда РасшифровкаПлатежаДок.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом | Иначе ЛОЖЬ КОНЕЦ КАК ВестиПоДокументамРасчетовСКонтрагентом, | РасшифровкаПлатежаДок.Сделка КАК Сделка," + ?(ВыбиратьДокументРасчетовСКонтрагентом, " | РасшифровкаПлатежаДок.ДокументРасчетовСКонтрагентом КАК ДокументРасчетовСКонтрагентом,", "") + " | РасшифровкаПлатежаДок.СуммаПлатежа КАК СуммаПлатежа, | РасшифровкаПлатежаДок.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов, | РасшифровкаПлатежаДок.СтатьяДвиженияДенежныхСредств КАК СтатьяДвиженияДенежныхСредств, | РасшифровкаПлатежаДок.ДокументПланированияПлатежа КАК ДокументПланированияПлатежа, | РасшифровкаПлатежаДок.ДокументПланированияПлатежа.ВключатьВПлатежныйКалендарь КАК ВключатьВПлатежныйКалендарь, | РасшифровкаПлатежаДок.Проект КАК Проект, | РасшифровкаПлатежаДок.СуммаПлатежаПлан КАК СуммаПлатежаПлан, | ВЫРАЗИТЬ | (ВЫБОР | КОГДА &ВалютаДокумента=&ВалютаУпрУчета ТОГДА РасшифровкаПлатежаДок.СуммаПлатежа | КОГДА (КурсыУпрУчета.Курс ЕСТЬ NULL) ИЛИ (КурсыДокумента.Курс ЕСТЬ NULL) ТОГДА 0 | КОГДА &ВалютаДокумента<>&ВалютаУпрУчета И КурсыДокумента.Курс <>0 И КурсыУпрУчета.Курс <>0 ТОГДА | РасшифровкаПлатежаДок.СуммаПлатежа*КурсыДокумента.Курс * КурсыУпрУчета.Кратность | / (КурсыУпрУчета.Курс * КурсыДокумента.Кратность) | ИНАЧЕ | 0 | КОНЕЦ КАК ЧИСЛО (15,2)) КАК СуммаУпр, | ВЫРАЗИТЬ | (ВЫБОР | КОГДА &ВалютаДокумента=&ВалютаРеглУчета ТОГДА РасшифровкаПлатежаДок.СуммаПлатежа | КОГДА (КурсыУпрУчета.Курс ЕСТЬ NULL) ИЛИ (КурсыДокумента.Курс ЕСТЬ NULL) ТОГДА 0 | КОГДА &ВалютаДокумента<>&ВалютаРеглУчета И КурсыДокумента.Курс <>0 ТОГДА | РасшифровкаПлатежаДок.СуммаПлатежа*КурсыДокумента.Курс | / КурсыДокумента.Кратность | ИНАЧЕ | 0 | КОНЕЦ КАК ЧИСЛО (15,2)) КАК СуммаРегл, | ВЫБОР | КОГДА КурсыДокумента.Курс ЕСТЬ NULL ТОГДА 0 | ИНАЧЕ КурсыДокумента.Курс КОНЕЦ Как КурсДокумента, | ВЫБОР | КОГДА КурсыДокумента.Кратность ЕСТЬ NULL ТОГДА 0 | ИНАЧЕ КурсыДокумента.Кратность КОНЕЦ Как КратностьДокумента, | ВЫБОР | КОГДА КурсыУпрУчета.Курс ЕСТЬ NULL ТОГДА 0 | ИНАЧЕ КурсыУпрУчета.Курс КОНЕЦ Как КурсУпрУчета, | ВЫБОР | КОГДА КурсыУпрУчета.Кратность ЕСТЬ NULL ТОГДА 0 | ИНАЧЕ КурсыУпрУчета.Кратность КОНЕЦ Как КратностьУпрУчета, | ЕСТЬNULL(ОстаткиВзаиморасчетовПоДокументам.СуммаВзаиморасчетовОстаток, ЕСТЬNULL(ОстаткиВзаиморасчетов.СуммаВзаиморасчетовОстаток, 0)) КАК СуммаВзаиморасчетовОстаток, | ВЫБОР КОГДА ОстаткиВзаиморасчетовПоДокументам.СуммаВзаиморасчетовОстаток ЕСТЬ NULL | ТОГДА | ЕСТЬNULL(ОстаткиВзаиморасчетов.СуммаУпрОстаток, 0) | КОГДА ЕСТЬNULL(ОстаткиВзаиморасчетов.СуммаВзаиморасчетовОстаток, 0) = 0 | ТОГДА | ЕСТЬNULL(ОстаткиВзаиморасчетов.СуммаУпрОстаток, 0) | ИНАЧЕ | ЕСТЬNULL(ОстаткиВзаиморасчетов.СуммаУпрОстаток, 0) * ЕСТЬNULL(ОстаткиВзаиморасчетовПоДокументам.СуммаВзаиморасчетовОстаток, 0) / ОстаткиВзаиморасчетов.СуммаВзаиморасчетовОстаток | КОНЕЦ КАК СуммаУпрОстаток |ИЗ | Документ."+ВидПлатежногоДокумента+".РасшифровкаПлатежа КАК РасшифровкаПлатежаДок | ЛЕВОЕ СОЕДИНЕНИЕ | РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДокумента, Валюта=&ВалютаУпрУчета) КАК КурсыУпрУчета | ПО ИСТИНА | ЛЕВОЕ СОЕДИНЕНИЕ | РегистрСведений.КурсыВалют.СрезПоследних(&ДатаДокумента, Валюта=&ВалютаДокумента) КАК КурсыДокумента | ПО ИСТИНА | ЛЕВОЕ СОЕДИНЕНИЕ | РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(,ДоговорКонтрагента В ( | ВЫБРАТЬ РАЗЛИЧНЫЕ | РасшифровкаПлатежаДокВнутр.ДоговорКонтрагента | ИЗ | Документ."+ВидПлатежногоДокумента+".РасшифровкаПлатежа КАК РасшифровкаПлатежаДокВнутр | ГДЕ РасшифровкаПлатежаДокВнутр.Ссылка = &Ссылка) | ) КАК ОстаткиВзаиморасчетов | ПО РасшифровкаПлатежаДок.ДоговорКонтрагента = ОстаткиВзаиморасчетов.ДоговорКонтрагента | И ВЫБОР КОГДА РасшифровкаПлатежаДок.Сделка В (&ПустыеСделки) ТОГДА Неопределено ИНАЧЕ РасшифровкаПлатежаДок.Сделка КОНЕЦ = ОстаткиВзаиморасчетов.Сделка | ЛЕВОЕ СОЕДИНЕНИЕ | РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Остатки(,ДоговорКонтрагента В ( | ВЫБРАТЬ РАЗЛИЧНЫЕ | РасшифровкаПлатежаДокВнутр.ДоговорКонтрагента | ИЗ | Документ."+ВидПлатежногоДокумента+".РасшифровкаПлатежа КАК РасшифровкаПлатежаДокВнутр | ГДЕ РасшифровкаПлатежаДокВнутр.Ссылка = &Ссылка) | ) КАК ОстаткиВзаиморасчетовПоДокументам | ПО РасшифровкаПлатежаДок.ДоговорКонтрагента.ВестиПоДокументамРасчетовСКонтрагентом = ИСТИНА | И РасшифровкаПлатежаДок.ДоговорКонтрагента = ОстаткиВзаиморасчетовПоДокументам.ДоговорКонтрагента | И ВЫБОР КОГДА РасшифровкаПлатежаДок.Сделка В (&ПустыеСделки) ТОГДА Неопределено ИНАЧЕ РасшифровкаПлатежаДок.Сделка КОНЕЦ = ОстаткиВзаиморасчетовПоДокументам.Сделка" + ?(ВыбиратьДокументРасчетовСКонтрагентом, " | И ВЫБОР КОГДА РасшифровкаПлатежаДок.ДокументРасчетовСКонтрагентом В (&ПустыеРасчетныеДокументы) ТОГДА Неопределено ИНАЧЕ РасшифровкаПлатежаДок.ДокументРасчетовСКонтрагентом КОНЕЦ = ОстаткиВзаиморасчетовПоДокументам.ДокументРасчетовСКонтрагентом", "") + " |ГДЕ | РасшифровкаПлатежаДок.Ссылка = &Ссылка"; // Получим ссылки пустых документов: ТипыСделок = Метаданные.РегистрыНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Измерения.Сделка.Тип.Типы(); МассивПустыхСделок = Новый Массив; Для каждого Элемент Из ТипыСделок Цикл МассивПустыхСделок.Добавить(Новый(Элемент)); КонецЦикла; ТипыРасчетныхДокументов = Метаданные.РегистрыНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.Измерения.ДокументРасчетовСКонтрагентом.Тип.Типы(); МассивПустыхРасчетныхДокументов = Новый Массив; Для каждого Элемент Из ТипыРасчетныхДокументов Цикл МассивПустыхРасчетныхДокументов.Добавить(Новый(Элемент)); КонецЦикла; Запрос.УстановитьПараметр("ПустыеСделки",МассивПустыхСделок); Запрос.УстановитьПараметр("ПустыеРасчетныеДокументы",МассивПустыхРасчетныхДокументов); Запрос.УстановитьПараметр("ДатаДокумента",ДатаДокумента); Запрос.УстановитьПараметр("ВалютаДокумента",ВалютаДокумента); Запрос.УстановитьПараметр("ВалютаУпрУчета",глЗначениеПеременной("ВалютаУправленческогоУчета")); Запрос.УстановитьПараметр("ВалютаРеглУчета",глЗначениеПеременной("ВалютаРегламентированногоУчета")); Запрос.УстановитьПараметр("Ссылка",Документ); Запрос.УстановитьПараметр("ПустойДоговор",Справочники.ДоговорыКонтрагентов.ПустаяСсылка()); Возврат Запрос.Выполнить().Выгрузить(); КонецФункции // ПолучитьТаблицуПлатежей() |
|||
1
Amra
25.04.12
✎
07:40
|
У тебя одно единственное место в запросе, где возможно деление на ноль. Без отладки не видишь?)))
|
|||
2
Amra
25.04.12
✎
07:41
|
Вру, в двух, но в обоих случаях по одной и тойже причине
|
|||
3
lamo4ok
25.04.12
✎
07:45
|
(1) (2) Нет, не вижу :) Просто уже голова вчера, когда решил сюда написать, ехала, да и вопрос остается вопросом - как эти запросы вообще нормальные люди отлаживают?
|
|||
4
Wobland
25.04.12
✎
07:46
|
(3) в консоли. ищи знаменатель деления в тексте запроса и много думай
|
|||
5
Wobland
25.04.12
✎
07:46
|
(4) *знаменатель дроби, ну да неважно ;)
|
|||
6
Amra
25.04.12
✎
07:47
|
РасшифровкаПлатежаДок.СуммаПлатежа*КурсыДокумента.Курс/ КурсыДокумента.Кратность с проверкой на ненулевой курс и без проверки на ненулевую кратность))
|
|||
7
lamo4ok
25.04.12
✎
07:48
|
(5) Знак деления, я понял :)
|
|||
8
DimVad
25.04.12
✎
07:48
|
(0) "может быть в 8-ке можно как-нибудь по-человечески отлаживать запросы" - ну, я не знаю, по-человечески я делаю или нет, но делаю так :
1. Останавливаюсь в отладчике в точке выполнения запроса. 2. Запускаю другую копию базы в режиме предприятия. 3. Копирую Запрос.Текст из отладчика в в "Консоль запросов". 4. Самое муторное - устанавливаю параметры в "Консоли запросов". 5. Получаю в "консоли" те же данные, что и в отладчике. 6. Начинаю разбирать отчет в консоли, смотреть, какие результаты выдают разные части запроса... |
|||
9
alkov
25.04.12
✎
07:51
|
(8) Всё это замечательно работает, пока в запросе не появляются временные таблицы в количестве пары десятков
|
|||
10
DimVad
25.04.12
✎
07:53
|
(9) Смотрим, какие результаты выдают временные таблицы. Чтобы не забыть - копирую эти результаты в файлики xml. Не говорю, что идеально - но помогает...
|
|||
11
lamo4ok
25.04.12
✎
07:57
|
(10) Да, этот способ сам собой напрашивается, но нет, он нечеловеческий, особенно когда остальные параметры твоей работы тоже малоидеальны - вроде работы через RDP или, прости господи, через тимвьювер.
|
|||
12
lamo4ok
25.04.12
✎
07:57
|
Да, в общем всем спасибо, коллективный разум опять победил тупизм бухов, забывавших время от времени проставлять кратность валютам. Всем спасибо :)
|
|||
13
Amra
25.04.12
✎
11:26
|
(12) Они еще и ручками добавляют валюты, а не из классификатора?))
|
|||
14
lamo4ok
28.04.12
✎
11:15
|
(13) Да, там все весьма своеобразно :) Да ладно, главное чтобы довольны были.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |