Имя: Пароль:
1C
 
Преобразование значения к типу Число не может быть выполнено
0 Anilad
 
11.02.26
11:13
ЧИтаю книгу 1С:Предприятие 8.3. Практическое пособие разработчика. Примеры и типовые приемы. Издание 3-е. При расчете з/п выдает следующую ошибку:
Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
Преобразование значения к типу Число не может быть выполнено
{ОбщийМодуль.ПроведениеРасчетов.Модуль(35)}:ЗаписьРегистра.Результат = (ЗаписьРегистра.ИсходныеДанные/ВыборкаРезультата.Норма) * ВыборкаРезультата.Факт;
{Документ.НачисленияСотрудникам.МодульОбъекта(42)}:ПроведениеРасчетов.РассчитатьНачисления(Движения.Начисления,

[ОшибкаВоВремяВыполненияВстроенногоЯзыка, ОшибкаИспользованияВстроенногоЯзыка]

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

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

Модуль Документа:

Процедура ОбработкаПроведения(Отказ, Режим)
    //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    // регистр Начисления
    Движения.Начисления.Записывать = Истина;
    Для Каждого ТекСтрокаНачисления Из Начисления Цикл
        Движение = Движения.Начисления.Добавить();
        Движение.Сторно = Ложь;
        Движение.ВидРасчета = ТекСтрокаНачисления.ВидРасчета;
        Движение.ПериодДействияНачало = ТекСтрокаНачисления.ДатаНачала;
        Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
        Движение.ПериодРегистрации = Дата;
        Движение.БазовыйПериодНачало = ТекСтрокаНачисления.ДатаНачала;
        Движение.БазовыйПериодКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания);
        Движение.Сотрудник = ТекСтрокаНачисления.Сотрудник;
        Движение.ГрафикРаботы = ТекСтрокаНачисления.ГрафикРаботы;
        Движение.ИсходныеДанные = ТекСтрокаНачисления.Начислено;
    КонецЦикла;

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

Подскажите, пж, в чем проблема
1 mikecool
 
11.02.26
11:14
Null, Неопределено - выбирай на вкус
2 Гипервизор
 
11.02.26
11:17
(0) Вот тут у вас типа математика типа с числами:
(ИсходныеДанные / Норма) * Факт
Вот и проверьте тип этих значений в отладчике.
3 mikecool
 
11.02.26
11:24
моя ставка ВыборкаРезультата - пусто
4 Anilad
 
11.02.26
11:28
(3) пишет, что ВыборкаРезультата число со значением 20
5 Anilad
 
11.02.26
11:31
(2) везде тип число
6 PLUT
 
гуру
11.02.26
11:31
(4) ЗаписьРегистра.ИсходныеДанные какое значение? (в строке 35 по коду ашипки из (0))
7 Anilad
 
11.02.26
11:38
В общем гайс, оказалось, что я одному сотруднику неправильно написал период расчета зп. У меня зп рассчитывалась за 2026 год, а я ему поставил 2025))))) ахахахахах. 2 час с этой фигней возился лол
8 Гипервизор
 
11.02.26
11:44
(7) Малоинформативно.
9 Anilad
 
11.02.26
11:46
(8) какая тебе информация нужна?
10 Гипервизор
 
11.02.26
11:51
(9) Как связан неправильный период расчёта с ошибкой преобразования значения к типу Число?
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн