1с ошибка чтения значения в запросе
Как просмотреть результаты выполнения запроса в отладчике?
Запрос.УстановитьПараметр("ВидНоменклатуры", Перечисления.ВидыНоменклатуры.Услуга);
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Проблема в том, что запрос, кажется, не «ловит» то, что нужно.
Вот, что получилось у меня при просмотре переменных Результат и ВыборкаОбщийИтог:
Результат.Колонки КоллекцияКолонокРезультатаЗапроса КоллекцияКолонокРезультатаЗапроса
Выручка КолонкаРезультатаЗапроса КолонкаРезультатаЗапроса
Имя "Выручка" Строка
ТипЗначения Null, Число ОписаниеТипов
Ширина 32 Число
Представление КолонкаРезультатаЗапроса КолонкаРезультатаЗапроса
Имя "Представление" Строка
ТипЗначения Null, Строка ОписаниеТипов
Ширина 32 Число
Услуга КолонкаРезультатаЗапроса КолонкаРезультатаЗапроса
Имя "Услуга" Строка
ТипЗначения Null, Справочник ссылка: Номенклатура ОписаниеТипов
Ширина 25 Число
Выручка Ошибка чтения значения
Представление Ошибка чтения значения
Услуга Ошибка чтения значения
Отладка запросов 1С
Часто в конфигурациях 1С 8 встречаются очень большие и сложные запросы. Например, запрос автозаполнения документа «Начисление зарплаты» , не смотря на то, что благодаря использованию пакетного запроса с большим числом временных таблиц, он построен логично и прозрачно, разобраться в нем тяжело из за его громоздкости.
Есть два основных метода отладки больших запросов.
Использование консоли запросов
Стандартную консоль запросов можно найти на дисках ИТС(это внешняя обработка), да и на просторах интернета целая куча различных ее модификаций.
Консоль запросов позволяет писать и отлаживать запросы в режиме 1С:Предприятия, не используя Конфигуратор. По ссылке доступна для скачивания одна из версий консоли запросов, скачиваем файл, разархивируем его и открываем через меню 1С:Предприятия «Файл – Открыть»
Для того чтобы разобраться в большом запросе с помощью консоли запросов, разбейте запрос на пакеты. Это позволит сразу отслеживать результат выполнения каждой части запроса. После выполнения запроса перейдите на закладку “Временные таблицы”, выберите нужную вам и нажмите “Отладить”, для виртуальной таблицы создастся отдельный запрос, который вы можете выполнить отдельно от основного.
Выгрузка результатов временных таблиц
Используется функция вида:
Ее можно расположить в модуле вашей обработки, либо в общем модуле 1С 8. Т.о. к ней можно обращаться из любого отлаживаемого запроса, вставив в нужное место модуля следующий код:
Полученную таблицу значений можно просмотреть в отладке при помощи “Вычислить выражение”.
Как работать с отладкой в 1С 8.3 и 8.2
Ниже рассмотрим основные методы использования механизма отладки в виде практической инструкции на конкретном примере.
Внимание! Если Вы используете клиент-серверный режим работы (на сервере), Вам необходимо включить отладку на сервере 1С Предприятия.
Запуск отладки в 1С
Отладка фоновых заданий 1С
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания — попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
В этом окне Вы можете установить соответствующий флаг.
Установка точки останова (брейкпойнта)
Для того чтобы установить точку останова, необходимо найти нужный программный код и кликнуть дважды на поле, слева от поля ввода кода (или нажать кнопку F9):
Точка останова 1С с условием (синяя)
Например, остановим цикл на строке с номером 25:
Неактивная точка останова (серая)
Точка останова по ошибке
Пошаговое перемещение по программному коду 1С
После установки точки останова необходимо инициировать выполнение нужного программного кода, чтобы система вошла в пошаговое исполнения кода. Отображение стрелки свидетельствует о запуске режима пошагового выполнения кода:
Чтобы перейти с текущего положения курсора к нужному, минуя промежуточные строчки кода, необходимо установить курсор на нужной строке и нажать shift + F10 (Идти до курсора).
Анализ значений в режиме отладки 1С
Посмотреть значения определенных значений можно разными способами:
Отображение значения при наведении курсора
Очень полезно использовать вычисление выражения и выполнить запрос, выгрузить в таблицу значений и посмотреть её.
С помощью него Вы можете подробно узнать, откуда была вызвана процедура и с какими параметрами:
Смотрите также обзорное видео по отладке в 1С:
Другие статьи по 1С:
В док попадет ссылка на документ, рекв - строка наименование свойства.
Отладчик в выборке выдает "Ошибка чтения значения");
В консоли запросов все отрабатывает.
В чем может быть проблема?
Либо ссылку в рекв передавать надо либо тут И СчетНаОплатуДополнительныеРеквизиты.Свойство = &Рекв изменить на И СчетНаОплатуДополнительныеРеквизиты.Свойство.Наименование = &Рекв
(2)Точка останова на Результат.Следующий();, захожу отладчиком в результат и там ошибка чтения значения и по свойству и по значению показывает.
Почему рекв - строка наименование свойства? это же должна быть ссылка на план видов характеристик Дополнительные реквизиты
Либо ссылку в рекв передавать надо либо тут И СчетНаОплатуДополнительныеРеквизиты.Свойство = &Рекв изменить на И СчетНаОплатуДополнительныеРеквизиты.Свойство.Наименование = &Рекв
(7)
аналогичное все. Нужно связать ссылку Заказа клиента и заказа поставщику. И ЗаказПоставщику.ДокументОснование = &ДокументОснование"; - меняю по разному, но результат один.
Просто в счете на оплату есть табличная часть "Дополнительные реквизиты". Я консоль запросов по ней использовал.
Если в функцию в качестве параметра строка с наименованием приходит, то можно например Запрос.УстановитьПараметр("Рекв",ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(Рекв, Истина));
Если в функцию в качестве параметра строка с наименованием приходит, то можно например Запрос.УстановитьПараметр("Рекв",ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию(Рекв, Истина));
(14) понятное дело, что по хорошему логику надо переделать так, чтобы в функцию уже прилетала ссылка, но это уже совсем другая история. автор пусть сам решает. вопрос был не о переделке, а о причине неработоспособности кода
(13) Как сказал кто-то из древних: "программа, утыканная конструкциями типа try catch с целью исключить возможность появления исключения, похожа на труп, который не падает, потому что прибит гвоздями к стене".
(15) Ну если дальше копать, то прочтение одного единственного доп. реквизита для одной единственной ссылки изначально далеко не всегда верный подход, а чаще наоборот. Ну а вероятность пустого результата в запросе, особенно в контексте прочтения доп. реквизитов никто не отменял.
(17) никто кроме ТС не знает контекст задачи и сценарий вызова этой функции. Поэтому, при текущих вводных никто из нас не может сказать как должен обрабатываться пустой запрос. Ваш ответ дал прямое указание на безусловное исключение исключения (простите за каламбур), следовательно он полностью соответствует приведенной в (15) цитате
ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
"ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
|ГДЕ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
| И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность";
ЗапросВредность.УстановитьПараметр("ДокументСсылка", ДокументПриема.Ссылка);
ЗапросВредность.УстановитьПараметр("ВидРасчетаВредность",ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
ВыборкаВредность.Следующий();
(6) Так он и перебирает. Но только берет первый элемент из выборки:
ВыборкаВредность.Следующий();
Но вот незадача, если результат запроса пустой, то на этой строчке будет ошибка.
(12) Посмотри типы значений в отборах запроса. Какой тип значения у выражения ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение?
(10) значит в результате запроса ничего нет, либо параметры запроса направильные, либо в ТЧ документа ДокументПриема.Ссылка нет строк с таким видом Доплат
(15) В общем, ложилась такая ситуация: Когда у человека проставлена "ДоплатаЗаВредность" , то у него всё гучи и всё нормально работает, а когда у него нету этой доплаты, то ошибка эта вылазит. Нужно как-то сделать так, чтобы эта ошибка исправилась , чтобы если у него нет "ДоплатыЗаВредность", то и код прекращал работать
(17) Ошибка чтения значения говорит о том что у тебя выборка пустая. Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка. Если подразумевается всегда 1 элемент из запроса(либо он есть, либо запрос пустой), тогда можешь писать "Если Выборка.Следующий() Тогда" и обрабатывать первый элемент выборки, иначе выборка пустая. Если нужно обойти все элементы выборка то используй "Пока выборка.Следующий Цикл" Если нужно отработать условие при пустой выборке, можешь предварительно проверить Если Выборка.Количество()=0, А лучше результат на пустоту проверяй.
(22) "Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка." а при Выборка.Следующий() возникает Ложь
Эх, ничего не получается что-то у меня, столько помощи было от Вас, но что-то я ,видимо, совсем тупой :С
(29) самый простой вариант, заплатить денюшку тому, кто сможет объяснить и показать. Либо читай умные книжки по 1с, как правильно писать запросы и их обходить.
(32) я читал о том, как это делать, но всё равно не могу понять, как обходить результат запроса. Я читал о методе "Следующий()", да и делал до этого что-то простое , а сейчас на попу присел и ничего не получается.
Можешь хоть как-то помочь?
(37) Я уже писал выше:
Когда у человека заполнена "ДоплатаЗаВредность", то всё нормально выводиться, всё гучи. В данный момент, я выбираю сотрудника, у которого нет "ДоплатаЗаВредность".
Вообще, я это задание связано с выводом табличной части. Я создал внешнюю обработку, заполнил все параметры, остался только этот, который я не могу адекватно вывести.
Мне нужно " Если у человека есть ДоплатаЗаВредность, то выводиться число , которое нужно, а если нет( Как в нашем случае) , то нужно выводить "0".
Человеку не понравилось как я сделал задание и он сказал переделывать. Сказал, чтобы не было там ОшибкиЧтенияЗначения,я не знаю как её оттуда убрать, и идиоту понятно, если у человека нет "ДоплатаЗаВредность", то и ошибка будет.
(37) Я рассказал всю подноготную сейчас. В данный момент я проверяю челвоека, у которого нет "ДоплатаЗаВредность".
т.е. Запрос пустой и в выборке 0 элементов.
(41) инициализируй новую строку нулем сразу, и только если есть результат пиши в показатель данные выборки, а если нет не пиши, так можно
Я не понимаю, что я делаю не так. Я написал в самом начале :
Человеку не понравилось, сказал, чтобы я переделал, я понял, что нужно сделать выборку, я пытался разными способами сделать её, но у меня не получался ни один способ, решил обратиться на форум, чтобы помогли
К (42) Как-то так например:
1. Сохранить внешнюю печатную форму “Документы на трудоустройство (Единый)”.
2. В листе “Приказ о приёме” добавить пункт “Доплата за вредность” из начислений сотрудника.
Просто пипец, мне так стыдно, я и сложнее задачи решал , а тут такая фигня и я ничего не понимаю, я целый день сижу и пытаюсь сделать.
(53) да он еще малявочка, вот пару десятков тем создаст на мисте, научится вопрос формулировать. Потом еще пару сотен вопросов и можно ЕРП внедрять единолично
(55) Задача сформулирована какая-то суть только в 16:23 в посте (55). Полноценно в 16:35 в посте (50). Чего весь день сидел - не понятно.
Постановка задачи - это 80% её решения. Как-то так обычно было.
Так попробовал 42 и 49?
(44) грамотно удержался на взятке, ВыборкаВредность.Показатель1 нельзя так обращаться если выборка не получила Следующий()
Просто ,мне кажется, человек завтра мне скажет :" Дак ты опять не сделал, у тебя всё равно ОшибкаЧтения, иди дальше делать"
(60) Не знаю почему, но продолжаю пользоваться обычной консолью в толстом клиенте. На мой взгляд они почти все удобнее на порядок. Пользуюсь версией десятилетней давности или более.
(63) Ждем. Там не надо тогда условий никаких в обработке результата. Результат запрос возвращает всегда.
(52) Как я и говорил, мне сказали : У тебя всё равно осталась ошибка.
Задание: Устранить ошибку и сделать так, чтобы не лёг чужой код и свой код.
ну если правильно понял, то процедура печати уже есть, где есть и запрос и выборка и заполнение областей в цикле и вывод в табдок, если это так, то делать все это свое еще раз не надо, так и не получится. Надо: в том месте модуля, где написан запрос и последующая его обработка с выводом в Табличный документ в сам запрос добавить к Выбрать еще одну колонку "Выбрать ТабличнаяЧасть.Сотрудник, ТабличнаяЧасть.Показатель", сотрудник (например, отсюда тот запрос не видно) уже там есть, а добавляем именно размер доплаты - Показатель, после точки ТабличнаяЧасть. имя как этот реквизит называется в метаданных, ну конструктор запроса ошибиться не даст. Все остальное в запросе и параметрах запроса оставляем как есть. Дальше в коде обработки результата запроса и вывода Областей макета (в котором надеюсь " В листе “Приказ о приёме” добавить пункт “Доплата за вредность”" это уже сделано) в ТабличныйДокумент добавляем перед ТабДок.Вывести(Область) новой строкой кода
не надо переписывать, надо просто добавить в макет новую колонку, рядом с теми что уже есть и заполнить ее значение кодом наряду с теми колонками, которые уже заполняются.
Ну это конечно если я правильно предполагаю, то что у тебя происходит.
(70) Ты прикалываешься чтоль? Какая еще ошибка, если у тебя запрос пустой, то ты в макете заполнишь 0. Вангую, ты в пустом запросе смотришь в отладке выборку и недоумеваешь, как так ашипка напротив данных! В этом варианте (46) код нормально отработает. Не надо обрабатывать данные выборки, если она пустая.
(77) не понятно зачем тут писать свое что то, если печатная форма уже есть и работает, надо только добавить одну колонку
(77) Если тебе кровь из носа нужно, чтобы выборка всегда была заполнена, можешь следующим образом написать:
(82) //ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество ЕСТЬNULL(ДоплатыЗаВредность.Показатель1, 0) КАК Показатель1
(82) А это адекватно вообще? Просто я по факту, в самом начале написал что-то похожее на тот код, который ты написал и который работает нормально, а они до меня так докапываются.
(85) залезть в голову твоим работодателям я не могу, задай наводящие вопросы, как им нужно и какой результат они ждут
(86) по уму посмотри как типовые печатные формы работают, как там получают шапку и данные для печати. Постарайся полученный опыт перенести в свою обработку
(92) ну не трогай запрос тогда, делай как я тебе написал еще раньше с условием в выборке. Ошибка данных у тебя только в отладке, на самом деле ошибки ни какой не будет при выполнении обработки, так как ты не обрабатываешь данные пустого запроса, а всего лишь выводишь 0, если выборка пустая в ПФ.
Как я понимаю остальные виды расчета тоже выводятся. И нужно как то обойти результат, выделив из него надбавку за вредность
Каким образом после чтения из файла, узнать позицию для чтения следующего куска байт
Здравствуйте, задача такова есть файл, размером 1000 байт, нужно открыть его считать 100 байт.
Каким образом можно получить значения все перечисленных переменных ,при это обратившись только к одной из них ?
Каким образом можно получить значения все перечисленных переменных ,при это обратившись только к.
Каким образом можно получить пр 9
люди как вы думаете Каким образом можно получить пр 9 какой-то страницы которая при этом еще и.
Каким образом можно получить код символа?
Kukstyler, здравствуйте, каким образом в cobol можно получить код символа? Например, строка.
Всмысле тип значения. , так СправочникСсылкаФизическиеЛица! Я хочу вытащить из регистра сведений ответственное лицо ! Метод Следующий() почему то не работает((( - после выполнения этого метода у меня всё равно возвращается ошибка чтения значения, хотя оно должно жэ ведь считаться?
Да блин. Ты код то дальше покажи.
Добавлено через 3 минуты
ВЫБРАТЬ РАЗРЕШЕННЫЕ - вот так попробуй
Добавлено через 2 минуты
Ошибка вылетит ЖМИ - ПОДРОБНО и давай сюда текстовку ошибки
Добавлено через 4 минуты
да не ты непонял вот здесь ошибка чтения значения, когда я нажимаю shift+f9
Добавлено через 43 секунды
как файл прикрепить?
Расширенный режим - там есть вставить файл
Добавлено через 4 минуты
Давай TeamViewer
Можно ли и каким образом получить поток экземпляра Класса?
Доброго дня форумчанам. Возник такой вопрос - можно ли добиться у произвольных классов чего-то.
Каким образом можно программно проверить и получить почту
Не подскажите каким образом можно программно проверить и получить почту? Искал, но негде не нашёл (.
Каким образом можно получить доступ к запущеным службам?
Здравствуйте. Подскажите как получить списки установленных и запущенных служб. Они хранятся в.
Каким образом можно получить содержание СМС с телефона?
Каким образом можно получить содержание СМСки с телефона? Оператор мтс, телефон на андроиде.
Каким образом можно получить код ошибки принтера HP LJ 1020
Принтеры при неисправности выдают код ошибки, если есть окно индикации, то на него, если окна нет.
Существует множество статей, которые описывают возможные причины возникновения в 1С ошибки “Поле объекта не обнаружено”. Порой это связывают с обновлением платформы, обновлением типового релиза, или с какими-то другими причинами.
Мы же будем оперировать фактами. В конце статьи прилагается внешняя обработка, в которой воспроизведена данная ошибка.
- Удалили табличную часть, к которой обращаемся в коде?
- Переименовали реквизит, а в коде не исправили?
- Заменили значение со ссылки на неопределено?
Вуаля – платформа выдаст ошибку “Поле объекта не обнаружено”!
Индекс находится за границами массива
- Использование при обходе коллекции количества элементов вместо индекса. Индексы начинаются с нуля, а количество элементов – с единицы. Поэтому следующий код гарантированно приведет к ошибке: Массив[Массив.Количество()]
- Последствия удаления элементов из коллекции, очистки коллекции или замены коллекции на пустую
- Ошибочное увеличение счетчика в цикле “Для”
Обращение к процедуре как к функции
Суть этой ошибки в том, что процедура не может возвращать значение. И если мы в коде используем вызов процедуры справа от знака присваивания, это приведет к ошибке.
Данная ошибка имеет две вариации – если используется стандартная процедура из методов какого-нибудь объекта, то фраза будет звучать “Обращение к процедуре объекта как к функции”. Если же использовать процедуру, объявленную в коде, то текст ошибки будет “Обращение к процедуре как к функции”.
При этом ошибка использования процедуры объекта является ошибкой времени выполнения – т.е. на этапе сохранения и проверки конфигурации платформа эту ошибку не обнаружит.
А вот неправильное использование процедуры синтаксическая проверка (Ctrl + F7) успешно обнаруживает, и не даст сохранить конфигурацию или внешнюю обработку/отчет, пока ошибка не будет устранена.
Рассмотрим два примера:
1. Воспроизведем ошибку “ Обращение к процедуре как к функции” . При этом платформа не даст сохранить изменения, т.к. не проходит синтакс-контроль.
2. Воспроизведем ошибку “ Обращение к процедуре объекта как к функции” . Здесь мы неверно используем метод объекта массива “Добавить”, который является процедурой.
Процедура не может возвращать значение
Переменная не определена
Такой текст ошибки платформа 1С выдает на этапе синтаксического контроля, при сохранении конфигурации, внешнего отчета или обработки.
Причин у этой ошибки может быть несколько.
- Опечатка в имени переменной
- Обращение к переменной, которая нигде в области видимости не объявлена (неявной инициализацией с присвоением значения, явным образом с использованием ключевого слова “Перем”, или передана в качестве параметра)
- Написание на клиенте серверного кода. Например, обращение к менеджеру справочников “Справочники”, и т.п. Клиентская часть приложения “не видит ” серверные объекты языка
- Также ошибка может появиться, если ранее код использовался в режиме толстого клиента, но после был запущен в тонком клиенте.
Внимательно следить за правильностью набранного кода, своевременно объявлять переменные или передавать их в качестве параметров. Писать серверный код только в серверных модулях, а также использовать соответствующие инструкции препроцессора, например “&НаСервере”.
Читайте также: