Ошибка чтения значения в Выборке |
Я |
21.12.20 — 09:50
Ошибка чтения значения в Выборке:
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
Метод с «Выбрать» на «Выгрузить» не могу поменять, нужно сделать через именно через «Выбрать()»
ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
«ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
|ГДЕ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
| И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;
ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);
ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
ВыборкаВредность.Следующий();
1 — 21.12.20 — 09:50
Я только начинаю, не судите строго
2 — 21.12.20 — 09:52
и чего дальше?
3 — 21.12.20 — 09:54
Для начала будем судить за формулировку вопроса )))
Где ошибка? Когда возникает?
4 — 21.12.20 — 09:57
(3) Ошибка чтения значения в Выборке:
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
5 — 21.12.20 — 10:02
(4) что это значит? какого значения, что возвращает .следующий()?
6 — 21.12.20 — 10:03
(4) То есть. Ты делаешь ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
Потом смотришь в ВыборкаВредность
И правильно она тебе говорит. Выборку перебирать кто будет? Сам Абд аль-Маджи́д ат-Тикри́ти ?
7 — 21.12.20 — 10:04
(6) хДДД
8 — 21.12.20 — 10:05
вангануть что ли
если написать
Пока ВыборкаВредность.Следующий() Цикл
Сообщить(ВыборкаВредность.ВидРасчета);
КонецЦикла;
что будет?
а еще лучше подключить тяжелую артиллерию — отладчик
9 — 21.12.20 — 10:06
(6) Так он и перебирает…Но только берет первый элемент из выборки:
ВыборкаВредность.Следующий();
Но вот незадача, если результат запроса пустой, то на этой строчке будет ошибка.
10 — 21.12.20 — 10:10
(8) Ничего не выдаёт, вычисляю выражение «Ошибка чтения значения»
11 — 21.12.20 — 10:12
(8) а «ВидРасчета» — переменная не определена
12 — 21.12.20 — 10:14
(6) Проблема в том, что у меня не получается :С
13 — 21.12.20 — 10:16
(12) Посмотри типы значений в отборах запроса. Какой тип значения у выражения ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение?
14 — 21.12.20 — 10:23
(13) https://ibb.co/Lzz8mRK
Если я правильно тебя понял
15 — 21.12.20 — 10:25
(10) значит в результате запроса ничего нет, либо параметры запроса направильные, либо в ТЧ документа ДокументПриема.Ссылка нет строк с таким видом Доплат
16 — 21.12.20 — 10:35
(15) В общем, ложилась такая ситуация: Когда у человека проставлена «ДоплатаЗаВредность» , то у него всё гучи и всё нормально работает, а когда у него нету этой доплаты, то ошибка эта вылазит. Нужно как-то сделать так, чтобы эта ошибка исправилась , чтобы если у него нет «ДоплатыЗаВредность», то и код прекращал работать
17 — 21.12.20 — 10:36
Это реально как-то сделать?
18 — 21.12.20 — 10:38
(16) для этого и есть Выборка.Следующий()
19 — 21.12.20 — 10:38
Если …
20 — 21.12.20 — 10:39
Убери ты ссылку в условии | И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;
Сделай | И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета= &ВидРасчетаВредность»;
21 — 21.12.20 — 10:42
Стандартная конструкция
Пока Выборка.Следующий() Цикл
если запрос ничего не вернет, то и в цикл программа не попадет
я делаю так
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Для Каждого Строка Из Результат.Выгрузить() Цикл
тра та та
КонецЦикла;
КонецЕсли;
возможны варианты, по ситуации
22 — 21.12.20 — 10:50
(17) Ошибка чтения значения говорит о том что у тебя выборка пустая. Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка. Если подразумевается всегда 1 элемент из запроса(либо он есть, либо запрос пустой), тогда можешь писать «Если Выборка.Следующий() Тогда» и обрабатывать первый элемент выборки, иначе выборка пустая. Если нужно обойти все элементы выборка то используй «Пока выборка.Следующий Цикл» Если нужно отработать условие при пустой выборке, можешь предварительно проверить Если Выборка.Количество()=0, А лучше результат на пустоту проверяй.
23 — 21.12.20 — 10:51
(22) «Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка.» а при Выборка.Следующий() возникает Ложь
24 — 21.12.20 — 11:29
самый простой вариант это
Таб = Запрос.Выполнить().Выгрузить();
Для Каждого Стр Из Таб Цикл
КонецЦикла;
1с не рекомендует так делать, но это самое удобное.
25 — 21.12.20 — 11:38
(24) но у меня же метод «Выбрать» ,А не «Выгрузить
26 — 21.12.20 — 11:39
(24) Так же работать будет ?
27 — 21.12.20 — 11:46
(26) смысл такой же, да
28 — 21.12.20 — 12:05
Эх, ничего не получается что-то у меня, столько помощи было от Вас, но что-то я ,видимо, совсем тупой :С
29 — 21.12.20 — 12:11
не знаю, что теперь и делать
30 — 21.12.20 — 12:22
(29) самый простой вариант, заплатить денюшку тому, кто сможет объяснить и показать. Либо читай умные книжки по 1с, как правильно писать запросы и их обходить.
31 — 21.12.20 — 12:30
(29) так гучи же
>>>у него всё гучи и всё нормально работает
в чем проблема то
>>>чтобы если у него нет «ДоплатыЗаВредность», то и код прекращал работать
код и перестает работать, если Выборка.Следующий() Ложь
Пока Выборка.Следующий() Цикл //тут неявная проверка на возврат Истина
почитай как это работает, даже в синтакс-помощнике. а истина будет, пока есть записи в результате запроса, то есть когда их нет(или закончатся), тогда и
>>>и код прекращал работать
32 — 21.12.20 — 12:55
(29) что не получается?
Если ВыборкаВредность.Следующий() Тогда
уже пробовал?
33 — 21.12.20 — 14:53
(32) я читал о том, как это делать, но всё равно не могу понять, как обходить результат запроса. Я читал о методе «Следующий()», да и делал до этого что-то простое , а сейчас на попу присел и ничего не получается.
Можешь хоть как-то помочь?
34 — 21.12.20 — 15:03
ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
«ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
|ГДЕ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
| И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;
ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);
ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
пока ВыборкаВредность.Следующий() Цикл
сообщить(«» + ВыборкаВредность.ВидРасчета + » » + ВыборкаВредность.Показатель1);
КонецЦикла;
Что выведет?
35 — 21.12.20 — 15:42
(34)было уже
>>>можешь хоть как то помочь?
можешь?
36 — 21.12.20 — 16:03
(34) Ничего не выводит, в выборке Ошибка чтения
37 — 21.12.20 — 16:08
(36) Ничего не выводит — значит результат запроса пустой.
Проверь ещё
результат = ЗапросВредность.Выполнить();
сообщить(«ЗАпрос пустой » + результат.Пустой());
ВыборкаВредность = результат.Выбрать();
Сообщить(«В выборке » + ВыборкаВредность.Количество() + » элементов»);
38 — 21.12.20 — 16:23
(37) Я уже писал выше:
Когда у человека заполнена «ДоплатаЗаВредность», то всё нормально выводиться, всё гучи. В данный момент, я выбираю сотрудника, у которого нет «ДоплатаЗаВредность».
Вообще, я это задание связано с выводом табличной части. Я создал внешнюю обработку, заполнил все параметры, остался только этот, который я не могу адекватно вывести.
Мне нужно » Если у человека есть ДоплатаЗаВредность, то выводиться число , которое нужно, а если нет( Как в нашем случае) , то нужно выводить «0».
Человеку не понравилось как я сделал задание и он сказал переделывать. Сказал, чтобы не было там ОшибкиЧтенияЗначения,я не знаю как её оттуда убрать, и идиоту понятно, если у человека нет «ДоплатаЗаВредность», то и ошибка будет.
39 — 21.12.20 — 16:25
троль что ли
40 — 21.12.20 — 16:26
(37) Я рассказал всю подноготную сейчас. В данный момент я проверяю челвоека, у которого нет «ДоплатаЗаВредность».
т.е. Запрос пустой и в выборке 0 элементов.
41 — 21.12.20 — 16:26
(39) Да не троль я , меня ебут ( извиняюсь за мат ), а я ничего не понимаю уже
42 — 21.12.20 — 16:28
(38) «то нужно выводить «0»» — это уже другой запрос должен быть.
43 — 21.12.20 — 16:28
(41) инициализируй новую строку нулем сразу, и только если есть результат пиши в показатель данные выборки, а если нет не пиши, так можно
44 — 21.12.20 — 16:30
Я не понимаю, что я делаю не так. Я написал в самом начале :
Если ЗначениеЗаполнено(ВыборкаВредность.Показатель1) = истина тогда
ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1;
Иначе
ОбластьМакетаРаботник1.Параметры.Вредность = «0»;
КонецЕсли;
45 — 21.12.20 — 16:32
Человеку не понравилось, сказал, чтобы я переделал, я понял, что нужно сделать выборку, я пытался разными способами сделать её, но у меня не получался ни один способ, решил обратиться на форум, чтобы помогли
46 — 21.12.20 — 16:32
(44) Если ВыборкаВредность.Следующий Тогда
ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1;
Иначе
ОбластьМакетаРаботник1.Параметры.Вредность = «0»;
КонецЕсли;
47 — 21.12.20 — 16:33
(46) *Если ВыборкаВредность.Следующий() Тогда
48 — 21.12.20 — 16:33
ну хз, все же объяснили. Первоначальная формулировка задачи от «человека» есть?
49 — 21.12.20 — 16:35
К (42) Как-то так например:
ВЫБРАТЬ
ВложенныйЗапрос.ВидРасчета как ВидРасчета
,Сумма(ВложенныйЗапрос.Показатель1) как Показатель1
ИЗ
(ВЫБРАТЬ
&ВидРасчетаВредность как ВидРасчета
,0 как Показатель1
объединить все
ВЫБРАТЬ
ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
ИЗ
Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
ГДЕ
ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета = &ВидРасчетаВредность
) КАК ВложенныйЗапрос
Сгруппировать по
ВложенныйЗапрос.ВидРасчета
50 — 21.12.20 — 16:35
1. Сохранить внешнюю печатную форму “Документы на трудоустройство (Единый)”.
2. В листе “Приказ о приёме” добавить пункт “Доплата за вредность” из начислений сотрудника.
3. Загрузить печатную форму обратно. (48)
Это всё
51 — 21.12.20 — 16:36
(41) Жирный троль)
52 — 21.12.20 — 16:36
(50) см. ответ (46) (47) И будет тебе счастье
53 — 21.12.20 — 16:37
(51) может так ковид действует на организм?
54 — 21.12.20 — 16:38
Просто пипец, мне так стыдно, я и сложнее задачи решал , а тут такая фигня и я ничего не понимаю, я целый день сижу и пытаюсь сделать.
55 — 21.12.20 — 16:39
я от компа не отходил ни на секунду с 8 часов утра ( У меня уже 20:38)
56 — 21.12.20 — 16:39
(54) В (42, 49) пробовал?
57 — 21.12.20 — 16:39
(55) Ну так Новосибирск. +4 часа.
58 — 21.12.20 — 16:39
(53) да он еще малявочка, вот пару десятков тем создаст на мисте, научится вопрос формулировать. Потом еще пару сотен вопросов и можно ЕРП внедрять единолично
59 — 21.12.20 — 16:43
(55) Задача сформулирована какая-то суть только в 16:23 в посте (55). Полноценно в 16:35 в посте (50). Чего весь день сидел — не понятно.
Постановка задачи — это 80% её решения. Как-то так обычно было.
Так попробовал 42 и 49?
60 — 21.12.20 — 16:43
61 — 21.12.20 — 16:44
Читать:
Задача сформулирована какая-то суть только в 16:23 в посте (38). ТРИДЦАТЬ ВОСЕМЬ
62 — 21.12.20 — 16:45
(44) грамотно удержался на взятке, ВыборкаВредность.Показатель1 нельзя так обращаться если выборка не получила Следующий()
63 — 21.12.20 — 16:46
(59) нет, сейчас делать буду.
64 — 21.12.20 — 16:47
Просто ,мне кажется, человек завтра мне скажет :» Дак ты опять не сделал, у тебя всё равно ОшибкаЧтения, иди дальше делать»
65 — 21.12.20 — 16:47
(60) Не знаю почему, но продолжаю пользоваться обычной консолью в толстом клиенте. На мой взгляд они почти все удобнее на порядок. Пользуюсь версией десятилетней давности или более.
(63) Ждем. Там не надо тогда условий никаких в обработке результата. Результат запрос возвращает всегда.
66 — 21.12.20 — 16:48
(64) — (46)(47)
67 — 21.12.20 — 16:49
(59) Спасибо, учту формулировку вопроса, в следующий раз будет лучше!
68 — 21.12.20 — 16:50
(66) Буду знать
69 — 21.12.20 — 16:55
(52) Как я и говорил, мне сказали : У тебя всё равно осталась ошибка.
Задание: Устранить ошибку и сделать так, чтобы не лёг чужой код и свой код.
70 — 21.12.20 — 16:56
Я уже не знаю, что делать, сейчас мозг лопнет :DD
71 — 21.12.20 — 16:56
(70) скинь код в котором у тебя ошибка
72 — 21.12.20 — 16:58
(70) Пробуй (49) и не будет ошибки.
73 — 21.12.20 — 16:59
(72) там пипец сложно, я параллельно разбираю этот код, но я не могу полностью его переписать)
74 — 21.12.20 — 17:00
(71) ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
«ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
|ГДЕ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
| И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;
ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);
ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
Если ВыборкаВредность.Следующий() Тогда
йцу= ВыборкаВредность.Показатель1;
иначе
йцу = «0»;
КонецЕсли;
75 — 21.12.20 — 17:00
ну если правильно понял, то процедура печати уже есть, где есть и запрос и выборка и заполнение областей в цикле и вывод в табдок, если это так, то делать все это свое еще раз не надо, так и не получится. Надо: в том месте модуля, где написан запрос и последующая его обработка с выводом в Табличный документ в сам запрос добавить к Выбрать еще одну колонку «Выбрать ТабличнаяЧасть.Сотрудник, ТабличнаяЧасть.Показатель», сотрудник (например, отсюда тот запрос не видно) уже там есть, а добавляем именно размер доплаты — Показатель, после точки ТабличнаяЧасть. имя как этот реквизит называется в метаданных, ну конструктор запроса ошибиться не даст. Все остальное в запросе и параметрах запроса оставляем как есть. Дальше в коде обработки результата запроса и вывода Областей макета (в котором надеюсь » В листе “Приказ о приёме” добавить пункт “Доплата за вредность”» это уже сделано) в ТабличныйДокумент добавляем перед ТабДок.Вывести(Область) новой строкой кода
Область.Параметры.Показатель = Выборка.Показатель;
Вроде больше ничего не надо
76 — 21.12.20 — 17:02
не надо переписывать, надо просто добавить в макет новую колонку, рядом с теми что уже есть и заполнить ее значение кодом наряду с теми колонками, которые уже заполняются.
Ну это конечно если я правильно предполагаю, то что у тебя происходит.
77 — 21.12.20 — 17:02
(70) Ты прикалываешься чтоль? Какая еще ошибка, если у тебя запрос пустой, то ты в макете заполнишь 0. Вангую, ты в пустом запросе смотришь в отладке выборку и недоумеваешь, как так ашипка напротив данных! В этом варианте (46) код нормально отработает. Не надо обрабатывать данные выборки, если она пустая.
78 — 21.12.20 — 17:03
а смотрю я в (50)
79 — 21.12.20 — 17:04
(77) не понятно зачем тут писать свое что то, если печатная форма уже есть и работает, надо только добавить одну колонку
80 — 21.12.20 — 17:08
81 — 21.12.20 — 17:09
Я не знаю уже, как это комментировать
82 — 21.12.20 — 17:11
(77) Если тебе кровь из носа нужно, чтобы выборка всегда была заполнена, можешь следующим образом написать:
ВЫБРАТЬ
СУММА(ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1) КАК Показатель1,
ЗаказКлиентаТовары.Ссылка КАК Ссылка
ПОМЕСТИТЬ ДоплатыЗаВредность
ИЗ
Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
ГДЕ
ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета = &ВидРасчетаВредность
СГРУППИРОВАТЬ ПО
ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ПриемНаРаботуВОрганизацию.Ссылка КАК Ссылка,
ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество
ИЗ
Документ.ПриемНаРаботуВОрганизацию КАК ПриемНаРаботуВОрганизацию
ЛЕВОЕ СОЕДИНЕНИЕ ДоплатыЗаВредность КАК ДоплатыЗаВредность
ПО ПриемНаРаботуВОрганизацию.Ссылка = ДоплатыЗаВредность.Ссылка
ГДЕ
ПриемНаРаботуВОрганизацию.Ссылка = &ДокументСсылка
83 — 21.12.20 — 17:12
(82) //ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество ЕСТЬNULL(ДоплатыЗаВредность.Показатель1, 0) КАК Показатель1
84 — 21.12.20 — 17:13
(83) поясню, а то вдруг не понял строчку ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество в запросе замени на
Количество ЕСТЬNULL(ДоплатыЗаВредность.Показатель1, 0) КАК Показатель1
85 — 21.12.20 — 17:15
(82) А это адекватно вообще? Просто я по факту, в самом начале написал что-то похожее на тот код, который ты написал и который работает нормально, а они до меня так докапываются.
86 — 21.12.20 — 17:16
(84) даже сейчас, говорят что не правильно и нужно исправить как-то.
87 — 21.12.20 — 17:16
(86) Какой код ты не должен поломать то?
88 — 21.12.20 — 17:17
(85) залезть в голову твоим работодателям я не могу, задай наводящие вопросы, как им нужно и какой результат они ждут
89 — 21.12.20 — 17:17
(82) смысл в том, что они говорят :» Запрос не трогай, он правильный. Сделай выборку верно». :DDD
90 — 21.12.20 — 17:18
(49) Пробовать будешь или нет?
91 — 21.12.20 — 17:18
(86) по уму посмотри как типовые печатные формы работают, как там получают шапку и данные для печати. Постарайся полученный опыт перенести в свою обработку
92 — 21.12.20 — 17:18
(87) НУ, в обработке есть ещё печсатные формы, которые не я делал, тот код поломать и не должен
93 — 21.12.20 — 17:19
(89) Значит в выборке вредность уже есть. Раз так говорят.
94 — 21.12.20 — 17:20
(90) 5 минут
95 — 21.12.20 — 17:22
(90) съехало просто не много , не могу полностью разобраться
96 — 21.12.20 — 17:23
(92) ну не трогай запрос тогда, делай как я тебе написал еще раньше с условием в выборке. Ошибка данных у тебя только в отладке, на самом деле ошибки ни какой не будет при выполнении обработки, так как ты не обрабатываешь данные пустого запроса, а всего лишь выводишь 0, если выборка пустая в ПФ.
97 — 21.12.20 — 17:29
(96) Хорошо , спасибо
sqr4
98 — 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].Выражение = Новый ВыражениеСхемыЗапроса("Номенклатура = &Товар"); КонецЕсли; Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
- Последний способ очень громоздкий, но его тоже можно использовать:
Если Товар.Пустая() Тогда Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , ) КАК ПродажиОбороты" Иначе Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , Номенклатура = &Товар) КАК ПродажиОбороты"; КонецЕсли;
Как видите, в запросе изменилось только значение условия виртуальной таблицы.
ПОДПИСКА
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ОстаткиТоваров.Записывать = Истина;
Движения.Продажи.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток,
| ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
| СУММА(ЕСТЬNULL(ОстаткиТоваровОстатки.СуммаОстаток, 0)) КАК СуммаОстаток,
| СУММА(ЕСТЬNULL(РасходРасходТЧ.Количество, 0)) КАК Количество
|ИЗ
| Документ.Расход.РасходТЧ КАК РасходРасходТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
| ПО ОстаткиТоваровОстатки.Номенклатура = РасходРасходТЧ.Номенклатура
|
|СГРУППИРОВАТЬ ПО
| ОстаткиТоваровОстатки.Номенклатура";
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
Движения.ОстаткиТоваров.Записывать = Ложь;
Движения.Продажи.Записывать = Ложь;
Сообщить("Недостаточно товара на складе!");
КонецЕсли;
СуммаСебестоимость = 0;
СуммаСебестоимость = Выборка.СуммаОстаток / Выборка.КоличествоОстаток * Выборка.Количество;
Для Каждого ТекСтрокаРасходТЧ Из РасходТЧ Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаРасходТЧ.Номенклатура;
Движение.Количество = Выборка.Количество;
Движение.Сумма = СуммаСебестоимость;
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаРасходТЧ.Номенклатура;
Движение.Количество = Выборка.Количество;
Движение.Сумма = Выборка.Сумма;
КонецЦикла;
КонецПроцедуры
Почему в отладчике выдается «Ошибка чтения значений»? Гуглил так и не нагуглил, не понимаю в чем ошибка. Буду рад помощи, спасибо заранее
-
Вопрос заданболее двух лет назад
-
632 просмотра
Пригласить эксперта
Выборка получена, но её обход (пока выборка.следующий() и т.п.) не осуществляется. Вообще в текущем варианте в выборке несколько строк, включая возможные null по номенклатуре. Я бы выкинул этот код и начал бы со словестного описания желаемого алгоритма.
Ну алгоритм не корректен.
Как понял цель найти остатки, если их хватает создать запись.
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
Движения.ОстаткиТоваров.Записывать = Ложь;
Движения.Продажи.Записывать = Ложь;
Сообщить("Недостаточно товара на складе!");
КонецЕсли;
Без перебора результата выборки из запроса.
И далее также идет перебор только строк табличной части документа, а не выборки данных по остаткам.
Для Каждого ТекСтрокаРасходТЧ Из РасходТЧ Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Подглядите туточки
-
Показать ещё
Загружается…
04 июн. 2023, в 20:31
10000 руб./за проект
04 июн. 2023, в 18:48
300 руб./за проект
04 июн. 2023, в 16:44
30000 руб./за проект
Минуточку внимания
Ошибка чтения значения в Выборке |
Я |
undertale
21.12.20 — 09:50
Ошибка чтения значения в Выборке:
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
Метод с «Выбрать» на «Выгрузить» не могу поменять, нужно сделать через именно через «Выбрать()»
ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
«ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
|ГДЕ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
| И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;
ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);
ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
ВыборкаВредность.Следующий();
undertale
1 — 21.12.20 — 09:50
Я только начинаю, не судите строго
lEvGl
2 — 21.12.20 — 09:52
и чего дальше?
ДенисЧ
3 — 21.12.20 — 09:54
Для начала будем судить за формулировку вопроса )))
Где ошибка? Когда возникает?
undertale
4 — 21.12.20 — 09:57
(3) Ошибка чтения значения в Выборке:
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
lEvGl
5 — 21.12.20 — 10:02
(4) что это значит? какого значения, что возвращает .следующий()?
ДенисЧ
6 — 21.12.20 — 10:03
(4) То есть. Ты делаешь ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
Потом смотришь в ВыборкаВредность
И правильно она тебе говорит. Выборку перебирать кто будет? Сам Абд аль-Маджи́д ат-Тикри́ти ?
undertale
7 — 21.12.20 — 10:04
(6) хДДД
lEvGl
8 — 21.12.20 — 10:05
вангануть что ли
если написать
Пока ВыборкаВредность.Следующий() Цикл
Сообщить(ВыборкаВредность.ВидРасчета);
КонецЦикла;
что будет?
а еще лучше подключить тяжелую артиллерию - отладчик
Kassern
9 — 21.12.20 — 10:06
(6) Так он и перебирает…Но только берет первый элемент из выборки:
ВыборкаВредность.Следующий();
Но вот незадача, если результат запроса пустой, то на этой строчке будет ошибка.
undertale
10 — 21.12.20 — 10:10
(8) Ничего не выдаёт, вычисляю выражение «Ошибка чтения значения»
undertale
11 — 21.12.20 — 10:12
(8) а «ВидРасчета» — переменная не определена
undertale
12 — 21.12.20 — 10:14
(6) Проблема в том, что у меня не получается :С
Kassern
13 — 21.12.20 — 10:16
(12) Посмотри типы значений в отборах запроса. Какой тип значения у выражения ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение?
undertale
14 — 21.12.20 — 10:23
(13) https://ibb.co/Lzz8mRK
Если я правильно тебя понял
lEvGl
15 — 21.12.20 — 10:25
(10) значит в результате запроса ничего нет, либо параметры запроса направильные, либо в ТЧ документа ДокументПриема.Ссылка нет строк с таким видом Доплат
undertale
16 — 21.12.20 — 10:35
(15) В общем, ложилась такая ситуация: Когда у человека проставлена «ДоплатаЗаВредность» , то у него всё гучи и всё нормально работает, а когда у него нету этой доплаты, то ошибка эта вылазит. Нужно как-то сделать так, чтобы эта ошибка исправилась , чтобы если у него нет «ДоплатыЗаВредность», то и код прекращал работать
undertale
17 — 21.12.20 — 10:36
Это реально как-то сделать?
lEvGl
18 — 21.12.20 — 10:38
(16) для этого и есть Выборка.Следующий()
DrShad
19 — 21.12.20 — 10:38
Если …
Kassern
20 — 21.12.20 — 10:39
Убери ты ссылку в условии | И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность";
Сделай | И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета= &ВидРасчетаВредность»;
lEvGl
21 — 21.12.20 — 10:42
Стандартная конструкция Пока Выборка.Следующий() Цикл если запрос ничего не вернет, то и в цикл программа не попадет я делаю так Результат = Запрос.Выполнить(); Если Не Результат.Пустой() Тогда Для Каждого Строка Из Результат.Выгрузить() Цикл тра та та КонецЦикла; КонецЕсли; возможны варианты, по ситуации
Kassern
22 — 21.12.20 — 10:50
(17) Ошибка чтения значения говорит о том что у тебя выборка пустая. Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка. Если подразумевается всегда 1 элемент из запроса(либо он есть, либо запрос пустой), тогда можешь писать «Если Выборка.Следующий() Тогда» и обрабатывать первый элемент выборки, иначе выборка пустая. Если нужно обойти все элементы выборка то используй «Пока выборка.Следующий Цикл» Если нужно отработать условие при пустой выборке, можешь предварительно проверить Если Выборка.Количество()=0, А лучше результат на пустоту проверяй.
Йохохо
23 — 21.12.20 — 10:51
(22) «Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка.» а при Выборка.Следующий() возникает Ложь
hhhh
24 — 21.12.20 — 11:29
самый простой вариант это Таб = Запрос.Выполнить().Выгрузить(); Для Каждого Стр Из Таб Цикл КонецЦикла;
1с не рекомендует так делать, но это самое удобное.
undertale
25 — 21.12.20 — 11:38
(24) но у меня же метод «Выбрать» ,А не «Выгрузить
undertale
26 — 21.12.20 — 11:39
(24) Так же работать будет ?
lEvGl
27 — 21.12.20 — 11:46
(26) смысл такой же, да
undertale
28 — 21.12.20 — 12:05
Эх, ничего не получается что-то у меня, столько помощи было от Вас, но что-то я ,видимо, совсем тупой :С
undertale
29 — 21.12.20 — 12:11
не знаю, что теперь и делать
Kassern
30 — 21.12.20 — 12:22
(29) самый простой вариант, заплатить денюшку тому, кто сможет объяснить и показать. Либо читай умные книжки по 1с, как правильно писать запросы и их обходить.
lEvGl
31 — 21.12.20 — 12:30
(29) так гучи же >>>у него всё гучи и всё нормально работает в чем проблема то >>>чтобы если у него нет "ДоплатыЗаВредность", то и код прекращал работать код и перестает работать, если Выборка.Следующий() Ложь Пока Выборка.Следующий() Цикл//тут неявная проверка на возврат Истина почитай как это работает, даже в синтакс-помощнике. а истина будет, пока есть записи в результате запроса, то есть когда их нет(или закончатся), тогда и >>>и код прекращал работать
hhhh
32 — 21.12.20 — 12:55
(29) что не получается?
Если ВыборкаВредность.Следующий() Тогда уже пробовал?
undertale
33 — 21.12.20 — 14:53
(32) я читал о том, как это делать, но всё равно не могу понять, как обходить результат запроса. Я читал о методе «Следующий()», да и делал до этого что-то простое , а сейчас на попу присел и ничего не получается.
Можешь хоть как-то помочь?
ДенисЧ
34 — 21.12.20 — 15:03
ЗапросВредность = Новый Запрос;
ЗапросВредность.Текст =
"ВЫБРАТЬ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
|ИЗ
| Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
|ГДЕ
| ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
| И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность";
ЗапросВредность.УстановитьПараметр("ДокументСсылка", ДокументПриема.Ссылка);
ЗапросВредность.УстановитьПараметр("ВидРасчетаВредность",ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
пока ВыборкаВредность.Следующий() Цикл
сообщить("" + ВыборкаВредность.ВидРасчета + " " + ВыборкаВредность.Показатель1);
КонецЦикла;
Что выведет?
lEvGl
35 — 21.12.20 — 15:42
(34)было уже
>>>можешь хоть как то помочь?
можешь?
undertale
36 — 21.12.20 — 16:03
(34) Ничего не выводит, в выборке Ошибка чтения
ДенисЧ
37 — 21.12.20 — 16:08
(36) Ничего не выводит — значит результат запроса пустой.
Проверь ещё
результат = ЗапросВредность.Выполнить();
сообщить("ЗАпрос пустой " + результат.Пустой());
ВыборкаВредность = результат.Выбрать();
Сообщить("В выборке " + ВыборкаВредность.Количество() + " элементов");
undertale
38 — 21.12.20 — 16:23
(37) Я уже писал выше:
Когда у человека заполнена «ДоплатаЗаВредность», то всё нормально выводиться, всё гучи. В данный момент, я выбираю сотрудника, у которого нет «ДоплатаЗаВредность».
Вообще, я это задание связано с выводом табличной части. Я создал внешнюю обработку, заполнил все параметры, остался только этот, который я не могу адекватно вывести.
Мне нужно » Если у человека есть ДоплатаЗаВредность, то выводиться число , которое нужно, а если нет( Как в нашем случае) , то нужно выводить «0».
Человеку не понравилось как я сделал задание и он сказал переделывать. Сказал, чтобы не было там ОшибкиЧтенияЗначения,я не знаю как её оттуда убрать, и идиоту понятно, если у человека нет «ДоплатаЗаВредность», то и ошибка будет.
lEvGl
39 — 21.12.20 — 16:25
троль что ли
undertale
40 — 21.12.20 — 16:26
(37) Я рассказал всю подноготную сейчас. В данный момент я проверяю челвоека, у которого нет «ДоплатаЗаВредность».
т.е. Запрос пустой и в выборке 0 элементов.
undertale
41 — 21.12.20 — 16:26
(39) Да не троль я , меня ебут ( извиняюсь за мат ), а я ничего не понимаю уже
Said_We
42 — 21.12.20 — 16:28
(38) «то нужно выводить «0»» — это уже другой запрос должен быть.
Йохохо
43 — 21.12.20 — 16:28
(41) инициализируй новую строку нулем сразу, и только если есть результат пиши в показатель данные выборки, а если нет не пиши, так можно
undertale
44 — 21.12.20 — 16:30
Я не понимаю, что я делаю не так. Я написал в самом начале :
Если ЗначениеЗаполнено(ВыборкаВредность.Показатель1) = истина тогда ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1; Иначе ОбластьМакетаРаботник1.Параметры.Вредность = "0"; КонецЕсли;
undertale
45 — 21.12.20 — 16:32
Человеку не понравилось, сказал, чтобы я переделал, я понял, что нужно сделать выборку, я пытался разными способами сделать её, но у меня не получался ни один способ, решил обратиться на форум, чтобы помогли
Kassern
46 — 21.12.20 — 16:32
(44) Если ВыборкаВредность.Следующий Тогда ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1; Иначе ОбластьМакетаРаботник1.Параметры.Вредность = "0"; КонецЕсли;
Kassern
47 — 21.12.20 — 16:33
(46) *Если ВыборкаВредность.Следующий() Тогда
lEvGl
48 — 21.12.20 — 16:33
ну хз, все же объяснили. Первоначальная формулировка задачи от «человека» есть?
Said_We
49 — 21.12.20 — 16:35
К (42) Как-то так например:
ВЫБРАТЬ
ВложенныйЗапрос.ВидРасчета как ВидРасчета ,Сумма(ВложенныйЗапрос.Показатель1) как Показатель1 ИЗ (ВЫБРАТЬ &ВидРасчетаВредность как ВидРасчета ,0 как Показатель1 объединить все ВЫБРАТЬ ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
ИЗ
Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
ГДЕ
ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета = &ВидРасчетаВредность
) КАК ВложенныйЗапрос
Сгруппировать по
ВложенныйЗапрос.ВидРасчета
undertale
50 — 21.12.20 — 16:35
1. Сохранить внешнюю печатную форму “Документы на трудоустройство (Единый)”.
2. В листе “Приказ о приёме” добавить пункт “Доплата за вредность” из начислений сотрудника.
3. Загрузить печатную форму обратно. (48)
Это всё
sqr4
51 — 21.12.20 — 16:36
(41) Жирный троль)
Kassern
52 — 21.12.20 — 16:36
(50) см. ответ (46) (47) И будет тебе счастье
Kassern
53 — 21.12.20 — 16:37
(51) может так ковид действует на организм?
undertale
54 — 21.12.20 — 16:38
Просто пипец, мне так стыдно, я и сложнее задачи решал , а тут такая фигня и я ничего не понимаю, я целый день сижу и пытаюсь сделать.
undertale
55 — 21.12.20 — 16:39
я от компа не отходил ни на секунду с 8 часов утра ( У меня уже 20:38)
Said_We
56 — 21.12.20 — 16:39
(54) В (42, 49) пробовал?
Said_We
57 — 21.12.20 — 16:39
(55) Ну так Новосибирск. +4 часа.
sqr4
58 — 21.12.20 — 16:39
(53) да он еще малявочка, вот пару десятков тем создаст на мисте, научится вопрос формулировать. Потом еще пару сотен вопросов и можно ЕРП внедрять единолично
Said_We
59 — 21.12.20 — 16:43
(55) Задача сформулирована какая-то суть только в 16:23 в посте (55). Полноценно в 16:35 в посте (50). Чего весь день сидел — не понятно.
Постановка задачи — это 80% её решения. Как-то так обычно было.
Так попробовал 42 и 49?
sqr4
60 — 21.12.20 — 16:43
Said_We
61 — 21.12.20 — 16:44
Читать:
Задача сформулирована какая-то суть только в 16:23 в посте (38). ТРИДЦАТЬ ВОСЕМЬ
Йохохо
62 — 21.12.20 — 16:45
(44) грамотно удержался на взятке, ВыборкаВредность.Показатель1 нельзя так обращаться если выборка не получила Следующий()
undertale
63 — 21.12.20 — 16:46
(59) нет, сейчас делать буду.
undertale
64 — 21.12.20 — 16:47
Просто ,мне кажется, человек завтра мне скажет :» Дак ты опять не сделал, у тебя всё равно ОшибкаЧтения, иди дальше делать»
Said_We
65 — 21.12.20 — 16:47
(60) Не знаю почему, но продолжаю пользоваться обычной консолью в толстом клиенте. На мой взгляд они почти все удобнее на порядок. Пользуюсь версией десятилетней давности или более.
(63) Ждем. Там не надо тогда условий никаких в обработке результата. Результат запрос возвращает всегда.
Йохохо
66 — 21.12.20 — 16:48
(64) — (46)(47)
undertale
67 — 21.12.20 — 16:49
(59) Спасибо, учту формулировку вопроса, в следующий раз будет лучше!
undertale
68 — 21.12.20 — 16:50
(66) Буду знать
undertale
69 — 21.12.20 — 16:55
(52) Как я и говорил, мне сказали : У тебя всё равно осталась ошибка.
Задание: Устранить ошибку и сделать так, чтобы не лёг чужой код и свой код.
undertale
70 — 21.12.20 — 16:56
Я уже не знаю, что делать, сейчас мозг лопнет :DD
yakutyan_
71 — 21.12.20 — 16:56
(70) скинь код в котором у тебя ошибка
Said_We
72 — 21.12.20 — 16:58
(70) Пробуй (49) и не будет ошибки.
undertale
73 — 21.12.20 — 16:59
(72) там пипец сложно, я параллельно разбираю этот код, но я не могу полностью его переписать)
undertale
74 — 21.12.20 — 17:00
(71) ЗапросВредность = Новый Запрос; ЗапросВредность.Текст = "ВЫБРАТЬ | ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета, | ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1 |ИЗ | Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления |ГДЕ | ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка | И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность"; ЗапросВредность.УстановитьПараметр("ДокументСсылка", ДокументПриема.Ссылка); ЗапросВредность.УстановитьПараметр("ВидРасчетаВредность",ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение); ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать(); Если ВыборкаВредность.Следующий() Тогда йцу= ВыборкаВредность.Показатель1; иначе йцу = "0"; КонецЕсли;
lEvGl
75 — 21.12.20 — 17:00
ну если правильно понял, то процедура печати уже есть, где есть и запрос и выборка и заполнение областей в цикле и вывод в табдок, если это так, то делать все это свое еще раз не надо, так и не получится. Надо: в том месте модуля, где написан запрос и последующая его обработка с выводом в Табличный документ в сам запрос добавить к Выбрать еще одну колонку «Выбрать ТабличнаяЧасть.Сотрудник, ТабличнаяЧасть.Показатель», сотрудник (например, отсюда тот запрос не видно) уже там есть, а добавляем именно размер доплаты — Показатель, после точки ТабличнаяЧасть. имя как этот реквизит называется в метаданных, ну конструктор запроса ошибиться не даст. Все остальное в запросе и параметрах запроса оставляем как есть. Дальше в коде обработки результата запроса и вывода Областей макета (в котором надеюсь » В листе “Приказ о приёме” добавить пункт “Доплата за вредность”» это уже сделано) в ТабличныйДокумент добавляем перед ТабДок.Вывести(Область) новой строкой кода
Область.Параметры.Показатель = Выборка.Показатель;
Вроде больше ничего не надо
lEvGl
76 — 21.12.20 — 17:02
не надо переписывать, надо просто добавить в макет новую колонку, рядом с теми что уже есть и заполнить ее значение кодом наряду с теми колонками, которые уже заполняются.
Ну это конечно если я правильно предполагаю, то что у тебя происходит.
Kassern
77 — 21.12.20 — 17:02
(70) Ты прикалываешься чтоль? Какая еще ошибка, если у тебя запрос пустой, то ты в макете заполнишь 0. Вангую, ты в пустом запросе смотришь в отладке выборку и недоумеваешь, как так ашипка напротив данных! В этом варианте (46) код нормально отработает. Не надо обрабатывать данные выборки, если она пустая.
lEvGl
78 — 21.12.20 — 17:03
а смотрю я в (50)
lEvGl
79 — 21.12.20 — 17:04
(77) не понятно зачем тут писать свое что то, если печатная форма уже есть и работает, надо только добавить одну колонку
undertale
80 — 21.12.20 — 17:08
undertale
81 — 21.12.20 — 17:09
Я не знаю уже, как это комментировать
Kassern
82 — 21.12.20 — 17:11
(77) Если тебе кровь из носа нужно, чтобы выборка всегда была заполнена, можешь следующим образом написать:
ВЫБРАТЬ СУММА(ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1) КАК Показатель1, ЗаказКлиентаТовары.Ссылка КАК Ссылка ПОМЕСТИТЬ ДоплатыЗаВредность ИЗ Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления ГДЕ ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета = &ВидРасчетаВредность СГРУППИРОВАТЬ ПО ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПриемНаРаботуВОрганизацию.Ссылка КАК Ссылка, ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество ИЗ Документ.ПриемНаРаботуВОрганизацию КАК ПриемНаРаботуВОрганизацию ЛЕВОЕ СОЕДИНЕНИЕ ДоплатыЗаВредность КАК ДоплатыЗаВредность ПО ПриемНаРаботуВОрганизацию.Ссылка = ДоплатыЗаВредность.Ссылка ГДЕ ПриемНаРаботуВОрганизацию.Ссылка = &ДокументСсылка
Kassern
83 — 21.12.20 — 17:12
(82) //ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество ЕСТЬNULL(ДоплатыЗаВредность.Показатель1, 0) КАК Показатель1
Kassern
84 — 21.12.20 — 17:13
(83) поясню, а то вдруг не понял строчку ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество в запросе замени на Количество ЕСТЬNULL(ДоплатыЗаВредность.Показатель1, 0) КАК Показатель1
undertale
85 — 21.12.20 — 17:15
(82) А это адекватно вообще? Просто я по факту, в самом начале написал что-то похожее на тот код, который ты написал и который работает нормально, а они до меня так докапываются.
undertale
86 — 21.12.20 — 17:16
(84) даже сейчас, говорят что не правильно и нужно исправить как-то.
sqr4
87 — 21.12.20 — 17:16
(86) Какой код ты не должен поломать то?
Kassern
88 — 21.12.20 — 17:17
(85) залезть в голову твоим работодателям я не могу, задай наводящие вопросы, как им нужно и какой результат они ждут
undertale
89 — 21.12.20 — 17:17
(82) смысл в том, что они говорят :» Запрос не трогай, он правильный. Сделай выборку верно». :DDD
Said_We
90 — 21.12.20 — 17:18
(49) Пробовать будешь или нет?
Kassern
91 — 21.12.20 — 17:18
(86) по уму посмотри как типовые печатные формы работают, как там получают шапку и данные для печати. Постарайся полученный опыт перенести в свою обработку
undertale
92 — 21.12.20 — 17:18
(87) НУ, в обработке есть ещё печсатные формы, которые не я делал, тот код поломать и не должен
Said_We
93 — 21.12.20 — 17:19
(89) Значит в выборке вредность уже есть. Раз так говорят.
undertale
94 — 21.12.20 — 17:20
(90) 5 минут
undertale
95 — 21.12.20 — 17:22
(90) съехало просто не много , не могу полностью разобраться
Kassern
96 — 21.12.20 — 17:23
(92) ну не трогай запрос тогда, делай как я тебе написал еще раньше с условием в выборке. Ошибка данных у тебя только в отладке, на самом деле ошибки ни какой не будет при выполнении обработки, так как ты не обрабатываешь данные пустого запроса, а всего лишь выводишь 0, если выборка пустая в ПФ.
undertale
97 — 21.12.20 — 17:29
(96) Хорошо , спасибо
sqr4
98 — 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].Выражение = Новый ВыражениеСхемыЗапроса("Номенклатура = &Товар"); КонецЕсли; Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
- Последний способ очень громоздкий, но его тоже можно использовать:
Если Товар.Пустая() Тогда Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , ) КАК ПродажиОбороты" Иначе Запрос.Текст = "ВЫБРАТЬ | ПродажиОбороты.Номенклатура, | ПродажиОбороты.СуммаОборот КАК Сумма |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, | &ДатаОкончания, , Номенклатура = &Товар) КАК ПродажиОбороты"; КонецЕсли;
Как видите, в запросе изменилось только значение условия виртуальной таблицы.
ПОДПИСКА
-
Добрый день, пишу обработку для выгрузки результата запроса в Xml, но ни чего в xml кроме шапки не записывается , прошел отладчиком , в результате он пишет ошибка чтения значений, в чем может быть ошибка ?
Вот код:
Запрос = Новый Запрос;
запрос.Текст =»ВЫБРАТЬ
|ХозрасчетныйОстатки.Субконто1,
|ХозрасчетныйОстатки.СуммаОстаток,
|ХозрасчетныйОстатки.КоличествоОстаток,
|ХозрасчетныйОстатки.Субконто2
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&датаОстатков, , , ) КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.Счет = &счет
| И ХозрасчетныйОстатки.Субконто2 = &Склад» ;
Запрос.УстановитьПараметр(«ДатаОстатков»,ЭтаФорма.ДатаОстатков);
Запрос.УстановитьПараметр(«Счет»,ЭтаФорма.Счет);
Запрос.УстановитьПараметр(«Склад»,ЭтаФорма.СкладВыбор);
данные = Запрос.Выполнить();
Результат = Данные.выбрать();
xml = новый записьxml();
xml.ОткрытьФайл(«C:UsersАдминистраторDesktop10счет.xml»,»utf-8″);
xml.ЗаписатьОбъявлениеXML();
XML.ЗаписатьНачалоЭлемента(«Заголовок»);
XML.ЗаписатьАтрибут(«ДатаФормирования»,Формат(ТекущаяДата(),»Д=ДФЛ»));
XML.ЗаписатьАтрибут(«Наименование», «Материалы»);
Пока результат.Следующий() Циклxml.ЗаписатьНачалоЭлемента(«номенклатура»);
xml.ЗаписатьАтрибут(«Номенклатура»,результат.Субконто1);
xml.ЗаписатьКонецЭлемента();КонецЦикла;
XML.ЗаписатьКонецЭлемента();
Xml.Закрыть(); -
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков); Запрос.УстановитьПараметр("Счет", Счет); Запрос.УстановитьПараметр("Склад", СкладВыбор);
-
параметры запроса он получает…, но не отрабатывает запрос, что делать , куда копать!!
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
С чего вы взяли что не отрабатывает ?
-
Смотрю через «»Вычислить выражение» РЕЗУЛЬТАТ , он пишет : ошибка чтения значений
— Объединение сообщений, 8 июл 2015 —
Может и отрабатывает, но в xml ни чего не догружает кроме шапки
-
Offline
alexburn
Модераторы
Команда форума
Модератор- Регистрация:
- 5 янв 2009
- Сообщения:
- 15.150
- Симпатии:
- 560
- Баллы:
- 204
Отладчиком смотрите, либо в консоли запросов проверяйте ваш запрос.
-
запрос в корнсоле отрабатывает так как надо , но при попытке посмотреть отладчиком , нахожу что значение результата ошибка чтения значений
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
Потому что значение нужно смотреть после Результат.Следующий()
-
Смотрю значение «Результат.Субконто1» тоже пустота . Как мне тогда результат запроса записать в xml//
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
Тип значения какой у «пустоты»?
-
значение пустота , тип неопределенно
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
у всех элементов из выборки?
-
да , посмотрел в цикле, все идет пустотой, нет пойму уже из за чего
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
Значит не определены значения Субконто1 на выбранном счете для всех проводок, попадающих под условия отбора в запросе.
-
Проверяю через консоль , все заполненно все отображается
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
Скриншотом можете продемонстрировать результат отладки кода?
-
вот скрин , немного переделал код
Вложения:
-
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
А так чтобы было видно исполняемый код и точку останова в нем?
-
вот
— Объединение сообщений, 8 июл 2015 —
.
Вложения:
-
-
Offline
nomad_irk
Гуру в 1С- Регистрация:
- 20 окт 2008
- Сообщения:
- 9.889
- Симпатии:
- 1.029
- Баллы:
- 204
Внимательно читаем пост #8 и еще раз проверяем значение, в данном случае уже у переменной ВЫБОРКА