1с ошибки в запросах
ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
"ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель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, если выборка пустая в ПФ.
Как я понимаю остальные виды расчета тоже выводятся. И нужно как то обойти результат, выделив из него надбавку за вредность
Причина ошибки в совпадении названия (псевдонима) таблицы и имени поля таблицы или реквизита, либо реквизитов соединяемых таблиц. Причем совпадение псевдонимов полей в разных источниках допускается.
Данная ошибка может возникнуть:
- в момент сохранения конструктора запрос,
- при начале редактирования через конструктор,
- при исполнении ошибочного запроса.
Текст запроса, который может вызвать ошибку
ВЫБРАТЬ
Ссылка.Ссылка КАК Ключи
ИЗ
Справочник.Ключи КАК Ссылка
Ошибка при соединении
Чаще всего ошибка возникает не в простых запросах (как выше), а при соединении похожих или одинаковых таблиц.
Например, справочников по полям ссылка, наименование, код (присутствующих у всех)
ВЫБРАТЬ
ключи.Ссылка КАК ключи
ИЗ
Справочник.Ключи КАК ключи
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Ключи КАК Ключи2
ПО Наименование = Наименование
Исправление ошибки
- При соединениях следует указывать названия таблиц: Ключи.Ссылка = Ключи2.Ссылка.
- Названия таблиц выбирать не совпадающими с полем «Имя» реквизита.
- Если объект добавлен вами и вы создали, например, реквизит Договоры в Справочник.Договоры, лучше переименовать его, т.к. подобные ошибки будут возникать регулярно.
- Если используются временные таблицы, обратите внимание на их имена на предмет аналогичного совпадения.
Пример кода с временными таблицами — «Наименование» не вызывает ошибку в отличии от ссылка (Поле не используется при соединении, но есть в полях выборки):
ВЫБРАТЬ
"ключ" КАК Ссылка
ПОМЕСТИТЬ Ключи
;
Безошибочный код
ВЫБРАТЬ
ключи.Ссылка КАК ключи
ИЗ
Справочник.Ключи КАК ключи
Скриншот «искусственной» ошибки в 1С
Реклама — двигатель торговли: сотня двигает, один торгует.
— Хенрик Ягодзиньский
Параметр в 1С – это некий элемент, принятый функцией. В данной статье поговорим о видах и типах параметров, а также рассмотрим, как задать параметры так, чтобы избежать ошибки «Неверные параметры» в 1С.
1. Как установить параметр в запросе?
Параметр запроса – это некоторый элемент, который находится внутри функции поиска по базе данных. Рассмотрим пример, как должны быть установлены параметры запроса. Например, пускай нам нужно получить составляющие из перечня-справочника под названием «Еда» красного, жёлтого или зелёного цвета, это будет иметь такой вид:
Рис. 1 Как установить параметр в запросе «Красный»
Рис. 2 Как установить параметр в запросе «Желтый»
Рис. 3 Как установить параметр в запросе «Зеленый»
Можно увидеть, что, по факту, все эти запросы одинаковые и разность только в цвете. Это-то и есть наш параметр – та переменная, которую не хотелось бы каждый раз повторять. В вышеуказанном примере параметр – это цвет, дадим ему имя «ВыбранныйЦвет» и поменяем значения цветов на эту переменную внутри запроса. А для того чтобы указать, что это именно параметр, нужно приписать перед именем амперсанд «&», тогда мы сможем задать параметр в запросе:
Рис. 4 Как задать параметр в запросе «ВыбранныйЦвет»
После этой процедуры пробуем выполнить наш запрос, результат будет пустым и выглядеть так:
Рис. 5 Результат неверного параметра в запросе пустой
Результат запроса пустой по причине того, что в коде не было указано само значение параметра. Выберем имя, для этого потребуется задействовать панель, которая находится над редактором запросов. Внутри данной панели размещен текст запросов:
Рис. 6 Редактор запросов – панель с текстом запросов
Система 1С уже узнала параметр внутри запроса и выделила его в соответствующей секции, но пока без значений. Меняем пустое значение запроса, например, на значение «Жёлтый».
Рис. 7 Смена пустого значения запроса на «Желтый»
Теперь запрос выполнится! Аналогично можно заполнить оставшиеся значения. Так при помощи параметра можно в одном и том же запросе получать результаты, которые отличаются. То есть, главная функция параметров внутри запросов – делать их более обобщёнными. Это особенно актуально в сложных запросах, так как достаточно будет только изменить сам параметр, не меняя весь запрос.
2. Функция параметра «Ссылка»
В этом варианте будет сравниваться в качестве ограничения для параметра не название цвета, а значение по ссылке:
Рис. 8 Ограничение для параметра – значение по ссылке
Наш параметр «ВыбранныйЦвет» из строки превратился в ссылку на какой-то элемент внутри справочника «Цвета», поэтому у пользователя есть возможность изменить параметр и его тип:
Рис. 9 Изменения типа параметра в 1С
После этого, в момент, когда ведётся выбор значения данного параметра, перед нами появится выпадающий список с перечнем цветов – это функция параметра ссылки.
3. Параметр «Дата»
Допустим, нужен запрос, который будет выбирать заказы клиентов в определённый период. Данный период будет иметь две границы – «НачалоИнтервала» и «КонецИнтервала».
Рис. 10 Параметр «Дата»
Аналогично выполняем данный запрос и видим, что 1С уже распознала, что у данного параметра тип «Дата». Пусть нам нужны заказы за январь 2014 года, тогда получим:
Рис. 11 Пример запроса по параметру «Дата»
Результат запроса с параметром «Дата» будет выглядеть следующим образом:
Рис. 12 Результат запроса с параметром «Дата»
В данной статье были рассмотрены параметры в системе 1С, видов параметр внутри запроса, параметр с типом «Дата», параметры с типом «Ссылка», аналогично проводится работа с параметрами в списках таблиц и таблиц со значениями. Ошибка в них возникает в случае задания невозможного названия, типа, их несоответствий, пунктуационных ошибок в коде программы.
Специалист компании «Кодерлайн»
Вас могут заинтересовать следующие статьи:
Приветствую.
Пытаюсь делать внешнюю обработку. При тестировании запроса в Консоли отчетов - все работает правильно. При переносе запроса во внешнюю обработку, получаю ошибку (см. вложение). Есть ли какие то инструменты, что бы определить место ошибки?
Расставить между словами пробелы - как определить, где именно поставить пробел
Всем доброго дня. Увидел задачу: нужно убрать пробелы между словами, чтобы получился слитный текст.
Определить, встречается ли массив Vec2 в массиве Vec1, и где именно
Сгенерировать один массив Vec1 из N псевдослучайных чисел, вывести значения его элементов на.
Написать функцию, указывающая где именно находится ошибка (скобочный парсер)
есть код проверяющий правильность скобочной последовательности, а как написать функцию,указывающую.
Где ошибка в запросе?
Всем привет. Делаю запрос, вроде правильный, но update() срабатывает неверно $update = 'ТЕСТ';.
выборка.следующий() - тогда там появляются данные. их и смотри
Добавлено через 3 минуты
ну или наверно можно написать запрос выполнить выгрузить - тогда будет доступна ТЗ с данными, так вроде
всё правильно. не надо значение не значение - мало ли не так называется, не открыто для записи, ещё что непонятное (просто совет, не рекомендация)
сообщить(. количество())
вот и посмОтрите
что то я не догоняю. вот тот список полей детальных записей что в первом посте, в консоли отчетов они представлены как доступные поля, из которых я потом выбираю 5 нужных мне полей в конструкторе для получения нужных мне данных. А в обработке получается нет такого конструктора?
в консоли отчетов они представлены как доступные поля таблицы значений. Здесь тоже можно выгрузить в ТЗ: ТЗ = РезультатЗапроса.Выгрузить();
Убрал 2 условия, вернуло 101. То есть 101 запись, в ТЗ появляется вертикальный бегунок, т.е. записи добавляются, но почему то значений в полях как и самих полей в ТЗ нет.
Ошибка, как правило, возникает у начинающих программистов. А исправляется она простым переименованием одинаковых имен в запросе.
Изучив статью, вы:
- ознакомитесь с порядком исправления ошибки в запросе 1С;
- получите внешний отчет, демонстрирующий ошибочный и правильный коды.
Неоднозначное поле в запросе 1С 8.3
Ошибка 1С Неоднозначное поле может возникать как в Конфигураторе при написании запроса, так и в пользовательском режиме при выполнении некорректного программного кода.
Рассмотрим причины возникновения ошибки и порядок ее исправления на примере.
Одинаковые имена объектов в таблице запроса
При чтении цен номенклатуры по регистру сведений Цены номенклатуры из внешнего отчета, появляется ошибка Неоднозначное поле «ТипЦен.Номенклатура».
Для поиска и устранения ошибки выполните следующие действия:
Обратите внимание: таблица запроса названа ТипЦен , и реквизит таблицы регистра сведений имеет то же название:
В результате возникает двойственность чтения данных, и программа не может однозначно определить, что в этом случае нужно использовать. Команда ТипЦен.Номенклатура может относиться как к самой таблице, так и к реквизиту таблицы.
Исправление ошибки Неодназначное поле
Исправление ошибки 1С Неоднозначное поле предполагает переименование имени таблицы запроса на новое, например, ЦеныНоменклатурыСрезПоследних . Теперь одинаковых имен в таблице запроса нет. Данные по номенклатуре и цене будут браться из таблицы записей периодического регистра сведений ЦеныноменклатурыСрезПоследних .
Программа понимает, что параметр Номенклатура относится именно к таблице запроса ЦеныНоменклатурыСрезПоследних .
Правильный запрос на чтение актуальных цен номенклатуры описан в процедуре WORKНаСервере .
Сохранение процедур с корректным кодом WORK и некорректным кодом ERROR выполняется отдельно для удобства демонстрации работы запросов в 1С.
Пример ошибки
Протестируем работу внешнего отчета с корректным и некорректным запросом на примере:
Вот так можно получить ошибку 1С запрос Неоднозначное поле . Будьте внимательны при создании запросов!
См. также:
Помогла статья?
Получите еще секретный бонус и полный доступ к справочной системе БухЭксперт8 на 14 дней бесплатно
Читайте также: