Имя: Пароль:
1C
1С v8
Divide by zero error encountered. 1С УТ
0 Avtokrator
 
03.06.13
12:03
Доброго времени суток, уважаемые Мастера.
Проблема немного не понятная.... В УТ 10.3.12.3, при проведении документа  "Поступление товаров и услуг" возникает ошибка:
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{ОбщийМодуль.ОбщегоНазначения(4191)}: Ошибка при вызове метода контекста (Выполнить)

по причине:
Ошибка выполнения запроса
по причине:
Ошибка при выполнении операции над данными:
Microsoft SQL Server Native Client 10.0: Divide by zero error encountered.
HRESULT=80040E14, SQLSrvr: SQLSTATE=22012, state=1, Severity=10, native=8134, line=1

Знаю, что программа делит на "0", но вот где ??? Ошибка ссылается на следующую функцию.

Функция СформироватьЗапросПоТабличнойЧасти(ДокументОбъект, ИмяТабличнойЧасти, СтруктураПолей,
                                          СтруктураСложныхПолей = Неопределено) Экспорт


   ТекстЗапроса = "";
   
   ДокументМетаданные = ДокументОбъект.Метаданные();

   Для Каждого Реквизит Из СтруктураПолей Цикл

       ТекстЗапроса  = ТекстЗапроса + ",
       |Док." + Реквизит.Значение +
       " КАК " + СокрЛП(Реквизит.Ключ);

   КонецЦикла;
   
   ТекстСоединение="";
   
   Запрос = Новый Запрос;

   Если ТипЗнч(СтруктураСложныхПолей) = Тип("Структура") Тогда // Добавим к запросу конструкции.
       
       Для Каждого Элемент Из СтруктураСложныхПолей Цикл
           
           ТекстЗапроса  = ТекстЗапроса + ",
           | " + Элемент.Значение +
           " КАК " + СокрЛП(Элемент.Ключ);
           
       КонецЦикла;
       
       Если СтруктураСложныхПолей.Свойство("Проект") Тогда
           
           ТекстСоединение="
           |ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УстановкаПроектовДляНоменклатуры.СрезПоследних(&ДатаДок, НоменклатураПроекта В (ВЫБРАТЬ Номенклатура ИЗ Документ." + ДокументМетаданные.Имя + "."+ СокрЛП(ИмяТабличнойЧасти) + " ГДЕ Ссылка = &ДокументСсылка)) КАК ПроектыНоменклатуры
           |ПО Док.Номенклатура=ПроектыНоменклатуры.НоменклатураПроекта";
           
           Запрос.УстановитьПараметр("ДатаДок",ДокументОбъект.Дата);
       КонецЕсли;
   КонецЕсли;
       
   Запрос.Текст = "ВЫБРАТЬ
               | Док.НомерСтроки " + ТекстЗапроса + "
               | ИЗ
               |      Документ." + ДокументМетаданные.Имя + "."+ СокрЛП(ИмяТабличнойЧасти) +
               " КАК Док"+ТекстСоединение+"
               |     ГДЕ Док.Ссылка = &ДокументСсылка";


   // Установим параметры запроса.
   Запрос.УстановитьПараметр("ДокументСсылка" , ДокументОбъект.Ссылка);
   
   Если ДокументОбъект[ИмяТабличнойЧасти].Количество() = 0 Тогда
       Запрос.Текст = СтрЗаменить(Запрос.Текст, "ГДЕ Док.Ссылка = &ДокументСсылка", "ГДЕ ЛОЖЬ");
   КонецЕсли;

   Возврат Запрос.Выполнить();

КонецФункции // СформироватьЗапросПоТабличнойЧасти()
1 Ненавижу 1С
 
гуру
03.06.13
12:04
в тексте запроса вестимо смотри
2 Avtokrator
 
03.06.13
12:05
Не понял....
3 zippygrill
 
03.06.13
12:06
"Возврат Запрос.Выполнить();" - ставь точку останова и смотри какие вычислительные операции у тебя в запросе.
4 Avtokrator
 
03.06.13
12:13
Проблема кроется тут, когда создается сам запрос:
"
Для Каждого Реквизит Из СтруктураПолей Цикл

       ТекстЗапроса  = ТекстЗапроса + ",
       |Док." + Реквизит.Значение +
       " КАК " + СокрЛП(Реквизит.Ключ);

   КонецЦикла;
"
Как, в таком запросе, сделать проверку на ноль, чтобы SQL отвязался?
5 mikecool
 
