Имя: Пароль:
1C
1С v8
Значение не является значением объектного типа
0 VSpicy
 
naïve
14.04.22
12:34
Всем доброго дня!
Подскажите пожалуйста как можно избавиться от вывода ошибки: Значение не является значением объектного типа (ГСМ)?
В моем случае "ГСМ" - является видом топлива (АИ-95, ДТ)

Ошибка происходит после выполнения запроса за определенный период по автомобилям.
Если в заданном периоде нет автомобилей (Пустой запрос) - то собственно и выводится вышеуказанная ошибка...

Запрос выполняется через: РезультатЗапроса = Запрос.Выполнить().Выгрузить();
т.к. использую в дальнейшем Цикл.
1 lEvGl
 
гуру
14.04.22
12:36
что то не сходится - дибо в результате что то есть, либо в цикл не попадет
2 lEvGl
 
гуру
14.04.22
12:37
странное у вас представление о программисте, судя по картинке в профиле
3 Kassern
 
14.04.22
12:41
(0) Это значит вы пытаетесь обратиться к ГСМ у объекта, который его не имеет.
Например: Номенклатура.ГСМ = АИ96, а у вас Номенклатура = неопределено)
4 hhhh
 
14.04.22
12:58
(0) строку программы покажите, где ошибка.
5 hhhh
 
14.04.22
12:58
(3) ставлю на РезультатЗапроса.ГСМ
6 dreizehn
 
14.04.22
13:09
(5) Ставлю на NULL в поле автомобиля
7 vicof
 
14.04.22
13:16
Ставки сделаны, ставок больше нет.
8 Йохохо
 
14.04.22
13:17
(7) ставлю ТС 2
9 hhhh
 
14.04.22
13:19
(7) похоже автор свалил и больше не появится.
10 VSpicy
 
naïve
14.04.22
14:06
(2) Это просто картинка) Был бы профи, тему не создавал...
11 VSpicy
 
naïve
14.04.22
14:07
(4) ОбластьПодвал.Параметры.ВидГСМ  =  ТекСтрока.ГСМ;
12 Kassern
 
14.04.22
14:08
(11) отладкой умеете пользоваться? Если да, то берете и каждый кусочек проверяете. Первым делом, "ТекСтрока" - что у вас показывает?)
13 Kassern
 
14.04.22
14:09
Вангую у вас
ТЗ=Запрос.Выполнить().Выгрузить();
Для Каждого ТекСтрока Из ТЗ Цикл
....
КонецЦикла:
ОбластьПодвал.Параметры.ВидГСМ  =  ТекСтрока.ГСМ;

Так да?)
14 lEvGl
 
гуру
14.04.22
14:10
да что там строка... давайте весь код от создания запроса до обход его результата
15 dreizehn
 
14.04.22
14:10
(11) ОбластьПодвал намекает на то, что ты выводишь это после цикла. А когда строк нет ТекСтрока неопределена.
16 Kassern
 
14.04.22
14:10
а потом, ой, а строчек то у меня нет и ТекСтрока = неопределено)
17 lEvGl
 
гуру
14.04.22
14:10
(13) ну и что, синтаксически работать будет
18 dreizehn
 
14.04.22
14:11
(17) "синтаксически работать" это как?
19 Kassern
 
14.04.22
14:11
(17) синтаксис не будет ругаться, это да) А вот на клиенте пошлет в пешее эротическое путешествие при пустом ТЗ))
20 lEvGl
 
гуру
14.04.22
14:11
а, ну да да, не будет
21 VSpicy
 
naïve
14.04.22
14:12
(13) Примерно так)...
22 Kassern
 
14.04.22
14:15
(21) объявите переменную ГСМ перед циклом и присвойте ей что-нить
В цикле переприсвойте данными из запроса, а в подвал уже ее и выводите вместо ТекСтрока.ГСМ
23 lEvGl
 
гуру
14.04.22
14:15
(18) это значит не споткнется при выполнении. а логически, даже при наличии строк, будет ошибка, т к подвал один, а строк много, писать в подвал значение последней строки перебора - ошибка, логическая
24 dreizehn
 
14.04.22
14:17
(23) > не споткнется при выполнении
Ну вот, спотыкается же ведь.
25 lEvGl
 
гуру
14.04.22
15:05
(24) я я, натюрлих
26 VSpicy
 
naïve
14.04.22
15:35
(14)     Сейчас пока так...На самом деле данные выдает нормально, вот только если в определенный период - в запросе пусто, то выползает ошибка: Значение не является значением объектного типа (ГСМ).

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

        Если ТекСтрока.Водитель <> Неопределено Тогда
            НайденнаяСтрока = ТаблицаДанныхПоВодителям.Найти(ТекСтрока.Водитель, "Водитель");
            Если НайденнаяСтрока = Неопределено Тогда
                СтруктураФИО = бит_вн_ОбщиеПроцедурыИФункции.бит_вн_ФИОФизЛицаСокращенно(ТекСтрока.Водитель, , , , Истина);
                НоваяСтрока = ТаблицаДанныхПоВодителям.Добавить();
                НоваяСтрока.Водитель                  = ТекСтрока.Водитель;
                НоваяСтрока.Представление              = СтруктураФИО;
            Иначе
                СтруктураФИО = НайденнаяСтрока.Представление;
            КонецЕсли;
         ОбластьСтроки.Параметры.ФИОВодителя = СтруктураФИО;
     КонецЕсли;
    
    ТабличныйДокумент.Вывести(ОбластьСтроки);
    КонецЦикла;
    КопияРезультатЗапроса = РезультатЗапроса.Скопировать();
                                                                                         
    ОбластьИтого = Макет.ПолучитьОбласть("Итого");
    ОбластьИтого.Параметры.ИтогоПробег             = КопияРезультатЗапроса.Итог ("Пробег");
    ОбластьИтого.Параметры.Расходфакт              = КопияРезультатЗапроса.Итог ("Расходфакт");
    ОбластьИтого.Параметры.ИтогоРасходНорма        = КопияРезультатЗапроса.Итог ("РасходНорма");
    ОбластьИтого.Параметры.ИтогоПерерасходЭкономия = КопияРезультатЗапроса.Итог ("ПерерасходЭкономия");

    ТабличныйДокумент.Вывести(ОбластьИтого);
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьПодвал.Параметры.ВидГСМ  = ТекСтрока.ГСМ;
    ТабличныйДокумент.Вывести(ОбластьПодвал);

        ДокументРезультат.Вывести(ТабличныйДокумент);
27 Kassern
 
14.04.22
15:36
(26) вам же я уже все расписал, почему такая ошибка и как ее устранить...
28 VSpicy
 
naïve
14.04.22
15:39
(27) у меня не получилось...(
Пример:
СтрокаГСМ = РезультатЗапроса;
ОбластьПодвал.Параметры.ВидГСМ  = СтрокаГСМ.ГСМ;
29 Kassern
 
14.04.22
15:44
(28) читаем еще раз внимательно:
1) объявите переменную ГСМ перед циклом. Где это у вас? Например ГСМ="", или ГСМ="Не указано".
2) В цикле переприсвойте данными из запроса. Где это у вас? Например ГСМ=ТекСтрока.ГСМ
3)а в подвал уже ее и выводите вместо ТекСтрока.ГСМ. Вы зачем то пихаете "СтрокаГСМ.ГСМ", когда можно просто ОбластьПодвал.Параметры.ВидГСМ=ГСМ
30 lEvGl
 
гуру
14.04.22
15:50
(29) у меня вопрос - зачем выводить печатную форму, если данных нет? просто пустую что ли. это о логике как раз.
могу предложить немного изменить эту логику таким образом

РезультатЗапроса = Запрос.Выполнить().Выгрузить();
Если ЗначениеЗаполнено(РезультатЗапроса) Тогда <-------------
    ТабличныйДокумент = Новый ТабличныйДокумент;
    
    ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
    ОбластьШапка.Параметры.ДатаС =  Формат(ОтчетОбъект.ДатаС, "ДЛФ=Д");
    ОбластьШапка.Параметры.ДатаПо =  Формат(ОтчетОбъект.ДатаПо, "ДЛФ=Д");
    ОбластьШапка.Параметры.ТС =  ОтчетОбъект.ТС;
        ТабличныйДокумент.Вывести(ОбластьШапка);
    
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ТабличныйДокумент.Вывести(ОбластьШапкаТаблицы);
    Для каждого ТекСтрока из РезультатЗапроса Цикл
        ОбластьСтроки = Макет.ПолучитьОбласть("Строка");
        ОбластьСтроки.Параметры.Заполнить(ТекСтрока);        
        СтруктураФИО = бит_вн_ОбщиеПроцедурыИФункции.бит_вн_ФИОФизЛицаСокращенно(ТекСтрока.Водитель, , , Истина);

        Если ТекСтрока.Водитель <> Неопределено Тогда
            НайденнаяСтрока = ТаблицаДанныхПоВодителям.Найти(ТекСтрока.Водитель, "Водитель");
            Если НайденнаяСтрока = Неопределено Тогда
                СтруктураФИО = бит_вн_ОбщиеПроцедурыИФункции.бит_вн_ФИОФизЛицаСокращенно(ТекСтрока.Водитель, , , , Истина);
                НоваяСтрока = ТаблицаДанныхПоВодителям.Добавить();
                НоваяСтрока.Водитель                  = ТекСтрока.Водитель;
                НоваяСтрока.Представление              = СтруктураФИО;
            Иначе
                СтруктураФИО = НайденнаяСтрока.Представление;
            КонецЕсли;
         ОбластьСтроки.Параметры.ФИОВодителя = СтруктураФИО;
     КонецЕсли;
    
    ТабличныйДокумент.Вывести(ОбластьСтроки);
    КонецЦикла;
    КопияРезультатЗапроса = РезультатЗапроса.Скопировать();
                                                                                          
    ОбластьИтого = Макет.ПолучитьОбласть("Итого");
    ОбластьИтого.Параметры.ИтогоПробег             = КопияРезультатЗапроса.Итог ("Пробег");
    ОбластьИтого.Параметры.Расходфакт              = КопияРезультатЗапроса.Итог ("Расходфакт");
    ОбластьИтого.Параметры.ИтогоРасходНорма        = КопияРезультатЗапроса.Итог ("РасходНорма");
    ОбластьИтого.Параметры.ИтогоПерерасходЭкономия = КопияРезультатЗапроса.Итог ("ПерерасходЭкономия");

    ТабличныйДокумент.Вывести(ОбластьИтого);
     ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьПодвал.Параметры.ВидГСМ  = ТекСтрока.ГСМ;
    ТабличныйДокумент.Вывести(ОбластьПодвал);

        ДокументРезультат.Вывести(ТабличныйДокумент);
Иначе <-------------
Предупреждение("Данных нет");<-------------
КонецЕсли;<-------------

и ошибки не будет и типа как "правильно"
31 unbred
 
14.04.22
15:53
(0) "Подскажите пожалуйста как можно избавиться от вывода ошибки"
ОбластьПодвал.Параметры.ВидГСМ  = "";
32 Kassern
 
14.04.22
15:55
(30) "зачем выводить печатную форму" - это уже пускай ТС решает. Может это только небольшая часть большой формы
33 VSpicy
 
naïve
14.04.22
15:58
(30) Вот это - вообще гениально!
Спасибо большое всем!!!
34 Kassern
 
14.04.22
16:02
(30) зачем вы ТС все расписали? Я на 99% уверен, что он не понял нифига, а просто копирнул текст ваш к себе...
35 VSpicy
 
naïve
14.04.22
16:29
(34)В итоге я понял по поводу: объявить переменную и т.п., но более оптимальный вариант (30).
Хотя Ваш вариант буду иметь ввиду на следующий раз! Спасибо отдельное!
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший