undertale
21.12.20
✎
09:50
Ошибка чтения значения в Выборке:
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
Метод с «Выбрать» на «Выгрузить» не могу поменять, нужно сделать через именно через «Выбрать()»
ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
«ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
|ГДЕ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
| И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;
ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);
ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
ВыборкаВредность.Следующий();
undertale
21.12.20
✎
09:50
Я только начинаю, не судите строго
lEvGl
21.12.20
✎
09:52
и чего дальше?
ДенисЧ
21.12.20
✎
09:54
Для начала будем судить за формулировку вопроса )))
Где ошибка? Когда возникает?
undertale
21.12.20
✎
09:57
(3) Ошибка чтения значения в Выборке:
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
lEvGl
21.12.20
✎
10:02
(4) что это значит? какого значения, что возвращает .следующий()?
ДенисЧ
21.12.20
✎
10:03
(4) То есть. Ты делаешь ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
Потом смотришь в ВыборкаВредность
И правильно она тебе говорит. Выборку перебирать кто будет? Сам Абд аль-Маджи́д ат-Тикри́ти ?
undertale
21.12.20
✎
10:04
(6) хДДД
lEvGl
21.12.20
✎
10:05
вангануть что ли
если написать
Пока ВыборкаВредность.Следующий() Цикл
Сообщить(ВыборкаВредность.ВидРасчета);
КонецЦикла;
что будет?
а еще лучше подключить тяжелую артиллерию — отладчик
Kassern
21.12.20
✎
10:06
(6) Так он и перебирает…Но только берет первый элемент из выборки:
ВыборкаВредность.Следующий();
Но вот незадача, если результат запроса пустой, то на этой строчке будет ошибка.
undertale
21.12.20
✎
10:10
(8) Ничего не выдаёт, вычисляю выражение «Ошибка чтения значения»
undertale
21.12.20
✎
10:12
(8) а «ВидРасчета» — переменная не определена
undertale
21.12.20
✎
10:14
(6) Проблема в том, что у меня не получается :С
Kassern
21.12.20
✎
10:16
(12) Посмотри типы значений в отборах запроса. Какой тип значения у выражения ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение?
undertale
21.12.20
✎
10:23
(13) https://ibb.co/Lzz8mRK
Если я правильно тебя понял
lEvGl
21.12.20
✎
10:25
(10) значит в результате запроса ничего нет, либо параметры запроса направильные, либо в ТЧ документа ДокументПриема.Ссылка нет строк с таким видом Доплат
undertale
21.12.20
✎
10:35
(15) В общем, ложилась такая ситуация: Когда у человека проставлена «ДоплатаЗаВредность» , то у него всё гучи и всё нормально работает, а когда у него нету этой доплаты, то ошибка эта вылазит. Нужно как-то сделать так, чтобы эта ошибка исправилась , чтобы если у него нет «ДоплатыЗаВредность», то и код прекращал работать
undertale
21.12.20
✎
10:36
Это реально как-то сделать?
lEvGl
21.12.20
✎
10:38
(16) для этого и есть Выборка.Следующий()
DrShad
21.12.20
✎
10:38
Если …
Kassern
21.12.20
✎
10:39
Убери ты ссылку в условии | И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;
Сделай | И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета= &ВидРасчетаВредность»;
lEvGl
21.12.20
✎
10:42
Стандартная конструкция
Пока Выборка.Следующий() Цикл
если запрос ничего не вернет, то и в цикл программа не попадет
я делаю так
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Для Каждого Строка Из Результат.Выгрузить() Цикл
тра та та
КонецЦикла;
КонецЕсли;
возможны варианты, по ситуации
Kassern
21.12.20
✎
10:50
(17) Ошибка чтения значения говорит о том что у тебя выборка пустая. Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка. Если подразумевается всегда 1 элемент из запроса(либо он есть, либо запрос пустой), тогда можешь писать «Если Выборка.Следующий() Тогда» и обрабатывать первый элемент выборки, иначе выборка пустая. Если нужно обойти все элементы выборка то используй «Пока выборка.Следующий Цикл» Если нужно отработать условие при пустой выборке, можешь предварительно проверить Если Выборка.Количество()=0, А лучше результат на пустоту проверяй.
Йохохо
21.12.20
✎
10:51
(22) «Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка.» а при Выборка.Следующий() возникает Ложь
hhhh
21.12.20
✎
11:29
самый простой вариант это
Таб = Запрос.Выполнить().Выгрузить();
Для Каждого Стр Из Таб Цикл
КонецЦикла;
1с не рекомендует так делать, но это самое удобное.
undertale
21.12.20
✎
11:38
(24) но у меня же метод «Выбрать» ,А не «Выгрузить
undertale
21.12.20
✎
11:39
(24) Так же работать будет ?
lEvGl
21.12.20
✎
11:46
(26) смысл такой же, да
undertale
21.12.20
✎
12:05
Эх, ничего не получается что-то у меня, столько помощи было от Вас, но что-то я ,видимо, совсем тупой :С
undertale
21.12.20
✎
12:11
не знаю, что теперь и делать
Kassern
21.12.20
✎
12:22
(29) самый простой вариант, заплатить денюшку тому, кто сможет объяснить и показать. Либо читай умные книжки по 1с, как правильно писать запросы и их обходить.
lEvGl
21.12.20
✎
12:30
(29) так гучи же
>>>у него всё гучи и всё нормально работает
в чем проблема то
>>>чтобы если у него нет «ДоплатыЗаВредность», то и код прекращал работать
код и перестает работать, если Выборка.Следующий() Ложь
Пока Выборка.Следующий() Цикл //тут неявная проверка на возврат Истина
почитай как это работает, даже в синтакс-помощнике. а истина будет, пока есть записи в результате запроса, то есть когда их нет(или закончатся), тогда и
>>>и код прекращал работать
hhhh
21.12.20
✎
12:55
(29) что не получается?
Если ВыборкаВредность.Следующий() Тогда
уже пробовал?
undertale
21.12.20
✎
14:53
(32) я читал о том, как это делать, но всё равно не могу понять, как обходить результат запроса. Я читал о методе «Следующий()», да и делал до этого что-то простое , а сейчас на попу присел и ничего не получается.
Можешь хоть как-то помочь?
ДенисЧ
21.12.20
✎
15:03
ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
«ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
|ГДЕ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
| И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;
ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);
ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
пока ВыборкаВредность.Следующий() Цикл
сообщить(«» + ВыборкаВредность.ВидРасчета + » » + ВыборкаВредность.Показатель1);
КонецЦикла;
Что выведет?
lEvGl
21.12.20
✎
15:42
(34)было уже
>>>можешь хоть как то помочь?
можешь?
undertale
21.12.20
✎
16:03
(34) Ничего не выводит, в выборке Ошибка чтения
ДенисЧ
21.12.20
✎
16:08
(36) Ничего не выводит — значит результат запроса пустой.
Проверь ещё
результат = ЗапросВредность.Выполнить();
сообщить(«ЗАпрос пустой » + результат.Пустой());
ВыборкаВредность = результат.Выбрать();
Сообщить(«В выборке » + ВыборкаВредность.Количество() + » элементов»);
undertale
21.12.20
✎
16:23
(37) Я уже писал выше:
Когда у человека заполнена «ДоплатаЗаВредность», то всё нормально выводиться, всё гучи. В данный момент, я выбираю сотрудника, у которого нет «ДоплатаЗаВредность».
Вообще, я это задание связано с выводом табличной части. Я создал внешнюю обработку, заполнил все параметры, остался только этот, который я не могу адекватно вывести.
Мне нужно » Если у человека есть ДоплатаЗаВредность, то выводиться число , которое нужно, а если нет( Как в нашем случае) , то нужно выводить «0».
Человеку не понравилось как я сделал задание и он сказал переделывать. Сказал, чтобы не было там ОшибкиЧтенияЗначения,я не знаю как её оттуда убрать, и идиоту понятно, если у человека нет «ДоплатаЗаВредность», то и ошибка будет.
lEvGl
21.12.20
✎
16:25
троль что ли
undertale
21.12.20
✎
16:26
(37) Я рассказал всю подноготную сейчас. В данный момент я проверяю челвоека, у которого нет «ДоплатаЗаВредность».
т.е. Запрос пустой и в выборке 0 элементов.
undertale
21.12.20
✎
16:26
(39) Да не троль я , меня ебут ( извиняюсь за мат ), а я ничего не понимаю уже
Said_We
21.12.20
✎
16:28
(38) «то нужно выводить «0»» — это уже другой запрос должен быть.
Йохохо
21.12.20
✎
16:28
(41) инициализируй новую строку нулем сразу, и только если есть результат пиши в показатель данные выборки, а если нет не пиши, так можно
undertale
21.12.20
✎
16:30
Я не понимаю, что я делаю не так. Я написал в самом начале :
Если ЗначениеЗаполнено(ВыборкаВредность.Показатель1) = истина тогда
ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1;
Иначе
ОбластьМакетаРаботник1.Параметры.Вредность = «0»;
КонецЕсли;
undertale
21.12.20
✎
16:32
Человеку не понравилось, сказал, чтобы я переделал, я понял, что нужно сделать выборку, я пытался разными способами сделать её, но у меня не получался ни один способ, решил обратиться на форум, чтобы помогли
Kassern
21.12.20
✎
16:32
(44) Если ВыборкаВредность.Следующий Тогда
ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1;
Иначе
ОбластьМакетаРаботник1.Параметры.Вредность = «0»;
КонецЕсли;
Kassern
21.12.20
✎
16:33
(46) *Если ВыборкаВредность.Следующий() Тогда
lEvGl
21.12.20
✎
16:33
ну хз, все же объяснили. Первоначальная формулировка задачи от «человека» есть?
Said_We
21.12.20
✎
16:35
К (42) Как-то так например:
ВЫБРАТЬ
ВложенныйЗапрос.ВидРасчета как ВидРасчета
,Сумма(ВложенныйЗапрос.Показатель1) как Показатель1
ИЗ
(ВЫБРАТЬ
&ВидРасчетаВредность как ВидРасчета
,0 как Показатель1
объединить все
ВЫБРАТЬ
ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
ИЗ
Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
ГДЕ
ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета = &ВидРасчетаВредность
) КАК ВложенныйЗапрос
Сгруппировать по
ВложенныйЗапрос.ВидРасчета
undertale
21.12.20
✎
16:35
1. Сохранить внешнюю печатную форму “Документы на трудоустройство (Единый)”.
2. В листе “Приказ о приёме” добавить пункт “Доплата за вредность” из начислений сотрудника.
3. Загрузить печатную форму обратно. (48)
Это всё
sqr4
21.12.20
✎
16:36
(41) Жирный троль)
Kassern
21.12.20
✎
16:36
(50) см. ответ (46) (47) И будет тебе счастье
Kassern
21.12.20
✎
16:37
(51) может так ковид действует на организм?
undertale
21.12.20
✎
16:38
Просто пипец, мне так стыдно, я и сложнее задачи решал , а тут такая фигня и я ничего не понимаю, я целый день сижу и пытаюсь сделать.
undertale
21.12.20
✎
16:39
я от компа не отходил ни на секунду с 8 часов утра ( У меня уже 20:38)
Said_We
21.12.20
✎
16:39
(54) В (42, 49) пробовал?
Said_We
21.12.20
✎
16:39
(55) Ну так Новосибирск. +4 часа.
sqr4
21.12.20
✎
16:39
(53) да он еще малявочка, вот пару десятков тем создаст на мисте, научится вопрос формулировать. Потом еще пару сотен вопросов и можно ЕРП внедрять единолично
Said_We
21.12.20
✎
16:43
(55) Задача сформулирована какая-то суть только в 16:23 в посте (55). Полноценно в 16:35 в посте (50). Чего весь день сидел — не понятно.
Постановка задачи — это 80% её решения. Как-то так обычно было.
Так попробовал 42 и 49?
sqr4
21.12.20
✎
16:43
Said_We
21.12.20
✎
16:44
Читать:
Задача сформулирована какая-то суть только в 16:23 в посте (38). ТРИДЦАТЬ ВОСЕМЬ
Йохохо
21.12.20
✎
16:45
(44) грамотно удержался на взятке, ВыборкаВредность.Показатель1 нельзя так обращаться если выборка не получила Следующий()
undertale
21.12.20
✎
16:46
(59) нет, сейчас делать буду.
undertale
21.12.20
✎
16:47
Просто ,мне кажется, человек завтра мне скажет :» Дак ты опять не сделал, у тебя всё равно ОшибкаЧтения, иди дальше делать»
Said_We
21.12.20
✎
16:47
(60) Не знаю почему, но продолжаю пользоваться обычной консолью в толстом клиенте. На мой взгляд они почти все удобнее на порядок. Пользуюсь версией десятилетней давности или более.
(63) Ждем. Там не надо тогда условий никаких в обработке результата. Результат запрос возвращает всегда.
Йохохо
21.12.20
✎
16:48
(64) — (46)(47)
undertale
21.12.20
✎
16:49
(59) Спасибо, учту формулировку вопроса, в следующий раз будет лучше!
undertale
21.12.20
✎
16:50
(66) Буду знать
undertale
21.12.20
✎
16:55
(52) Как я и говорил, мне сказали : У тебя всё равно осталась ошибка.
Задание: Устранить ошибку и сделать так, чтобы не лёг чужой код и свой код.
undertale
21.12.20
✎
16:56
Я уже не знаю, что делать, сейчас мозг лопнет :DD
yakutyan_
21.12.20
✎
16:56
(70) скинь код в котором у тебя ошибка
Said_We
21.12.20
✎
16:58
(70) Пробуй (49) и не будет ошибки.
undertale
21.12.20
✎
16:59
(72) там пипец сложно, я параллельно разбираю этот код, но я не могу полностью его переписать)
undertale
21.12.20
✎
17:00
(71) ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
«ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
|ГДЕ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
| И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;
ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);
ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
Если ВыборкаВредность.Следующий() Тогда
йцу= ВыборкаВредность.Показатель1;
иначе
йцу = «0»;
КонецЕсли;
lEvGl
21.12.20
✎
17:00
ну если правильно понял, то процедура печати уже есть, где есть и запрос и выборка и заполнение областей в цикле и вывод в табдок, если это так, то делать все это свое еще раз не надо, так и не получится. Надо: в том месте модуля, где написан запрос и последующая его обработка с выводом в Табличный документ в сам запрос добавить к Выбрать еще одну колонку «Выбрать ТабличнаяЧасть.Сотрудник, ТабличнаяЧасть.Показатель», сотрудник (например, отсюда тот запрос не видно) уже там есть, а добавляем именно размер доплаты — Показатель, после точки ТабличнаяЧасть. имя как этот реквизит называется в метаданных, ну конструктор запроса ошибиться не даст. Все остальное в запросе и параметрах запроса оставляем как есть. Дальше в коде обработки результата запроса и вывода Областей макета (в котором надеюсь » В листе “Приказ о приёме” добавить пункт “Доплата за вредность”» это уже сделано) в ТабличныйДокумент добавляем перед ТабДок.Вывести(Область) новой строкой кода
Область.Параметры.Показатель = Выборка.Показатель;
Вроде больше ничего не надо
lEvGl
21.12.20
✎
17:02
не надо переписывать, надо просто добавить в макет новую колонку, рядом с теми что уже есть и заполнить ее значение кодом наряду с теми колонками, которые уже заполняются.
Ну это конечно если я правильно предполагаю, то что у тебя происходит.
Kassern
21.12.20
✎
17:02
(70) Ты прикалываешься чтоль? Какая еще ошибка, если у тебя запрос пустой, то ты в макете заполнишь 0. Вангую, ты в пустом запросе смотришь в отладке выборку и недоумеваешь, как так ашипка напротив данных! В этом варианте (46) код нормально отработает. Не надо обрабатывать данные выборки, если она пустая.
lEvGl
21.12.20
✎
17:03
а смотрю я в (50)
lEvGl
21.12.20
✎
17:04
(77) не понятно зачем тут писать свое что то, если печатная форма уже есть и работает, надо только добавить одну колонку
undertale
21.12.20
✎
17:08
undertale
21.12.20
✎
17:09
Я не знаю уже, как это комментировать
Kassern
21.12.20
✎
17:11
(77) Если тебе кровь из носа нужно, чтобы выборка всегда была заполнена, можешь следующим образом написать:
ВЫБРАТЬ
СУММА(ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1) КАК Показатель1,
ЗаказКлиентаТовары.Ссылка КАК Ссылка
ПОМЕСТИТЬ ДоплатыЗаВредность
ИЗ
Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
ГДЕ
ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета = &ВидРасчетаВредность
СГРУППИРОВАТЬ ПО
ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПриемНаРаботуВОрганизацию.Ссылка КАК Ссылка,
ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество
ИЗ
Документ.ПриемНаРаботуВОрганизацию КАК ПриемНаРаботуВОрганизацию
ЛЕВОЕ СОЕДИНЕНИЕ ДоплатыЗаВредность КАК ДоплатыЗаВредность
ПО ПриемНаРаботуВОрганизацию.Ссылка = ДоплатыЗаВредность.Ссылка
ГДЕ
ПриемНаРаботуВОрганизацию.Ссылка = &ДокументСсылка
Kassern
21.12.20
✎
17:12
(82) //ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество ЕСТЬNULL(ДоплатыЗаВредность.Показатель1, 0) КАК Показатель1
Kassern
21.12.20
✎
17:13
(83) поясню, а то вдруг не понял строчку ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество в запросе замени на
Количество ЕСТЬNULL(ДоплатыЗаВредность.Показатель1, 0) КАК Показатель1
undertale
21.12.20
✎
17:15
(82) А это адекватно вообще? Просто я по факту, в самом начале написал что-то похожее на тот код, который ты написал и который работает нормально, а они до меня так докапываются.
undertale
21.12.20
✎
17:16
(84) даже сейчас, говорят что не правильно и нужно исправить как-то.
sqr4
21.12.20
✎
17:16
(86) Какой код ты не должен поломать то?
Kassern
21.12.20
✎
17:17
(85) залезть в голову твоим работодателям я не могу, задай наводящие вопросы, как им нужно и какой результат они ждут
undertale
21.12.20
✎
17:17
(82) смысл в том, что они говорят :» Запрос не трогай, он правильный. Сделай выборку верно». :DDD
Said_We
21.12.20
✎
17:18
(49) Пробовать будешь или нет?
Kassern
21.12.20
✎
17:18
(86) по уму посмотри как типовые печатные формы работают, как там получают шапку и данные для печати. Постарайся полученный опыт перенести в свою обработку
undertale
21.12.20
✎
17:18
(87) НУ, в обработке есть ещё печсатные формы, которые не я делал, тот код поломать и не должен
Said_We
21.12.20
✎
17:19
(89) Значит в выборке вредность уже есть. Раз так говорят.
undertale
21.12.20
✎
17:20
(90) 5 минут
undertale
21.12.20
✎
17:22
(90) съехало просто не много , не могу полностью разобраться
Kassern
21.12.20
✎
17:23
(92) ну не трогай запрос тогда, делай как я тебе написал еще раньше с условием в выборке. Ошибка данных у тебя только в отладке, на самом деле ошибки ни какой не будет при выполнении обработки, так как ты не обрабатываешь данные пустого запроса, а всего лишь выводишь 0, если выборка пустая в ПФ.
undertale
21.12.20
✎
17:29
(96) Хорошо , спасибо
sqr4
21.12.20
✎
18:01
Как я понимаю остальные виды расчета тоже выводятся. И нужно как то обойти результат, выделив из него надбавку за вредность
Доброго времени суток, коллеги! Много раз на нашем сайте обсуждалась тема запросов в 1С, например, как получить всех родителей элемента справочника одним запросом. В этой статье вы увидите еще много разных примеров запросов, которые помогут вам решать повседневные задачи. Вот, посмотрите.
Содержание
- Как в запросе 1с8 установить условие проверки периода на конец дня?
- Как правильно обрабатывать значения NULL в запросе 1С8?
- Как вывести результат запроса в табличный документ?
- Как посчитать возраст по дате рождения в запросе 1С8?
- Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?
- Как запросом получить все подчиненные документы?
- Как выглядит недокументированный синтаксис оператора ВЫБОР?
- Как составить запрос к табличной части документа?
- Как запросом для документа найти все подчинённые ему документы?
- Как сравнить строки в запросе?
- Как в запросе проверить поле на пустую ссылку?
- Как в запросе убрать фильтр на значение параметра?
Как в запросе 1с8 установить условие проверки периода на конец дня?
В запросе воспользуемся функцией КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ), она приведет дату к виду «23:59:59».
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | СчетНаОплатуПокупателю.Дата |ИЗ | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю |ГДЕ | СчетНаОплатуПокупателю.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) | И КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ)"; Запрос.УстановитьПараметр("ДатаКонец", ДатаКонец); Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); РезультатЗапроса = Запрос.Выполнить();
Как правильно обрабатывать значения NULL в запросе 1С8?
В запросе значения типа NULL образуются в результате соединений (ЛЕВОЕ, ПРАВОЕ), когда элементу из одной таблицы по условию не находится соответствующего элемента из другой. Значение типа NULL имею специфические особенности:
-
- Cравнение значения NULL с любым другим аргументом всегда возвращает ложь. Например, если в запросе поле «Количество» возвращает NULL, то если использовать операции сравнения «<», «>», или «=» с числом 1000, то результатом всегда будет «Ложь». Даже, если сравнить с самим значением NULL, то все равно результатом будет «Ложь»:
ГДЕ ГТД.Количество = NULL
-
- Применение арифметических операций к значению типа NULL всегда возвращает NULL. Например, если в запросе к полю «Количество», которое возвращает NULL, прибавить числовое значение или отнять от него числовое значение, то будет возвращено значение NULL:
ГТД.Количество+300 КАК Поле1
-
- Для определения значения NULL используется функция конструкция «IS NULL». Чтобы получить записи со значением NULL воспользуемся следующей конструкцией:
ГДЕ ГТД.Регистратор.Организация IS NULL
если нужно получить записи без NULL, тогда:
ГДЕ НЕ ГТД.Регистратор.Организация IS NULL
- Для преобразования типа NULL используется функция «isNULL» или «ЕСТЬNULL». Теперь можно сравнивать с полученным значением или применять к нему арифметические операции, не боясь за конечный результат:
- Для определения значения NULL используется функция конструкция «IS NULL». Чтобы получить записи со значением NULL воспользуемся следующей конструкцией:
ЕСТЬNULL(ГТД.Количество, 0)+300 КАК Поле1
-
- Для того, чтобы в результате запроса отсечь записи, содержащие значения NULL применяются следующие конструкции: «IS NOT NULL», «NOT <поле> is NULL»:
ГДЕ ГТД.Регистратор.Организация IS NOT NULL
или
ГДЕ NOT ГТД.Регистратор.Организация IS NULL
Как вывести результат запроса в табличный документ?
Для этого можно использовать объект ПостроительОтчета:
ТабДок = Новый ТабличныйДокумент; Результат = РезультатЗапроса.Выгрузить(); Построитель = Новый ПостроительОтчета; Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Результат); Построитель.Вывести(ТабДок); ТабДок.Записать("D:\mxl\Таблица.mxl");
Как посчитать возраст по дате рождения в запросе 1С8?
Использовать функцию языка запроса РАЗНОСТЬДАТ:
ВЫБРАТЬ Сотрудники.Сотрудник, Сотрудники.Пол, РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ТекДата, ГОД) КАК Возраст ИЗ Сотрудники КАК Сотрудники ПОЛНОЕ СОЕДИНЕНИЕ ПриемНаРаботу КАК ПриемНаРаботу ПО Сотрудники.Сотрудник = ПриемНаРаботу.Сотрудник ПОЛНОЕ СОЕДИНЕНИЕ Пенсия КАК Пенсия ПО Сотрудники.Сотрудник = Пенсия.Сотрудник
Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?
Бывает, что в консоли запрос отрабатывается нормально, но в рабочем режиме падает с ошибкой «Значение не является значением объектного типа (Сумма)». При этом отладчик показывает, что в коллекции «ВыборкаИзРезультатаЗапроса» находиться сумма со значением «Ошибка чтения значения». При отладке выдается «Ошибка чтения значения», если в функции написать так:
Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Возврат Выборка;
Ошибка чтения значений результата запроса, возникает из-за того, что в выборке еще не осуществлена установка на первый элемент выборки. Для этого существует метод «Следующий()» коллекции «ВыборкаИзРезультатаЗапроса». Поэтому надо писать так:
Если Выборка.Следующий() Тогда ДоговорКонтрагента = Выборка.Наименование; КонецЕсли;
Как запросом получить все подчиненные документы?
С помощью Функции «ПолучитьСписокВводимыхДокументовНаОсновании» получим список документов, которые вводятся на основании заданного документа:
// Параметры: ДокументПоиска: Тип - Метаданные объекта Функция ПолучитьСписокВводимыхДокументовНаОсновании(ДокументПоиска) Экспорт СписокДокументов = Новый СписокЗначений; Для Каждого Документ Из Метаданные.Документы Цикл Если Документ.ВводитсяНаОсновании.Содержит(ДокументПоиска) Тогда СписокДокументов.Добавить(Документ.Имя, Документ.Синоним); КонецЕсли; КонецЦикла; Возврат СписокДокументов; КонецФункции
Теперь, на основании списка документов найдем все подчинённые заданному документу:
Функция ПолучитьПодчиненныеДокументы() СписокЗаполнения = ПолучитьСписокВводимыхДокументовНаОсновании(СсылкаНаОбъект.Метаданные()); ТекстЗапросаПоСтатусу = ""; Для Каждого ЭлементСписка Из СписокЗаполнения Цикл Если НЕ ПустаяСтрока(ТекстЗапросаПоСтатусу) Тогда ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + " |ОБЪЕДИНИТЬ ВСЕ |"; КонецЕсли; ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + " |ВЫБРАТЬ " + ?(ПустаяСтрока(ТекстЗапросаПоСтатусу), "РАЗРЕШЕННЫЕ", "") + " | Док.Ссылка КАК ПодчиненныйДокумент |ИЗ | Документ." + ЭлементСписка.Значение + " КАК Док |ГДЕ | Док.ДокументОснование = &парамОснование | И Док.Проведен |"; КонецЦикла; Запрос = Новый Запрос; Запрос.УстановитьПараметр("парамОснование", СсылкаНаОбъект); Запрос.Текст = ТекстЗапросаПоСтатусу; Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ПодчиненныйДокумент"); КонецФункции // ПолучитьПодчиненныеДокументы()
Выведем полученные документы:
Процедура ВывестиПодчиненныеДокументы() Массив = ПолучитьПодчиненныеДокументы(); Для каждого Эл Из Массив Цикл Сообщить(Эл); КонецЦикла; КонецПроцедуры
Как выглядит недокументированный синтаксис оператора ВЫБОР?
Вот нестандартный вариант синтаксиса оператора ВЫБОР:
ВЫБРАТЬ ВЫБОР ДЕНЬНЕДЕЛИ(ДАТАВРЕМЯ(2015, 4, 1)) КОГДА 1 ТОГДА "Понедельник" КОГДА 2 ТОГДА "Вторник" КОГДА 3 ТОГДА "Среда" КОГДА 4 ТОГДА "Четверг" КОГДА 5 ТОГДА "Пятница" КОГДА 6 ТОГДА "Суббота" ИНАЧЕ "Воскресенье" КОНЕЦ КАК ДеньНедели
В этом примере показано, как с помощью опрератора ВЫБОР выводить текстовое представление дня недели.
Как составить запрос к табличной части документа?
Пример запроса:
Построитель.Текст = "ВЫБРАТЬ | Товары.Ответственный, | Товары.Ссылка КАК Документ, | Товары.Номенклатура, | СУММА(Товары.Сумма) КАК Сумма |ИЗ | Документ.ЧекККМ.Товары КАК Товары |ГДЕ | Товары.Ссылка.Дата Между &ДатаНач и &ДатаКон |СГРУППИРОВАТЬ ПО | Товары.Ссылка, | Товары.Ответственный, | Товары.Номенклатура";
Особенность этого запроса в том, что мы обращаемся к табличной части «Товары». Поэтому к реквизитам документа «ЧекККМ» мы обращаемся через свойство «Ссылка». Только в этом случае мы сможем получить строки табличной части документа. Если не указать свойство «Ссылка», то появится ошибка, примерно такого вида:
{(7, 5)}: Поле не найдено «Документ.ЧекККМ.Дата»
Как запросом для документа найти все подчинённые ему документы?
Воспользуемся следующим запросом:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | СчетФактураВыданный.Ссылка |ИЗ | Документ.СчетФактураВыданный КАК СчетФактураВыданный |ГДЕ | СчетФактураВыданный.ДокументОснование = &ДокументОснование"; Запрос.УстановитьПараметр("ДокументОснование", Накладная); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл СФ = Выборка.Ссылка.ПолучитьОбъект(); СФ.ДокументОснование = ""; СФ.Записать(РежимЗаписиДокумента.Запись); КонецЦикла;
Как сравнить строки в запросе?
| ГДЕ (Номер ПОДОБНО &НомерНакладной) Запрос.УстановитьПараметр("НомерНакладной", "%"+НомерНакладной+"%");
Как в запросе проверить поле на пустую ссылку?
ВЫБРАТЬ Начисление.Ссылка, Увольнение.Ссылка КАК Ссылка1, Начисление.ДокументОснование, Увольнение.ДокументОснование КАК ДокументОснование1 ИЗ Документ.НачислениеЗарплатыРаботникамОрганизаций КАК Начисление СОЕДИНЕНИЕ Документ.УвольнениеИзОрганизаций КАК Увольнение ПО Начисление.ДокументОснование = Увольнение.ДокументОснование ГДЕ (Начисление.ДокументОснование<> ЗНАЧЕНИЕ(Документ.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка))
Заметим, что в параметре пишем «Документ», а не «Документы» и «ПустаяСсылка» без скобок.
Как в запросе убрать фильтр на значение параметра?
Например, нам нужно вывести данные о продажах, отфильтровав их по значению в поле формы «Товар», если в этом поле выбран нужный нам товар. И если товар не выбран, то вывести данные по всем товарам. Пример запроса такой:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , | &Товар) КАК ПродажиОбороты"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Запрос.УстановитьПараметр("Товар", Товар);
Рассмотрим четыре способа, как избавится от фильтра в запросе.
- Изменим параметр запроса с помощью функции «СтрЗаменить»:
Если Товар.Пустая() Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", ""); Иначе Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", "Номенклатура = &Товар"); КонецЕсли;
- В параметре виртуальной таблицы вместо значения «&Товар» запишем следующее выражение:
|&Товар = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) | ИЛИ Номенклатура = &Товар
Если параметр товар не заполнен, то первое выражение примет значение ИСТИНА, тогда значение всего выражения примет значение ИСТИНА. В этом случае как-будто и нет никакого фильтра. Но если товар заполнен, то первое выражение принимает значение ЛОЖЬ. Тогда сработает второе выражение и произойдет фильтрация по товару.
- Еще один способ возможен благодаря новому объекту платформы «СхемаЗапроса (QuerySchema)», который появился в версии 1С 8.3.5:
СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст); Если ЗначениеЗаполнено(Товар) Тогда СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Источник.Параметры[3].Выражение = Новый ВыражениеСхемыЗапроса("Номенклатура = &Товар"); КонецЕсли; Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
- Последний способ очень громоздкий, но его тоже можно использовать:
Если Товар.Пустая() Тогда Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , ) КАК ПродажиОбороты" Иначе Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , Номенклатура = &Товар) КАК ПродажиОбороты"; КонецЕсли;
Как видите, в запросе изменилось только значение условия виртуальной таблицы.
ПОДПИСКА
Ошибка чтения значения
Автор Рафаэль, 10 янв 2016, 13:55
0 Пользователей и 1 гость просматривают эту тему.
1С 8.3, самописная, учебная.
Всем доброго времени суток! Столкнулся с проблемой и никак ее не могу решить. Вот текст запроса:
«ВЫБРАТЬ
| ПродажаТоваровТовары.Номенклатура,
| СУММА(ПродажаТоваровТовары.Количество) КАК Количество,
| ПродажаТоваровТовары.Ссылка.Склад
|ПОМЕСТИТЬ ТабДок
|ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
|ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка
| И ПродажаТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ПродажаТоваровТовары.Номенклатура,
| ПродажаТоваровТовары.Ссылка.Склад
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТабДок.Номенклатура,
| ТабДок.Количество,
| ТабДок.Склад,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстатки,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СуммаОстаток, 0) КАК СуммаОстатки
|ИЗ
| ТабДок КАК ТабДок
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &Момент,
| (Номенклатура, Склад) В
| (ВЫБРАТЬ
| ТабДок.Номенклатура,
| ТабДок.Склад
| ИЗ
| ТабДок КАК ТабДок)) КАК ОстаткиНоменклатурыОстатки
| ПО ТабДок.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура»
При попытке произвести выборку в дебаггере показывает ошибку чтения значений.
В этой строке: ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
В чем ошибка?
Вот остальная часть процедуры:
Если Режим = РежимПроведенияДокумента.Оперативный Тогда
Запрос.УстановитьПараметр(«Момент», Неопределено);
Иначе
Запрос.УстановитьПараметр(«Момент», ТекущаяДата());
КонецЕсли;
Запрос.УстановитьПараметр(«Ссылка», Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Инфо = Новый Структура;
Массив = Новый Массив;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Инфо.Вставить(«Номенклатура», ВыборкаДетальныеЗаписи.Номенклатура);
Инфо.Вставить(«Склад», ВыборкаДетальныеЗаписи.Склад);
Инфо.Вставить(«КоличесвтоУчет», ВыборкаДетальныеЗаписи.КоличесвтоУчет);
Массив.Добавить(Инфо);
Более подробнее, какую ошибку показывает?
Если я Вам помог, нажми — Спасибо!
Выполните
РезультатЗапроса.Выбрать().Количество()
Если больше 0 тогда выборка со значениями и в цикле в переменную РезультатЗапроса будут передаваться строки выборки запроса на каждой итерации.
Хотите просмотреть всю выборку в таблице на отладке тогда Вам следующий код
Запрос.Выполнить().Выгрузить()
Получите ТЗ которую удобно анализировать визуально в отладке.
Если я Вам помог, нажми — Спасибо!
Можете поподробнее объяснить, если не сложно? А то что то не могу понять..
Цитата: Рафаэль от 10 янв 2016, 13:55Массив = Новый Массив;
«Массив» — служебное слово. Слева, имя переменной, придумайте другое.
Затем после цикла точку останова поставьте и посмотрите, чему «Массив» равен, скорее всего ничему.
Получил помощь — скажи СПАСИБО.
Разобрался сам — расскажи другим.
Ну попробую)
Когда используется Выбрать(), то на выходе получается ВыборкаРезультатаЗапроса (это можно назвать его «контейнер» со строками), обход выборки происходит с помощью Следующий() в цикле. На каждом итерации (т.е. повторном выполнении тела) цикла происходит инициализация (присваивание строки) в переменную со значением ВыборкаРезультатЗапроса. Например имеем результат выборки:
Номенклатура | Количество |
Яблоко | 1 |
Груша | 2 |
Банан | 3 |
Далее при конструкции
РезультатЗапроса = Запрос.Выполнить().Выбрать();
В переменной РезультатЗапроса будет значение типа «ВыборкаРезультатаЗапроса». Для того чтобы обойти значения необходимо использовать конструкцию.
Пока РезультатЗапроса.Следующий() Цикл
<<тело цикла>>
КонецЦикла;
При первом проходе с переменной РезультатЗапроса будет значения
Номенклатура | Количество |
Яблоко | 1 |
При втором
Номенклатура | Количество |
Груша | 2 |
и т.д.
Их можно просмотреть в отладке.
Добавлено: 10 янв 2016, 15:16
Цитата: cska-fanat-kz от 10 янв 2016, 15:11
Цитата: Рафаэль от 10 янв 2016, 13:55Массив = Новый Массив;
«Массив» — служебное слово. Слева, имя переменной, придумайте другое.
Затем после цикла точку останова поставьте и посмотрите, чему «Массив» равен, скорее всего ничему.
Нет не является, используется только в конструкции «Новый Массив». Теоретически его можно использовать без каких либо проблем, на практике — просто не желательно.
Если я Вам помог, нажми — Спасибо!
да все у вас верно, в отладке так и будет показывать «Ошибка чтения значения». Поставьте точку останова во внутрь цикла и увидите в ней данные.
Если я Вам помог, нажми — Спасибо!
Простой запрос и ошибка в чтении значения |
Я |
Iater
09.06.15 — 01:07
Всем привет! Помогите, пожалуйста, справится с запросом — в консоли запросов всё работает идеально, а на практике выдает ошибку в чтении значения я хз почему:
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Сотрудники.ДатаРождения КАК ДатаРождения
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Наименование = &ФИО»;
Запрос.УстановитьПараметр(«ФИО», ФИО);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
Как я понял, проблема в позиционировании выборки на значении? Как же спозиционировать-то иначе?
Iater
1 — 09.06.15 — 01:10
забыл скачать — в 8.3 работаю
Сергиус
2 — 09.06.15 — 01:11
(0)Что у тебя в параметре ФИО?
Iater
3 — 09.06.15 — 01:13
в ФИО - Иванов я точку останова поставил - в ФИО точно нормально всё читает
France
4 — 09.06.15 — 01:14
пока ВыборкаДетальныеЗаписи.Следующий() цикл
здесь песню поешь
конецЦикла.
и не будет ошибки..
Сергиус
5 — 09.06.15 — 01:15
(3)Запрос.УстановитьПараметр(«ФИО», СокрЛП(ФИО));
Iater
6 — 09.06.15 — 01:16
у меня одно значение, не нужен цикл. Впрочем, поставил — ноль на массу. Не работает всё равно
Iater
7 — 09.06.15 — 01:17
в ФИО сейчас забил не Иванов, а цифру «1» — не работает хоть как ты СокрЛП или не сокр
Сергиус
8 — 09.06.15 — 01:19
(7)Так может нет такого сотрудника с наименованием «1» в базе?
Iater
9 — 09.06.15 — 01:19
Сергиус, есть… в консоли же всё верно выводит
Сергиус
10 — 09.06.15 — 01:22
ВыборкаДетальныеЗаписи.Количество() что говорит?
Iater
11 — 09.06.15 — 01:24
неопределено
Сергиус
12 — 09.06.15 — 01:29
Сохрани все в обработку, и выложи куда ть.
Сергиус
13 — 09.06.15 — 01:29
или можно по ТимВьюверу)
France
14 — 09.06.15 — 01:34
(6) сообщение об ошибке есть?.. если да, то текст сюда.
Iater
15 — 09.06.15 — 01:36
ошибки нет, просто не дает разницу дат вычислить т.к. дату рождения не может выцепить
France
16 — 09.06.15 — 01:39
а ФИО как устанавливается?? можно сюда текст??
France
17 — 09.06.15 — 01:42
в консоли небось параметры автоматически определяешь.. и выбор значения делаешь по кнопке выбора..
Iater
18 — 09.06.15 — 01:43
в форме документа делаю:
&НаСервере
Функция ДатаРождения (ФИО)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Сотрудники.ДатаРождения КАК ДатаРождения
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|ГДЕ
| Сотрудники.Наименование = &ФИО";
Запрос.УстановитьПараметр("ФИО", ФИО);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
Возврат ДатаРождения;
КонецФункции
&НаКлиенте
Процедура ФИОФИОПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.ФИО.ТекущиеДанные;
ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);
ДатаДокумента = Объект.Дата;
Возраст = ДатаДокумента - ДатаРождения;
СтрокаТабличнойЧасти.Возраст = Возраст;
КонецПроцедуры
France
19 — 09.06.15 — 01:46
смотри что тут » ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);»
Iater
20 — 09.06.15 — 01:50
не понял что там?
Вася Чез
21 — 09.06.15 — 01:50
(18) ДатаДокумента и ДатаРождения это дата в секундах или что?
Iater
22 — 09.06.15 — 01:52
да плевать пока, в секундах наверняка )) у меня запрос не получается — вот что хреново
France
23 — 09.06.15 — 01:53
(20) тип значения.
Iater
24 — 09.06.15 — 01:55
France, объясни, пожалуйста, как для тупого )) ФИО передается в запрос — я это вижу, когда ставлю точку останова
France
25 — 09.06.15 — 01:59
(24) да, ты видишь фио, но не обязательно что это строка. а в запросе ты со строкой сравниваешь. в отладчике тип значения виден..
Iater
26 — 09.06.15 — 02:09
France, ФИО из формы передается как ссылка (тип СправочникСсылка.Сотрудники) чета я не соображаю в чем проблема
Вася Чез
27 — 09.06.15 — 02:11
(26) Проблема в том, что в консоли у тебя ФИО строка, а сейчас у ФИО какой тип? посмотри в отладчике, правой тапкой по ФИО во время отладки «Вычислить выражение».
France
28 — 09.06.15 — 02:14
СправочникСсылка.Сотрудники (27) (26) ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО.наименование);»
France
29 — 09.06.15 — 02:14
в консоли он как раз устанавливал правильное значение, а не строку, так как в консоли 1С-на сама тип определяет..
Iater
30 — 09.06.15 — 02:16
всё заработала, спасибо огромное!!
Дейсвительно из-за типа ФИО. Поставил:
Iater
31 — 09.06.15 — 02:17
ДатаРождения = ДатаРождения(Строка(СтрокаТабличнойЧасти.ФИО)); и всё заработало
France
32 — 09.06.15 — 02:24
(31) в другом месте такое преобразование боком вылезти может))
Iater
33 — 09.06.15 — 02:37
почему7
Iater
34 — 09.06.15 — 02:37
как по-другому сделать, чтобы всё было правильно и работало?
France
35 — 09.06.15 — 02:39
(33) у спр сотрудники представление «наименование». если бы был код — твой вариант не сработал бы (хотя, представление код вроде и не часто используется). нужно было явно указать ФИО.Наименование, либо в запросе делать фильтр на ссылку, а не на наименование..
Simod
36 — 09.06.15 — 06:51
Раньше было «модно» искать через НайтиПоНаименованию(), сейчас это делают через Запросы. Может пора разобраться что такое Ссылка и Объект, и как с ними работать?
hhhh
37 — 09.06.15 — 07:11
(34) ну, по-нормальному. Выбирать сотрудника из справочника, а не писать вручную фамилию.
Вася Чез
38 — 09.06.15 — 07:31
(37) может это особенность нетленки ТС — заполнять ТЧ вручную, хз правда зачем
azt-yur
39 — 09.06.15 — 07:47
У тебя уже ссылка на справочник имеется. Зачем писать целую функцию для получения даты рождения, да еще и с запросом к этому же справочнику?
Не проще ли
ДатаРождения = СтрокаТабличнойЧасти.ФИО.ДатаРождения;
katc
40 — 09.06.15 — 08:47
Выборка и пустой может быть.
Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения; КонецЕсли;
ДенисЧ
41 — 09.06.15 — 08:50
"Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда " три года. Без конфискации.
katc
42 — 09.06.15 — 09:18
что Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Что если ВыборкаДетальныеЗаписи.Следующий() Цикл
если запрос надо позиционировать на первой записи, как в этом случае, так что я амнистирован.
katc
43 — 09.06.15 — 09:21
его запрос изначально предназначен вернуть одну запись, городить из него цикл нет ни какого смысла.
Ну а теперь расскажи за что в этом случае меня надо на 3 года?
Чем конструкция Пока Выборка.Следующий() Цикл отличается от Если Выборка.Следующий() Тогда
Krolik Bezobraznik
44 — 09.06.15 — 09:29
Чудес не бывает.
Перемудрил с типами значений передаваемых параметров.
Ваш запрос ничего не возвращает. Далее у вас стоит процедура получения значения строки. Строк у вас нет, а вы упорно даете указание чтобы вернуть значение. Тут и проблема. ИМХО.
Используйте конструкцию с циклом. Она более корректная. Если переживаете, что ваш запрос вернет более одной строки, то возвращайте в запросе ПЕРВЫЕ 1. Если результат запроса будет пустым, то ошибок не будет и вы отладчиком увидите, если проблемы будут.
Доброго времени суток, коллеги! Много раз на нашем сайте обсуждалась тема запросов в 1С, например, как получить всех родителей элемента справочника одним запросом. В этой статье вы увидите еще много разных примеров запросов, которые помогут вам решать повседневные задачи. Вот, посмотрите.
Содержание
- Как в запросе 1с8 установить условие проверки периода на конец дня?
- Как правильно обрабатывать значения NULL в запросе 1С8?
- Как вывести результат запроса в табличный документ?
- Как посчитать возраст по дате рождения в запросе 1С8?
- Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?
- Как запросом получить все подчиненные документы?
- Как выглядит недокументированный синтаксис оператора ВЫБОР?
- Как составить запрос к табличной части документа?
- Как запросом для документа найти все подчинённые ему документы?
- Как сравнить строки в запросе?
- Как в запросе проверить поле на пустую ссылку?
- Как в запросе убрать фильтр на значение параметра?
Как в запросе 1с8 установить условие проверки периода на конец дня?
В запросе воспользуемся функцией КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ), она приведет дату к виду «23:59:59».
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | СчетНаОплатуПокупателю.Дата |ИЗ | Документ.СчетНаОплатуПокупателю КАК СчетНаОплатуПокупателю |ГДЕ | СчетНаОплатуПокупателю.Дата МЕЖДУ НАЧАЛОПЕРИОДА(&ДатаНачала, ДЕНЬ) | И КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ)"; Запрос.УстановитьПараметр("ДатаКонец", ДатаКонец); Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); РезультатЗапроса = Запрос.Выполнить();
Как правильно обрабатывать значения NULL в запросе 1С8?
В запросе значения типа NULL образуются в результате соединений (ЛЕВОЕ, ПРАВОЕ), когда элементу из одной таблицы по условию не находится соответствующего элемента из другой. Значение типа NULL имею специфические особенности:
-
- Cравнение значения NULL с любым другим аргументом всегда возвращает ложь. Например, если в запросе поле «Количество» возвращает NULL, то если использовать операции сравнения «<», «>», или «=» с числом 1000, то результатом всегда будет «Ложь». Даже, если сравнить с самим значением NULL, то все равно результатом будет «Ложь»:
ГДЕ ГТД.Количество = NULL
-
- Применение арифметических операций к значению типа NULL всегда возвращает NULL. Например, если в запросе к полю «Количество», которое возвращает NULL, прибавить числовое значение или отнять от него числовое значение, то будет возвращено значение NULL:
ГТД.Количество+300 КАК Поле1
-
- Для определения значения NULL используется функция конструкция «IS NULL». Чтобы получить записи со значением NULL воспользуемся следующей конструкцией:
ГДЕ ГТД.Регистратор.Организация IS NULL
если нужно получить записи без NULL, тогда:
ГДЕ НЕ ГТД.Регистратор.Организация IS NULL
- Для преобразования типа NULL используется функция «isNULL» или «ЕСТЬNULL». Теперь можно сравнивать с полученным значением или применять к нему арифметические операции, не боясь за конечный результат:
- Для определения значения NULL используется функция конструкция «IS NULL». Чтобы получить записи со значением NULL воспользуемся следующей конструкцией:
ЕСТЬNULL(ГТД.Количество, 0)+300 КАК Поле1
-
- Для того, чтобы в результате запроса отсечь записи, содержащие значения NULL применяются следующие конструкции: «IS NOT NULL», «NOT <поле> is NULL»:
ГДЕ ГТД.Регистратор.Организация IS NOT NULL
или
ГДЕ NOT ГТД.Регистратор.Организация IS NULL
Как вывести результат запроса в табличный документ?
Для этого можно использовать объект ПостроительОтчета:
ТабДок = Новый ТабличныйДокумент; Результат = РезультатЗапроса.Выгрузить(); Построитель = Новый ПостроительОтчета; Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Результат); Построитель.Вывести(ТабДок); ТабДок.Записать("D:mxlТаблица.mxl");
Как посчитать возраст по дате рождения в запросе 1С8?
Использовать функцию языка запроса РАЗНОСТЬДАТ:
ВЫБРАТЬ Сотрудники.Сотрудник, Сотрудники.Пол, РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ТекДата, ГОД) КАК Возраст ИЗ Сотрудники КАК Сотрудники ПОЛНОЕ СОЕДИНЕНИЕ ПриемНаРаботу КАК ПриемНаРаботу ПО Сотрудники.Сотрудник = ПриемНаРаботу.Сотрудник ПОЛНОЕ СОЕДИНЕНИЕ Пенсия КАК Пенсия ПО Сотрудники.Сотрудник = Пенсия.Сотрудник
Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?
Бывает, что в консоли запрос отрабатывается нормально, но в рабочем режиме падает с ошибкой «Значение не является значением объектного типа (Сумма)». При этом отладчик показывает, что в коллекции «ВыборкаИзРезультатаЗапроса» находиться сумма со значением «Ошибка чтения значения». При отладке выдается «Ошибка чтения значения», если в функции написать так:
Результат = Запрос.Выполнить(); Выборка = Результат.Выбрать(); Возврат Выборка;
Ошибка чтения значений результата запроса, возникает из-за того, что в выборке еще не осуществлена установка на первый элемент выборки. Для этого существует метод «Следующий()» коллекции «ВыборкаИзРезультатаЗапроса». Поэтому надо писать так:
Если Выборка.Следующий() Тогда ДоговорКонтрагента = Выборка.Наименование; КонецЕсли;
Как запросом получить все подчиненные документы?
С помощью Функции «ПолучитьСписокВводимыхДокументовНаОсновании» получим список документов, которые вводятся на основании заданного документа:
// Параметры: ДокументПоиска: Тип - Метаданные объекта Функция ПолучитьСписокВводимыхДокументовНаОсновании(ДокументПоиска) Экспорт СписокДокументов = Новый СписокЗначений; Для Каждого Документ Из Метаданные.Документы Цикл Если Документ.ВводитсяНаОсновании.Содержит(ДокументПоиска) Тогда СписокДокументов.Добавить(Документ.Имя, Документ.Синоним); КонецЕсли; КонецЦикла; Возврат СписокДокументов; КонецФункции
Теперь, на основании списка документов найдем все подчинённые заданному документу:
Функция ПолучитьПодчиненныеДокументы() СписокЗаполнения = ПолучитьСписокВводимыхДокументовНаОсновании(СсылкаНаОбъект.Метаданные()); ТекстЗапросаПоСтатусу = ""; Для Каждого ЭлементСписка Из СписокЗаполнения Цикл Если НЕ ПустаяСтрока(ТекстЗапросаПоСтатусу) Тогда ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + " |ОБЪЕДИНИТЬ ВСЕ |"; КонецЕсли; ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + " |ВЫБРАТЬ " + ?(ПустаяСтрока(ТекстЗапросаПоСтатусу), "РАЗРЕШЕННЫЕ", "") + " | Док.Ссылка КАК ПодчиненныйДокумент |ИЗ | Документ." + ЭлементСписка.Значение + " КАК Док |ГДЕ | Док.ДокументОснование = &парамОснование | И Док.Проведен |"; КонецЦикла; Запрос = Новый Запрос; Запрос.УстановитьПараметр("парамОснование", СсылкаНаОбъект); Запрос.Текст = ТекстЗапросаПоСтатусу; Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ПодчиненныйДокумент"); КонецФункции // ПолучитьПодчиненныеДокументы()
Выведем полученные документы:
Процедура ВывестиПодчиненныеДокументы() Массив = ПолучитьПодчиненныеДокументы(); Для каждого Эл Из Массив Цикл Сообщить(Эл); КонецЦикла; КонецПроцедуры
Как выглядит недокументированный синтаксис оператора ВЫБОР?
Вот нестандартный вариант синтаксиса оператора ВЫБОР:
ВЫБРАТЬ ВЫБОР ДЕНЬНЕДЕЛИ(ДАТАВРЕМЯ(2015, 4, 1)) КОГДА 1 ТОГДА "Понедельник" КОГДА 2 ТОГДА "Вторник" КОГДА 3 ТОГДА "Среда" КОГДА 4 ТОГДА "Четверг" КОГДА 5 ТОГДА "Пятница" КОГДА 6 ТОГДА "Суббота" ИНАЧЕ "Воскресенье" КОНЕЦ КАК ДеньНедели
В этом примере показано, как с помощью опрератора ВЫБОР выводить текстовое представление дня недели.
Как составить запрос к табличной части документа?
Пример запроса:
Построитель.Текст = "ВЫБРАТЬ | Товары.Ответственный, | Товары.Ссылка КАК Документ, | Товары.Номенклатура, | СУММА(Товары.Сумма) КАК Сумма |ИЗ | Документ.ЧекККМ.Товары КАК Товары |ГДЕ | Товары.Ссылка.Дата Между &ДатаНач и &ДатаКон |СГРУППИРОВАТЬ ПО | Товары.Ссылка, | Товары.Ответственный, | Товары.Номенклатура";
Особенность этого запроса в том, что мы обращаемся к табличной части «Товары». Поэтому к реквизитам документа «ЧекККМ» мы обращаемся через свойство «Ссылка». Только в этом случае мы сможем получить строки табличной части документа. Если не указать свойство «Ссылка», то появится ошибка, примерно такого вида:
{(7, 5)}: Поле не найдено «Документ.ЧекККМ.Дата»
Как запросом для документа найти все подчинённые ему документы?
Воспользуемся следующим запросом:
Запрос = Новый Запрос; Запрос.Текст = " |ВЫБРАТЬ | СчетФактураВыданный.Ссылка |ИЗ | Документ.СчетФактураВыданный КАК СчетФактураВыданный |ГДЕ | СчетФактураВыданный.ДокументОснование = &ДокументОснование"; Запрос.УстановитьПараметр("ДокументОснование", Накладная); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Пока Выборка.Следующий() Цикл СФ = Выборка.Ссылка.ПолучитьОбъект(); СФ.ДокументОснование = ""; СФ.Записать(РежимЗаписиДокумента.Запись); КонецЦикла;
Как сравнить строки в запросе?
| ГДЕ (Номер ПОДОБНО &НомерНакладной) Запрос.УстановитьПараметр("НомерНакладной", "%"+НомерНакладной+"%");
Как в запросе проверить поле на пустую ссылку?
ВЫБРАТЬ Начисление.Ссылка, Увольнение.Ссылка КАК Ссылка1, Начисление.ДокументОснование, Увольнение.ДокументОснование КАК ДокументОснование1 ИЗ Документ.НачислениеЗарплатыРаботникамОрганизаций КАК Начисление СОЕДИНЕНИЕ Документ.УвольнениеИзОрганизаций КАК Увольнение ПО Начисление.ДокументОснование = Увольнение.ДокументОснование ГДЕ (Начисление.ДокументОснование<> ЗНАЧЕНИЕ(Документ.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка))
Заметим, что в параметре пишем «Документ», а не «Документы» и «ПустаяСсылка» без скобок.
Как в запросе убрать фильтр на значение параметра?
Например, нам нужно вывести данные о продажах, отфильтровав их по значению в поле формы «Товар», если в этом поле выбран нужный нам товар. И если товар не выбран, то вывести данные по всем товарам. Пример запроса такой:
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , | &Товар) КАК ПродажиОбороты"; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); Запрос.УстановитьПараметр("Товар", Товар);
Рассмотрим четыре способа, как избавится от фильтра в запросе.
- Изменим параметр запроса с помощью функции «СтрЗаменить»:
Если Товар.Пустая() Тогда Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", ""); Иначе Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", "Номенклатура = &Товар"); КонецЕсли;
- В параметре виртуальной таблицы вместо значения «&Товар» запишем следующее выражение:
|&Товар = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) | ИЛИ Номенклатура = &Товар
Если параметр товар не заполнен, то первое выражение примет значение ИСТИНА, тогда значение всего выражения примет значение ИСТИНА. В этом случае как-будто и нет никакого фильтра. Но если товар заполнен, то первое выражение принимает значение ЛОЖЬ. Тогда сработает второе выражение и произойдет фильтрация по товару.
- Еще один способ возможен благодаря новому объекту платформы «СхемаЗапроса (QuerySchema)», который появился в версии 1С 8.3.5:
СхемаЗапроса = Новый СхемаЗапроса; СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст); Если ЗначениеЗаполнено(Товар) Тогда СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Источник.Параметры[3].Выражение = Новый ВыражениеСхемыЗапроса("Номенклатура = &Товар"); КонецЕсли; Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
- Последний способ очень громоздкий, но его тоже можно использовать:
Если Товар.Пустая() Тогда Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , ) КАК ПродажиОбороты" Иначе Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , Номенклатура = &Товар) КАК ПродажиОбороты"; КонецЕсли;
Как видите, в запросе изменилось только значение условия виртуальной таблицы.
ПОДПИСКА
Почему возникает Ошибка чтения значений?
В консоле запрос работает, а вот в коде выдаёт ошибку.
-
Вопрос задан
-
1798 просмотров
В коде напиши Запрос.Выполнить().Выгрузить() вместо Запрос.Выполнить().Выбрать()
Метод выгрузить возвращает тебе таблицу значений как в консоли, выбрать подходит для поочередного обхода значений таблицы в цикле.
Пригласить эксперта
-
Показать ещё
Загружается…
23 сент. 2023, в 01:31
6000 руб./за проект
23 сент. 2023, в 01:13
3000 руб./за проект
22 сент. 2023, в 23:30
6500 руб./за проект