Имя: Пароль:
1C
1С v8
v8: Преобразование значения к типу Число не может быть выполнено
0 david91
 
10.04.13
00:54
Добрый всем день.
занимаюсь самообучением 1С предприятие 8.2 по книге М.Г.Радченко.
столкнулся с такой проблемой:
при расчете з/п выдает слидующую ошибку:
Преобразование значения к типу Число не может быть выполнено
                   ЗаписьРегистра.Результат=(ЗаписьРегистра.ИсходныеДанные/ВыборкаРезультата.Норма)*ВыборкаРезультата.Факт;

Текст программы:
Процедура РассчитатьНачисления(НаборЗаписейРегистра,ТребуемыйВидРасчета,СписокСотрудников)Экспорт
   
   Регистратор=НаборЗаписейРегистра.Отбор.Регистратор.Значение;
   
   //Рассчитать первичные записи.

   Если ТребуемыйВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Оклад Тогда
       
       Запрос=Новый Запрос;
       Запрос.Текст=
       "Выбрать
       |НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма,
       |НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
       |НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
       |ИЗ
       |РегистрРасчета.Начисления.ДанныеГрафика(Регистратор=&Регистратор И
       |ВидРасчета=&ВидРасчета И Сотрудник В(&СписокСотрудников))
       |КАК НачисленияДанныеГрафика";
       
       Запрос.УстановитьПараметр("Регистратор",Регистратор);
       Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета);
       Запрос.УстановитьПараметр("СписокСотрудников",СписокСотрудников);
       
       ВыборкаРезультата=Запрос.Выполнить().Выбрать();
       
       Для Каждого ЗаписьРегистра Из НаборЗаписейРегистра Цикл
           СтруктураНомер=Новый Структура("НомерСтроки");
           СтруктураНомер.НомерСтроки=ЗаписьРегистра.НомерСтроки;
           ВыборкаРезультата.Сбросить();
           Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер) Тогда
               Если ВыборкаРезультата.Норма=0 Тогда
                   Сообщение=Новый СообщениеПользователю;
                   Сообщение.Текст="Вид рассчета:Оклад-Нет рабочих дней в заданном периоде";
                   Сообщение.Сообщить();
                   ЗаписьРегистра.Результат=0;
               Иначе
                   //Рассчитать оклад по фактическому периоду и исходным данным

                   
                   
                   ЗаписьРегистра.Результат=(ЗаписьРегистра.ИсходныеДанные/ВыборкаРезультата.Норма)*ВыборкаРезультата.Факт;
                               
                   Сообщение=Новый СообщениеПользователю;
                   Сообщение.Текст="Выполнен расчет"+ЗаписьРегистра.Регистратор+"-"+ЗаписьРегистра.ВидРасчета+"-"+ЗаписьРегистра.Сотрудник;
                   Сообщение.Сообщить();
               КонецЕсли;
           КонецЕсли;
       КонецЦикла;    
       
       //Рассчитать вторичные записи

   ИначеЕсли ТребуемыйВидРасчета=ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда
       
       Запрос=Новый Запрос;
       Запрос.Текст=
       "ВЫБРАТЬ
       |    НачисленияБазаНачисления.НомерСтроки КАК НомерСтроки,
       |    НачисленияБазаНачисления.РезультатБаза КАК База
       |ИЗ
       |    РегистрРасчета.Начисления.БазаНачисления(&ИзмеренияОсновного,&ИзмеренияБазового,,Регистратор=&Регистратор И ВидРасчета=&ВидРасчета И Сотрудник В(&СписокСотрудников))
       |КАК НачисленияБазаНачисления";
       
       Измер=Новый Массив(1);
       Измер[0]="Сотрудник";
       
       Запрос.УстановитьПараметр("ИзмеренияОсновного",Измер);
       Запрос.УстановитьПараметр("ИзмеренияБазового",Измер);
       Запрос.УстановитьПараметр("Регистратор",Регистратор);
       Запрос.УстановитьПараметр("ВидРасчета",ТребуемыйВидРасчета);
       Запрос.УстановитьПараметр("СписокСотрудников",СписокСотрудников);
       
       ВыборкаРезультата=Запрос.Выполнить().Выбрать();
       
       Для Каждого ЗаписьРегистра ИЗ НаборЗаписейРегистра Цикл
           СтруктураНомер=Новый Структура("НомерСтроки");
           СтруктураНомер.НомерСтроки=ЗаписьРегистра.НомерСтроки;
           Выборкарезультата.Сбросить();
           Если ВыборкаРезультата.НайтиСледующий(СтруктураНомер)Тогда
               ЗаписьРегистра.Результат=ВыборкаРезультата.База*(10/100);
               Сообщение=Новый СообщениеПользователю;
               Сообщение.Текст="Выполнен расчет"+ЗаписьРегистра.Регистратор+"-"+ЗаписьРегистра.ВидРасчета+"-"+ЗаписьРегистра.Сотрудник;
               Сообщение.Сообщить();
           КонецЕсли;
       КонецЦикла;
       
   КонецЕсли;    
КонецПроцедуры

Искал такую же  ошибку в интернете, предлагали Использовать естьNull в запросе.., а как именно это сделать, подскажите, кто может!
1 Irbis
 
10.04.13
00:55
ЕстьNULL(ВыражениеИзЗапроса, ЗаменаДляNULL)
2 david91
 
10.04.13
01:26
а какое значение из полей надо приравнять к null?
в этом же фрагменте?

Запрос=Новый Запрос;
       Запрос.Текст=
       "Выбрать
       |НачисленияДанныеГрафика.ЗначениеПериодДействия КАК Норма,
       |НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия КАК Факт,
       |НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
       |ИЗ
       |РегистрРасчета.Начисления.ДанныеГрафика(Регистратор=&Регистратор И
       |ВидРасчета=&ВидРасчета И Сотрудник В(&СписокСотрудников))
       |КАК НачисленияДанныеГрафика";
3 zladenuw
 
10.04.13
01:38
ЗаписьРегистра.Результат=(ЗаписьРегистра.ИсходныеДанные/ВыборкаРезультата.Норма)*ВыборкаРезультата.Факт;
        тут
4 unkairosed
 
10.04.13
01:42
Запрос=Новый Запрос;
       Запрос.Текст=
       "Выбрать
       |isnull(НачисленияДанныеГрафика.ЗначениеПериодДействия,0) КАК Норма,
       |isnull(НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия,0) КАК Факт,
       |НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
       |ИЗ
       |РегистрРасчета.Начисления.ДанныеГрафика(Регистратор=&Регистратор И
       |ВидРасчета=&ВидРасчета И Сотрудник В(&СписокСотрудников))
       |КАК НачисленияДанныеГрафика";

На случай, если не заполнен график.
5 unkairosed
 
10.04.13
01:43
ЗаписьРегистра.Результат=(ЗаписьРегистра.ИсходныеДанные/ВыборкаРезультата.Норма)*ВыборкаРезультата.Факт;

Тут дополнительно предусмотреть вариант деления на 0.
6 david91
 
10.04.13
02:01
Запрос=Новый Запрос;
       Запрос.Текст=
       "Выбрать
       |isnull(НачисленияДанныеГрафика.ЗначениеПериодДействия,0) КАК Норма,
       |isnull(НачисленияДанныеГрафика.ЗначениеФактическийПериодДействия,0) КАК Факт,
       |НачисленияДанныеГрафика.НомерСтроки КАК НомерСтроки
       |ИЗ
       |РегистрРасчета.Начисления.ДанныеГрафика(Регистратор=&Регистратор И
       |ВидРасчета=&ВидРасчета И Сотрудник В(&СписокСотрудников))
       |КАК НачисленияДанныеГрафика";

На случай, если не заполнен график.


Добавил isnull, ошибка пропала, но при проведении результат не считает
7 unkairosed
 
10.04.13
02:29
Убедиться, что заполнены графики (в данном случае за период действия).
8 david91
 
10.04.13
03:02
К сожалению не в этом проблема, они заполнены.
9 unkairosed
 
10.04.13
03:16
Результат=0, если:

1) ЗаписьРегистра.ИсходныеДанные = 0 (проверить алгоритм формирования рабочего набора записей)
2) ВыборкаРезультата.Норма = 0 (не заполнен график за период действия)
3) ВыборкаРезультата.Факт = 0 (не заполнен график за период действия или вид расчета вытеснен)

Чтобы проверить, что именно равно 0, в отладчике заняться интимом вот с этим:

ЗаписьРегистра.Результат=(ЗаписьРегистра.ИсходныеДанные/ВыборкаРезультата.Норма)*ВыборкаРезультата.Факт;
10 david91
 
10.04.13
17:06
Все получилось! Спасибо большое!
Дело в графиках было, поставил в регистре расчета периодичность год, вместо месяца.
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.