03.06.13
12:15
(4) не может тут быть деления на ноль, смотри на сформированный текст запроса в целом
да и запрос по реквизитам вроде не должен ничего делить, если не дописано уже отдельно
6 Avtokrator
 
03.06.13
12:18
Текст запроса, вытащенный из обработчика.

Запрос.Текст    "ВЫБРАТЬ
Док.НомерСтроки ,
Док.Номенклатура КАК Номенклатура,
Док.Количество * Коэффициент /Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Количество,
Док.Сумма КАК Сумма,
Док.СтавкаНДС КАК СтавкаНДС,
Док.СуммаНДС КАК НДС,
Док.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
Док.СерияНоменклатуры КАК СерияНоменклатуры,
Док.Номенклатура.ВестиПартионныйУчетПоСериям КАК ВестиПартионныйУчетПоСериям,
Док.Номенклатура.Услуга КАК Услуга,
Док.Номенклатура.Набор КАК Набор,
Док.Номенклатура.Комплект КАК Комплект,
Док.Заказ КАК Заказ,
Док.Заказ.СкладГруппа КАК СкладЗаказаПокупателя,
Док.Заказ.ДоговорКонтрагента.ОбособленныйУчетТоваровПоЗаказамПокупателей КАК ОбособленныйУчетТоваровПоЗаказамПокупателей,
Док.ЕдиницаИзмерения КАК ЕдиницаИзмерения,
Док.Ссылка.СкладОрдер КАК Склад,
Док.Ссылка.СкладОрдер.ВидСклада КАК ВидСкладаРазмещения,
Док.ПриходныйОрдер КАК ДокументПолучения,
Док.ПриходныйОрдер.Организация КАК ОрганизацияДокументаПолучения,
Док.ПриходныйОрдер.БезПраваПродажи КАК БезПраваПродажи,
Док.Цена КАК Цена,
Док.Коэффициент КАК Коэффициент,
Док.ПриходныйОрдер.Склад КАК ПриходныйОрдерСклад,
Док.Номенклатура.ВестиУчетПоСериям КАК УчетПоСериям,
Док.СерияНоменклатуры.СтранаПроисхождения КАК СтранаПроисхождения,
Док.СерияНоменклатуры.НомерГТД КАК НомерГТД,
Док.ЗаказПоставщику КАК ЗаказПоставщику
ИЗ
     Документ.ПоступлениеТоваровУслуг.Товары КАК Док
    ГДЕ Док.Ссылка = &ДокументСсылка"
7 Рэйв
 
03.06.13
12:18
Смотри где у тебя по тексту / и оборачивай делитель в

Выбор когда Делитель=0 Тогдв
   Делимое/1
   Иначе Делимое/Делитель
Колнец
8 Рэйв
 
03.06.13
12:19
вот тут имхо собака порылась

Док.Количество * Коэффициент /Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Количество,
9 mikecool
 
03.06.13
12:19
(7) когда делитель ноли и результат дб ноль
10 Рэйв
 
03.06.13
12:20
(9)Ну нет..Мало ли почему там коэффициент=0...Я бы не стал
11 Avtokrator
 
03.06.13
12:21
(8) Что посоветуете дописать ...? Как лучше всего обернуть?
12 mikecool
 
03.06.13
12:22
(11) коэффициенты проставить
13 Рэйв
 
03.06.13
12:23
Выбор Конда Номенклатура.ЕдиницаХраненияОстатков.Коэффициент =0 Тогда
  Док.Количество * Коэффициент
 Иначе
   Док.Количество * Коэффициент /Номенклатура.ЕдиницаХраненияОстатков.Коэффициент
КАК КАК Количество
14 Рэйв
 
03.06.13
12:23
И да..
(12) - лучше всего
15 mikecool
 
03.06.13
12:23
(10) а я бы стал... на каком основании цифиль должна быть без учета коэффициента? так и получаются 2000 м куб
16 Рэйв
 
03.06.13
12:24
(15)На том например что забыли поставить... И  что теперь обнулять количество?
17 Avtokrator
 
03.06.13
12:25
коэффициенты проставлены были до начала...
18 Avtokrator
 
03.06.13
12:27
Беру свои слова обратно в карточке товара не были проставлены коэффиценты....
19 mikecool
 
03.06.13
12:27
(16) да, можно выводить <---> туда, чтобы внимание обращали
20 mikecool
 
03.06.13
12:28
+19 в обчем, как то сигнализировать, иначе ошибок будет больше