Имя: Пароль:
1C
1С v8
УПП: Деление на 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) Да, там все весьма своеобразно :) Да ладно, главное чтобы довольны были.
AdBlock убивает бесплатный контент. 1Сергей