База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Почему возникает ошибка «Значение не является значением объектного типа»? › Ответ в теме: Почему возникает ошибка «Значение не является значением объектного типа»?
Ошибка «Значение не является значением объектного типа (ПолучитьОбъект)» и «Ошибка чтения значения» в поле ДокументСсылка в выборке говорит о том, что в результате запроса поле ДокументСсылка не содержит корректного значения ссылки на объект.
Судя по скриншоту, в запросе:
|
1 2 3 4 5 6 7 |
|ВЫБРАТЬ | Документ.Ссылка КАК ДокументСсылка |ИЗ | Документ.ПоступлениеТМЦ КАК Документ |ГДЕ | Документ.Номер = &Номер | И Документ.Дата = &Дата |
вы пытаетесь получить ссылку на документ, но в выборке поле ДокументСсылка возвращает ошибку чтения значения.
Причина:
1. В запросе поле Документ.Ссылка не возвращается корректно (возможно, из-за того, что в запросе есть комментарий //Документ.Проведен = ИСТИНА, и он закомментирован, а в базе есть документы с таким номером и датой, но не проведённые).
2. В выборке вы вызываете Результат.Выбрать().ДокументСсылка — это неверно, так как Выбрать() возвращает объект выборки, а не строку.
Как правильно получить ссылку из результата запроса:
|
1 2 3 4 5 6 7 |
Выборка = Результат.Выбрать(); Если Выборка.Следующий() Тогда ДокументСсылка = Выборка.ДокументСсылка; Иначе Сообщить("Документ не найден"); Возврат; КонецЕсли; |
Далее, чтобы получить объект документа, нужно вызвать метод ПолучитьОбъект() у ссылки:
|
1 |
ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); |
—
Исправленный код процедуры:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
Процедура ОбновитьЕдиницыИзмеренияВПоступлении(НомерДокумента, ДатаДокумента) Запрос = Новый Запрос; Запрос.Текст = |ВЫБРАТЬ | Документ.Ссылка КАК ДокументСсылка |ИЗ | Документ.ПоступлениеТМЦ КАК Документ |ГДЕ | Документ.Проведен = ИСТИНА | И Документ.Номер = &Номер | И Документ.Дата = &Дата |"; Запрос.УстановитьПараметр("Номер", НомерДокумента); Запрос.УстановитьПараметр("Дата", ДатаДокумента); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Сообщить("Документ с номером " + НомерДокумента + " и датой " + Формат(ДатаДокумента, "ДФ=dd.MM.yyyy") + " не найден или не проведён."); Возврат; КонецЕсли; Выборка = Результат.Выбрать(); Если НЕ Выборка.Следующий() Тогда Сообщить("Документ не найден"); Возврат; КонецЕсли; ДокументСсылка = Выборка.ДокументСсылка; Если ТипЗнч(ДокументСсылка) <> Тип("Ссылка.Документ.ПоступлениеТМЦ") Тогда Сообщить("Получена некорректная ссылка на документ"); Возврат; КонецЕсли; ДокументОбъект = ДокументСсылка.ПолучитьОбъект(); Если НЕ ДокументОбъект.Проведен Тогда Сообщить("Документ не проведён, операция отменена."); Возврат; КонецЕсли; Для Каждого Строка Из ДокументОбъект.Номенклатура Цикл Если ЗначениеЗаполнено(Строка.ТМЦ) Тогда Строка.ЕдиницаИзмерения = Строка.ТМЦ.БазоваяЕдиница; КонецЕсли; КонецЦикла; ДокументОбъект.Записать(Ложь); Сообщить("Документ обновлён, единицы измерения заполнены."); КонецПроцедуры |
—
Основные моменты:
— Используйте Результат.Выбрать() для получения объекта выборки.
— Вызывайте Следующий() для перехода к первой записи.
— Получайте ссылку из поля выборки.
— Проверяйте тип ссылки перед вызовом ПолучитьОбъект().
— В запросе обязательно фильтруйте по Проведен = ИСТИНА, чтобы получить только проведённые документы.
— Не обращайтесь напрямую к Результат.Выбрать().ДокументСсылка — это не строка, а объект выборки.
—
Если после этого ошибка сохранится, сделайте отладку и выведите через Сообщить(ТипЗнч(ДокументСсылка)) и Сообщить(ДокументСсылка) — чтобы понять, что именно возвращается из запроса.