Вообщем непойму что тут не так:
Форма.Форма.Форма(528)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(33, 2)}: Синтаксическая ошибка "ЕСТЬNULL(ПредельнаяВеличинаБазыСтраховыхВзносовСрезПоследних.РазмерФОМС,"
<<?>>ЕСТЬNULL(ПредельнаяВеличинаБазыСтраховыхВзносовСрезПоследних.РазмерФОМС, 0)
Форма.Форма.Форма(528)}: Ошибка при вызове метода контекста (Выполнить)
Результат = Запрос.Выполнить();
по причине:
{(33, 2)}: Синтаксическая ошибка "ЕСТЬNULL(ПредельнаяВеличинаБазыСтраховыхВзносовСрезПоследних.РазмерФОМС,"
<<?>>ЕСТЬNULL(ПредельнаяВеличинаБазыСтраховыхВзносовСрезПоследних.РазмерФОМС, 0)
По теме из базы знаний
- Выдержки из книги Чистый код
- Как читать чужой код? Часть 3. Разбор и доработка запросов
- Зачем и как читать чужой код? Какой результат ожидаем получить? Основные подходы
- Чистый код. Мой взгляд на жизнь в макаронных джунглях. Часть 2
- Результаты ревью кода 1500+ решений каталога Инфостарт: наиболее частые ошибки разработчиков в коде
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Xershi, Запрос то я поправил, а вот следующая ошибка не в запросе, непойму что не так:
{Форма.Форма.Форма(280)}: Значение не является значением объектного типа (ПолучитьОбъект)
ДокументОбъект
= ДокументСсылка.ПолучитьОбъект();
{Форма.Форма.Форма(280)}: Значение не является значением объектного типа (ПолучитьОбъект)
ДокументОбъект
= ДокументСсылка.ПолучитьОбъект();
(5) 1cBokov, открываешь конфигуратор жмешь ф5 или отладка. Откроется предприятие, вывалит твою ошибку там подробнее-конфигуратор. Переходит на строку кода, там ставишь ф9 (точка останова). переходишь в предприятие вываливает ошибку и ты в отладчике в точке останова.
затем шифт+ф9 и вбей там ДокументСсылка
Вот так работают с отладчиком.
результат в студию.
затем шифт+ф9 и вбей там ДокументСсылка
Вот так работают с отладчиком.
результат в студию.
(47) 1cBokov, да посмотрел:
в Форме реквизит НачислениеОтпуска - строка, а надо ссылка.
1)
- Правильно, потому что
из
Возвращает Неопределено, можно исправить так:
2) А по основной ошибке - запрос пустой...
в Форме реквизит НачислениеОтпуска - строка, а надо ссылка.
1)
После закрытия обработки вывалило:
{Форма.Форма.Форма(3569)}: Значение не является значением объектного типа (Пустая)
Если Не НачислениеОтпуска.Пустая() Тогда
{Форма.Форма.Форма(3569)}: Значение не является значением объектного типа (Пустая)
Если Не НачислениеОтпуска.Пустая() Тогда
- Правильно, потому что
НачислениеОтпуска = ПолучитьДокументНачислениеОтпуска();
Функция ПолучитьДокументНачислениеОтпуска()
// Находим первый существующий документ "Начисление отпуска" с необходимыми нам параметрами
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| НачислениеОтпускаРаботникамОрганизаций.Ссылка КАК НачислениеОтпуска
|ИЗ
| Документ.НачислениеОтпускаРаботникамОрганизаций КАК НачислениеОтпускаРаботникамОрганизаций
|ГДЕ
| НачислениеОтпускаРаботникамОрганизаций.Комментарий ПОДОБНО &Комментарий
| И НачислениеОтпускаРаботникамОрганизаций.КомпенсацияОтпуска";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Комментарий", "### Расчет оценочных обязательств ###");
Результат = Запрос.Выполнить();
//++
Если Результат.Пустой() Тогда
Сообщить ("Ничего же нет!");
НачислениеОтпускаСсылка = Документы.НачислениеОтпускаРаботникамОрганизаций.ПустаяСсылка();
Возврат НачислениеОтпускаСсылка;
Иначе
//Ваш код
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
// Получаем документ объект на основании ссылки из запроса
НачислениеОтпускаОбъект = ВыборкаДетальныеЗаписи.НачислениеОтпуска.ПолучитьОбъект();
Иначе
// Попытка создания нового документа "Начисление отпуска"
Попытка
НачислениеОтпускаОбъект = Документы.НачислениеОтпускаРаботникамОрганизаций.СоздатьДокумент();
Исключение
НачислениеОтпускаОбъект = Неопределено;
КонецПопытки;
КонецЕсли;
// Возвращаемое значение "НачислениеОтпускаСсылка" равно либо "Неопределено", либо ссылке на документ "НачислениеОтпуска"
НачислениеОтпускаСсылка = Документы.НачислениеОтпускаРаботникамОрганизаций.ПустаяСсылка();
// Для корректной записи документа необходимо заполнить, чтобы поле "Сотрудник" было заполненным
Сотрудник = ПолучитьПервогоСотрудникаИзСправочника();
Если Сотрудник.Пустая() Тогда
Сообщить("Не выбран сотрудник. Возможно справочник ""Сотрудники"" не заполнен", СтатусСообщения.Важное);
Возврат НачислениеОтпускаСсылка;
КонецЕсли;
Если НачислениеОтпускаОбъект <> Неопределено Тогда
// Попытка изменения реквизитов существующего или вновь созданного документа "НачислениеОтпуска"
Попытка
НачислениеОтпускаОбъект.Организация = Организация;
НачислениеОтпускаОбъект.Сотрудник = Сотрудник;
НачислениеОтпускаОбъект.Дата = КонецПериода;
НачислениеОтпускаОбъект.ПериодРегистрации = НачалоПериода;
НачислениеОтпускаОбъект.ДатаНачалаСобытия = НачалоПериода;
НачислениеОтпускаОбъект.КомпенсацияОтпуска = Истина;
НачислениеОтпускаОбъект.ПорядокРасчетаКомпенсацииОтпуска = Перечисления.ПорядокРасчетаОтпуска.ПоКалендарнымДням;
НачислениеОтпускаОбъект.ПериодРасчетаСреднегоЗаработкаНачало = ПериодРасчетаСреднегоЗаработкаНачало;
НачислениеОтпускаОбъект.ПериодРасчетаСреднегоЗаработкаОкончание = ПериодРасчетаСреднегоЗаработкаОкончание;
НачислениеОтпускаОбъект.Комментарий = "### Расчет оценочных обязательств ###";
// Для релизов ЗУП начиная с 2.5.57.1 и УПП 1.3.31.1
Попытка
НачислениеОтпускаОбъект.ДатаВыплатыДохода = КонецПериода;
Исключение
// Заглушка
КонецПопытки;
// Установить номер документа с префиксом
НачислениеОтпускаОбъект.УстановитьНовыйНомер("##");
НачислениеОтпускаОбъект.Записать(РежимЗаписиДокумента.Запись);
НачислениеОтпускаСсылка = НачислениеОтпускаОбъект.Ссылка;
Исключение
Сообщить("" + ОписаниеОшибки());
КонецПопытки
Иначе
// Заглушка
КонецЕсли;
Возврат НачислениеОтпускаСсылка;
КонецЕсли;
КонецФункции
ПоказатьВозвращает Неопределено, можно исправить так:
НачислениеОтпускаСсылка = Документы.НачислениеОтпускаРаботникамОрганизаций.ПустаяСсылка();
2) А по основной ошибке - запрос пустой...
(7) vkozak, (7) // Получаем период расчета среднего заработка
СтруктураДаты = ПолучитьПериодРасчетаСреднегоЗаработка(Сотрудник);
ПериодРасчетаСреднегоЗаработкаНачало = СтруктураДаты.НачалоПериода;
ПериодРасчетаСреднегоЗаработкаОкончание = СтруктураДаты.КонецПериода;
ЗаполнениеДокументовЗК.ЗаполнитьДатыОтпуска(ПериодРасчетаСреднегоЗаработкаНачало, Дата(1,1,1), 1, "ДнейОтпуска", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ПустаяСсылка(), Ложь, "ДатаОкончания");
ДокументСсылка = НачислениеОтпуска;
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДокументОбъект.ПериодРасчетаСреднегоЗаработкаНачало = ПериодРасчетаСреднегоЗаработкаНачало;
ДокументОбъект.ПериодРасчетаСреднегоЗаработкаОкончание = ПериодРасчетаСреднегоЗаработкаОкончание;
ДокументОбъект.Сотрудник = Сотрудник;
ДокументОбъект.Организация = Организация;
ДокументОбъект.ДнейЧасовКомпенсацииОтпуска = 1;
ДокументОбъект.Записать();
Показать
(9) Swetlana, Вот откуда:
Функция ПолучитьДокументНачислениеОтпуска()
// Находим первый существующий документ "Начисление отпуска" с необходимыми нам параметрами
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| НачислениеОтпускаРаботникамОрганизаций.Ссылка КАК НачислениеОтпуска
|ИЗ
| Документ.НачислениеОтпускаРаботникамОрганизаций КАК НачислениеОтпускаРаботникамОрганизаций
|ГДЕ
| НачислениеОтпускаРаботникамОрганизаций.Комментарий ПОДОБНО &Комментарий
| И НачислениеОтпускаРаботникамОрганизаций.КомпенсацияОтпуска";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Комментарий", "### Расчет оценочных обязательств ###");
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
// Получаем документ объект на основании ссылки из запроса
НачислениеОтпускаОбъект = ВыборкаДетальныеЗаписи.НачислениеОтпуска.ПолучитьОбъект();
Иначе
// Попытка создания нового документа "Начисление отпуска"
Попытка
НачислениеОтпускаОбъект = Документы.НачислениеОтпускаРаботникамОрганизаций.СоздатьДокумент();
Исключение
НачислениеОтпускаОбъект = Неопределено;
КонецПопытки;
КонецЕсли;
// Возвращаемое значение "НачислениеОтпускаСсылка" равно либо "Неопределено", либо ссылке на документ "НачислениеОтпуска"
НачислениеОтпускаСсылка = Неопределено;
// Для корректной записи документа необходимо заполнить, чтобы поле "Сотрудник" было заполненным
Сотрудник = ПолучитьПервогоСотрудникаИзСправочника();
Если Сотрудник.Пустая() Тогда
Сообщить("Не выбран сотрудник. Возможно справочник ""Сотрудники"" не заполнен", СтатусСообщения.Важное);
Возврат НачислениеОтпускаСсылка;
КонецЕсли;
Если НачислениеОтпускаОбъект <> Неопределено Тогда
// Попытка изменения реквизитов существующего или вновь созданного документа "НачислениеОтпуска"
Попытка
НачислениеОтпускаОбъект.Организация = Организация;
НачислениеОтпускаОбъект.Сотрудник = Сотрудник;
НачислениеОтпускаОбъект.Дата = КонецПериода;
НачислениеОтпускаОбъект.ПериодРегистрации = НачалоПериода;
НачислениеОтпускаОбъект.ДатаНачалаСобытия = НачалоПериода;
НачислениеОтпускаОбъект.КомпенсацияОтпуска = Истина;
НачислениеОтпускаОбъект.ПорядокРасчетаКомпенсацииОтпуска = Перечисления.ПорядокРасчетаОтпуска.ПоКалендарнымДням;
НачислениеОтпускаОбъект.ПериодРасчетаСреднегоЗаработкаНачало = ПериодРасчетаСреднегоЗаработкаНачало;
НачислениеОтпускаОбъект.ПериодРасчетаСреднегоЗаработкаОкончание = ПериодРасчетаСреднегоЗаработкаОкончание;
НачислениеОтпускаОбъект.Комментарий = "### Расчет оценочных обязательств ###";
// Для релизов ЗУП начиная с 2.5.57.1 и УПП 1.3.31.1
Попытка
НачислениеОтпускаОбъект.ДатаВыплатыДохода = КонецПериода;
Исключение
// Заглушка
КонецПопытки;
НачислениеОтпускаОбъект.Записать(РежимЗаписиДокумента.Запись);
НачислениеОтпускаСсылка = НачислениеОтпускаОбъект.Ссылка;
Исключение
Сообщить("" + ОписаниеОшибки());
КонецПопытки
Иначе
// Заглушка
КонецЕсли;
Возврат НачислениеОтпускаСсылка;
КонецФункции
Показать
(10) 1cBokov, вот можно проще (если проблемы с отладкой):
Функция ПолучитьДокументНачислениеОтпуска()
// Находим первый существующий документ "Начисление отпуска" с необходимыми нам параметрами
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| НачислениеОтпускаРаботникамОрганизаций.Ссылка КАК НачислениеОтпуска
|ИЗ
| Документ.НачислениеОтпускаРаботникамОрганизаций КАК НачислениеОтпускаРаботникамОрганизаций
|ГДЕ
| НачислениеОтпускаРаботникамОрганизаций.Комментарий ПОДОБНО &Комментарий
| И НачислениеОтпускаРаботникамОрганизаций.КомпенсацияОтпуска";
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("Комментарий", "### Расчет оценочных обязательств ###");
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить ("Результат пустой, ничего нет =((");
Иначе
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Сообщить (ВыборкаДетальныеЗаписи.НачислениеОтпуска);
....
(ваш код)
....
КонецЕсли;
КонецФункции
Показать
(8) 1cBokov, А меня смутила вот эта строка
Переменная НачислениеОтпуска точно определена? Просто в коде нигде не видно, что
ДокументСсылка = НачислениеОтпуска;
Переменная НачислениеОтпуска точно определена? Просто в коде нигде не видно, что
НачислениеОтпуска = ПолучитьДокументНачислениеОтпуска();
// и затем уже
ДокументСсылка = НачислениеОтпуска;
(12) mefio, Вот в этом:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| НачислениеОтпускаРаботникамОрганизаций.Ссылка КАК НачислениеОтпуска
|ИЗ
| Документ.НачислениеОтпускаРаботникамОрганизаций КАК НачислениеОтпускаРаботникамОрганизаций
|ГДЕ
| НачислениеОтпускаРаботникамОрганизаций.Комментарий ПОДОБНО &Комментарий
| И НачислениеОтпускаРаботникамОрганизаций.КомпенсацияОтпуска";
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 1
| НачислениеОтпускаРаботникамОрганизаций.Ссылка КАК НачислениеОтпуска
|ИЗ
| Документ.НачислениеОтпускаРаботникамОрганизаций КАК НачислениеОтпускаРаботникамОрганизаций
|ГДЕ
| НачислениеОтпускаРаботникамОрганизаций.Комментарий ПОДОБНО &Комментарий
| И НачислениеОтпускаРаботникамОрганизаций.КомпенсацияОтпуска";
Попробуй так прописать:
НачислениеОтпускаОбъект = ВыборкаДетальныеЗаписи.НачислениеОтпуска.Значение.ПолучитьОбъект();
НачислениеОтпускаОбъект = ВыборкаДетальныеЗаписи.НачислениеОтпуска.Значение.ПолучитьОбъект();
Выделенное жирным есть точка останова.
Функция РассчитатьСуммуОтпуска(Сотрудник)
// Получаем период расчета среднего заработка
СтруктураДаты = ПолучитьПериодРасчетаСреднегоЗаработка(Сотрудник);
ПериодРасчетаСреднегоЗаработкаНачало = СтруктураДаты.НачалоПериода;
ПериодРасчетаСреднегоЗаработкаОкончание = СтруктураДаты.КонецПериода;
ЗаполнениеДокументовЗК.ЗаполнитьДатыОтпуска(ПериодРасчетаСреднегоЗаработкаНачало, Дата(1,1,1), 1, "ДнейОтпуска", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ПустаяСсылка(), Ложь, "ДатаОкончания");
ДокументСсылка = НачислениеОтпуска;
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДокументОбъект.ПериодРасчетаСреднегоЗаработкаНачало = ПериодРасчетаСреднегоЗаработкаНачало;
ДокументОбъект.ПериодРасчетаСреднегоЗаработкаОкончание = ПериодРасчетаСреднегоЗаработкаОкончание;
ДокументОбъект.Сотрудник = Сотрудник;
ДокументОбъект.Организация = Организация;
ДокументОбъект.ДнейЧасовКомпенсацииОтпуска = 1;
ДокументОбъект.Записать();
// Рассчитываем документ
мРассчитываемыеТаблицы = Новый Структура("Начисления,РасчетСреднего");
мРассчитываемыеТаблицы.Начисления = Истина;
мРассчитываемыеТаблицы.РасчетСреднего = Истина;
ДокументОбъект.Начисления.Очистить();
ДокументОбъект.РасчетСреднегоПоКалендарным.Очистить();
ДокументОбъект.РасчетСреднегоПоШестидневке.Очистить();
Попытка
ДокументОбъект.НДФЛ.Очистить();
Исключение
// Заглушка
КонецПопытки;
ДокументОбъект.Рассчитать(мРассчитываемыеТаблицы);
ДокументОбъект.Записать();
Сумма = ДокументОбъект.Начисления.Итог("Результат");
// Дополнительные сообщения о размере среднего заработка и начислений из документа "Начисление отпуска"
//Сообщить("***** Сотрудник: " + ДокументОбъект.Сотрудник);
//Сообщить("Отработано дней = " + ДокументОбъект.РасчетСреднегоПоКалендарным.Итог("ОтработаноДней"));
//Сообщить("Отработано часов = " + ДокументОбъект.РасчетСреднегоПоКалендарным.Итог("ОтработаноЧасов"));
//Сообщить("Сред.заработок = " + ДокументОбъект.РасчетСреднегоПоКалендарным.Итог("Результат"));
//Сообщить("Сумма начислено = " + ДокументОбъект.Начисления.Итог("Результат"));
Возврат Сумма;
КонецФункции
Функция РассчитатьСуммуОтпуска(Сотрудник)
// Получаем период расчета среднего заработка
СтруктураДаты = ПолучитьПериодРасчетаСреднегоЗаработка(Сотрудник);
ПериодРасчетаСреднегоЗаработкаНачало = СтруктураДаты.НачалоПериода;
ПериодРасчетаСреднегоЗаработкаОкончание = СтруктураДаты.КонецПериода;
ЗаполнениеДокументовЗК.ЗаполнитьДатыОтпуска(ПериодРасчетаСреднегоЗаработкаНачало, Дата(1,1,1), 1, "ДнейОтпуска", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ПустаяСсылка(), Ложь, "ДатаОкончания");
ДокументСсылка = НачислениеОтпуска;
ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
ДокументОбъект.ПериодРасчетаСреднегоЗаработкаНачало = ПериодРасчетаСреднегоЗаработкаНачало;
ДокументОбъект.ПериодРасчетаСреднегоЗаработкаОкончание = ПериодРасчетаСреднегоЗаработкаОкончание;
ДокументОбъект.Сотрудник = Сотрудник;
ДокументОбъект.Организация = Организация;
ДокументОбъект.ДнейЧасовКомпенсацииОтпуска = 1;
ДокументОбъект.Записать();
// Рассчитываем документ
мРассчитываемыеТаблицы = Новый Структура("Начисления,РасчетСреднего");
мРассчитываемыеТаблицы.Начисления = Истина;
мРассчитываемыеТаблицы.РасчетСреднего = Истина;
ДокументОбъект.Начисления.Очистить();
ДокументОбъект.РасчетСреднегоПоКалендарным.Очистить();
ДокументОбъект.РасчетСреднегоПоШестидневке.Очистить();
Попытка
ДокументОбъект.НДФЛ.Очистить();
Исключение
// Заглушка
КонецПопытки;
ДокументОбъект.Рассчитать(мРассчитываемыеТаблицы);
ДокументОбъект.Записать();
Сумма = ДокументОбъект.Начисления.Итог("Результат");
// Дополнительные сообщения о размере среднего заработка и начислений из документа "Начисление отпуска"
//Сообщить("***** Сотрудник: " + ДокументОбъект.Сотрудник);
//Сообщить("Отработано дней = " + ДокументОбъект.РасчетСреднегоПоКалендарным.Итог("ОтработаноДней"));
//Сообщить("Отработано часов = " + ДокументОбъект.РасчетСреднегоПоКалендарным.Итог("ОтработаноЧасов"));
//Сообщить("Сред.заработок = " + ДокументОбъект.РасчетСреднегоПоКалендарным.Итог("Результат"));
//Сообщить("Сумма начислено = " + ДокументОбъект.Начисления.Итог("Результат"));
Возврат Сумма;
КонецФункции
А где определена переменная "Начисление отпуска"?
Или это реквизит формы?
Она видимо не всегда заполнена - поэтому иногда и возникает ошибка
Или это реквизит формы?
Она видимо не всегда заполнена - поэтому иногда и возникает ошибка
как метод отладки - добавила вывод комментариев в функцию ПолучитьДокументНачислениеОтпуска()
запустите - скорее всего в запросе ничего не получено.
запустите - скорее всего в запросе ничего не получено.
Прикрепленные файлы:
Распределение оценочных обязательств №2_.epf
(63) 1cBokov, ДокументСсылка.НачислениеОтпускаРаботникамОрганизации. 1 Раз встречается при открытии формы, 2 раз в функции РассчитатьСуммуОтпуска и 3 при закрытии. Можно даже не реквизитом формы сделать, а вынести в реквизиты обработки, хотя не критично.
1cBokov, вот эта строка пропущена
НачислениеОтпуска = ПолучитьДокументНачислениеОтпуска();
на рисунке этой строки нет, а в обработке есть.
а как это возможно что на рисунке нет, а в обработке есть?
ДокументСсылка = НачислениеОтпуска;
переменная НачислениеОтпуска не определена
НачислениеОтпуска = ПолучитьДокументНачислениеОтпуска();
на рисунке этой строки нет, а в обработке есть.
а как это возможно что на рисунке нет, а в обработке есть?
ДокументСсылка = НачислениеОтпуска;
переменная НачислениеОтпуска не определена
Кстати. В Конфигураторе в "Отладка/Остановка по ошибке" есть.В открывшейся форме ставится самая верхняя галка, для первого раза посмотреть как работает хватит, и жмется ОК. С помощью этого можно просмотреть где, что валится.Нюанс: для конструкций "Попытка ... Исключение" в случае отработки исключения - сработает как на ошибку. Если вылезла ошибка можно сразу будет "Вычислить выражение" и дальше думать.
Прикрепленные файлы:
Спасибо всем огромное за решение этого вопроса, я всем благодарен, вопрос был решенен по ответу
ошибка была в этом - "Форме реквизит НачислениеОтпуска - строка, а надо ссылка. " ?
ошибка была в этом - "Форме реквизит НачислениеОтпуска - строка, а надо ссылка. " ?
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот