Ссылка ошибка чтения значения

Ошибка чтения значения в Выборке ☑ 0

undertale

21.12.20

09:50

Ошибка чтения значения в Выборке:  

ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();

Метод с «Выбрать» на «Выгрузить» не могу поменять, нужно сделать через именно через «Выбрать()»

    ЗапросВредность = Новый Запрос;                                  

    ЗапросВредность.Текст =

        «ВЫБРАТЬ

        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,

        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1

        |ИЗ

        |    Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления

        |ГДЕ

        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка

        |    И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;

    
    ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);

    ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);

    ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();

        ВыборкаВредность.Следующий();

1

undertale

21.12.20

09:50

Я только начинаю, не судите строго

2

lEvGl

21.12.20

09:52

и чего дальше?

3

ДенисЧ

21.12.20

09:54

Для начала будем судить за формулировку вопроса )))

Где ошибка? Когда возникает?

4

undertale

21.12.20

09:57

(3) Ошибка чтения значения в Выборке:  

ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();

5

lEvGl

21.12.20

10:02

(4) что это значит? какого значения, что возвращает .следующий()?

6

ДенисЧ

21.12.20

10:03

(4) То есть. Ты делаешь ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();

Потом смотришь в ВыборкаВредность

И правильно она тебе говорит. Выборку перебирать кто будет? Сам Абд аль-Маджи́д ат-Тикри́ти ?

7

undertale

21.12.20

10:04

(6) хДДД

8

lEvGl

21.12.20

10:05

вангануть что ли

если написать

Пока ВыборкаВредность.Следующий() Цикл

Сообщить(ВыборкаВредность.ВидРасчета);

КонецЦикла;

что будет?

а еще лучше подключить тяжелую артиллерию — отладчик

9

Kassern

21.12.20

10:06

(6) Так он и перебирает…Но только берет первый элемент из выборки:

  ВыборкаВредность.Следующий();

Но вот незадача, если результат запроса пустой, то на этой строчке будет ошибка.

10

undertale

21.12.20

10:10

(8) Ничего не выдаёт, вычисляю выражение «Ошибка чтения значения»

11

undertale

21.12.20

10:12

(8) а «ВидРасчета» — переменная не определена

12

undertale

21.12.20

10:14

(6) Проблема в том, что у меня не получается :С

13

Kassern

21.12.20

10:16

(12) Посмотри типы значений в отборах запроса. Какой тип значения у выражения ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение?

14

undertale

21.12.20

10:23

(13) https://ibb.co/Lzz8mRK

Если я правильно тебя понял

15

lEvGl

21.12.20

10:25

(10) значит в результате запроса ничего нет, либо параметры запроса направильные, либо в ТЧ документа ДокументПриема.Ссылка нет строк с таким видом Доплат

16

undertale

21.12.20

10:35

(15) В общем, ложилась такая ситуация: Когда у человека проставлена «ДоплатаЗаВредность» , то у него всё гучи и всё нормально работает, а когда у него нету этой доплаты, то ошибка эта вылазит. Нужно как-то сделать так, чтобы эта ошибка исправилась , чтобы если у него нет «ДоплатыЗаВредность», то и код прекращал работать

17

undertale

21.12.20

10:36

Это реально как-то сделать?

18

lEvGl

21.12.20

10:38

(16) для этого и есть Выборка.Следующий()

19

DrShad

21.12.20

10:38

Если …

20

Kassern

21.12.20

10:39

Убери ты ссылку в условии |    И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;

Сделай |    И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета= &ВидРасчетаВредность»;

21

lEvGl

21.12.20

10:42

Стандартная конструкция

Пока Выборка.Следующий() Цикл

если запрос ничего не вернет, то и в цикл программа не попадет

я делаю так

Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда

Для Каждого Строка Из Результат.Выгрузить() Цикл

тра та та

КонецЦикла;

КонецЕсли;

возможны варианты, по ситуации

22

Kassern

21.12.20

10:50

(17) Ошибка чтения значения говорит о том что у тебя выборка пустая. Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка. Если подразумевается всегда 1 элемент из запроса(либо он есть, либо запрос пустой), тогда можешь писать «Если Выборка.Следующий() Тогда» и обрабатывать первый элемент выборки, иначе выборка пустая. Если нужно обойти все элементы выборка то используй «Пока выборка.Следующий Цикл» Если нужно отработать условие при пустой выборке, можешь предварительно проверить Если Выборка.Количество()=0, А лучше результат на пустоту проверяй.

23

Йохохо

21.12.20

10:51

(22) «Когда ты пишешь Выборка.Следующий в пустой выборке, возникает такая ошибка.» а при Выборка.Следующий() возникает Ложь

24

hhhh

21.12.20

11:29

самый простой вариант это

Таб = Запрос.Выполнить().Выгрузить();

Для Каждого Стр Из Таб Цикл

КонецЦикла;

1с не рекомендует так делать, но это самое удобное.

25

undertale

21.12.20

11:38

(24) но у меня же метод «Выбрать» ,А не «Выгрузить

26

undertale

21.12.20

11:39

(24) Так же работать будет ?

27

lEvGl

21.12.20

11:46

(26) смысл такой же, да

28

undertale

21.12.20

12:05

Эх, ничего не получается что-то у меня, столько помощи было от Вас, но что-то я ,видимо, совсем тупой :С

29

undertale

21.12.20

12:11

не знаю, что теперь и делать

30

Kassern

21.12.20

12:22

(29) самый простой вариант, заплатить денюшку тому, кто сможет объяснить и показать. Либо читай умные книжки по 1с, как правильно писать запросы и их обходить.

31

lEvGl

21.12.20

12:30

(29) так гучи же

>>>у него всё гучи и всё нормально работает

в чем проблема то

>>>чтобы если у него нет «ДоплатыЗаВредность», то и код прекращал работать

код и перестает работать, если Выборка.Следующий() Ложь

Пока Выборка.Следующий() Цикл //тут неявная проверка на возврат Истина

почитай как это работает, даже в синтакс-помощнике. а истина будет, пока есть записи в результате запроса, то есть когда их нет(или закончатся), тогда и

>>>и код прекращал работать

32

hhhh

21.12.20

12:55

(29) что не получается?

Если ВыборкаВредность.Следующий() Тогда

уже пробовал?

33

undertale

21.12.20

14:53

(32) я читал о том, как это делать, но всё равно не могу понять, как обходить результат запроса. Я читал о методе «Следующий()», да и делал до этого что-то простое , а сейчас на попу присел и ничего не получается.

Можешь хоть как-то помочь?

34

ДенисЧ

21.12.20

15:03

ЗапросВредность = Новый Запрос;                                  

    ЗапросВредность.Текст =

        «ВЫБРАТЬ

        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,

        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1

        |ИЗ

        |    Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления

        |ГДЕ

        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка

        |    И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;

    
    ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);

    ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);

    ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();

    пока ВыборкаВредность.Следующий() Цикл

      сообщить(«» + ВыборкаВредность.ВидРасчета + »   » + ВыборкаВредность.Показатель1);

    КонецЦикла;

Что выведет?

35

lEvGl

21.12.20

15:42

(34)было уже

>>>можешь хоть как то помочь?

можешь?

36

undertale

21.12.20

16:03

(34) Ничего не выводит, в выборке Ошибка чтения

37

ДенисЧ

21.12.20

16:08

(36) Ничего не выводит — значит результат запроса пустой.

Проверь ещё

результат = ЗапросВредность.Выполнить();

сообщить(«ЗАпрос пустой » + результат.Пустой());

ВыборкаВредность = результат.Выбрать();

Сообщить(«В выборке » + ВыборкаВредность.Количество() + » элементов»);

38

undertale

21.12.20

16:23

(37) Я уже писал выше:

Когда у человека заполнена «ДоплатаЗаВредность», то всё нормально выводиться, всё гучи. В данный момент, я выбираю сотрудника, у которого нет «ДоплатаЗаВредность».

Вообще, я это задание связано с выводом табличной части. Я создал внешнюю обработку, заполнил все параметры, остался только этот, который я не могу адекватно вывести.

Мне нужно » Если у человека есть ДоплатаЗаВредность, то выводиться число , которое нужно, а если нет( Как в нашем случае) , то нужно выводить «0».

Человеку не понравилось как я сделал задание и он сказал переделывать. Сказал, чтобы не было там ОшибкиЧтенияЗначения,я не знаю как её оттуда убрать, и идиоту понятно, если у человека нет «ДоплатаЗаВредность», то и ошибка будет.

39

lEvGl

21.12.20

16:25

троль что ли

40

undertale

21.12.20

16:26

(37) Я рассказал всю подноготную сейчас. В данный момент я проверяю челвоека, у которого нет «ДоплатаЗаВредность».

т.е. Запрос пустой и в выборке 0 элементов.

41

undertale

21.12.20

16:26

(39) Да не троль я , меня ебут ( извиняюсь за мат ), а я ничего не понимаю уже

42

Said_We

21.12.20

16:28

(38) «то нужно выводить «0»» — это уже другой запрос должен быть.

43

Йохохо

21.12.20

16:28

(41) инициализируй новую строку нулем сразу, и только если есть результат пиши в показатель данные выборки, а если нет не пиши, так можно

44

undertale

21.12.20

16:30

Я не понимаю, что я делаю не так. Я написал в самом начале :

Если ЗначениеЗаполнено(ВыборкаВредность.Показатель1) = истина тогда

     ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1;

Иначе    

     ОбластьМакетаРаботник1.Параметры.Вредность = «0»;

КонецЕсли;

45

undertale

21.12.20

16:32

Человеку не понравилось, сказал, чтобы я переделал, я понял, что нужно сделать выборку, я пытался разными способами сделать её, но у меня не получался ни один способ, решил обратиться на форум, чтобы помогли

46

Kassern

21.12.20

16:32

(44) Если ВыборкаВредность.Следующий Тогда

ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1;

Иначе

ОбластьМакетаРаботник1.Параметры.Вредность = «0»;

КонецЕсли;

47

Kassern

21.12.20

16:33

(46) *Если ВыборкаВредность.Следующий() Тогда

48

lEvGl

21.12.20

16:33

ну хз, все же объяснили. Первоначальная формулировка задачи от «человека» есть?

49

Said_We

21.12.20

16:35

К (42) Как-то так например:

ВЫБРАТЬ

     ВложенныйЗапрос.ВидРасчета как ВидРасчета

     ,Сумма(ВложенныйЗапрос.Показатель1) как Показатель1

ИЗ

(ВЫБРАТЬ

     &ВидРасчетаВредность как ВидРасчета

     ,0 как Показатель1

объединить все

ВЫБРАТЬ

            ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,

            ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1

        ИЗ

            Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления

        ГДЕ

            ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка

            И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета = &ВидРасчетаВредность

) КАК ВложенныйЗапрос

Сгруппировать по

            ВложенныйЗапрос.ВидРасчета

50

undertale

21.12.20

16:35

1.    Сохранить внешнюю печатную форму “Документы на трудоустройство (Единый)”.

2.    В листе “Приказ о приёме” добавить пункт “Доплата за вредность” из начислений сотрудника.

3.    Загрузить печатную форму обратно. (48)

Это всё

51

sqr4

21.12.20

16:36

(41) Жирный троль)

52

Kassern

21.12.20

16:36

(50) см. ответ (46) (47) И будет тебе счастье

53

Kassern

21.12.20

16:37

(51) может так ковид действует на организм?

54

undertale

21.12.20

16:38

Просто пипец, мне так стыдно, я и сложнее задачи решал , а тут такая фигня и я ничего не понимаю, я целый день сижу и пытаюсь сделать.

55

undertale

21.12.20

16:39

я от компа не отходил ни на секунду с 8 часов утра ( У меня уже 20:38)

56

Said_We

21.12.20

16:39

(54) В (42, 49) пробовал?

57

Said_We

21.12.20

16:39

(55) Ну так Новосибирск. +4 часа.

58

sqr4

21.12.20

16:39

(53) да он еще малявочка, вот пару десятков тем создаст на мисте, научится вопрос формулировать. Потом еще пару сотен вопросов и можно ЕРП внедрять единолично

59

Said_We

21.12.20

16:43

(55) Задача сформулирована какая-то суть только в 16:23 в посте (55). Полноценно в 16:35 в посте (50). Чего весь день сидел — не понятно.

Постановка задачи — это 80% её решения. Как-то так обычно было.

Так попробовал 42 и 49?

60

sqr4

21.12.20

16:43

61

Said_We

21.12.20

16:44

Читать:

Задача сформулирована какая-то суть только в 16:23 в посте (38). ТРИДЦАТЬ ВОСЕМЬ :-)

62

Йохохо

21.12.20

16:45

(44) грамотно удержался на взятке, ВыборкаВредность.Показатель1 нельзя так обращаться если выборка не получила Следующий()

63

undertale

21.12.20

16:46

(59) нет, сейчас делать буду.

64

undertale

21.12.20

16:47

Просто ,мне кажется, человек завтра мне скажет :» Дак ты опять не сделал, у тебя всё равно ОшибкаЧтения, иди дальше делать»

65

Said_We

21.12.20

16:47

(60) Не знаю почему, но продолжаю пользоваться обычной консолью в толстом клиенте. На мой взгляд они почти все удобнее на порядок. Пользуюсь версией десятилетней давности или более.

(63) Ждем. Там не надо тогда условий никаких в обработке результата. Результат запрос возвращает всегда.

66

Йохохо

21.12.20

16:48

(64) — (46)(47)

67

undertale

21.12.20

16:49

(59) Спасибо, учту формулировку вопроса, в следующий раз будет лучше!

68

undertale

21.12.20

16:50

(66) Буду знать

69

undertale

21.12.20

16:55

(52) Как я и говорил, мне сказали : У тебя всё равно осталась ошибка.

Задание: Устранить ошибку и сделать так, чтобы не лёг чужой код и свой код.

70

undertale

21.12.20

16:56

Я уже не знаю, что делать, сейчас мозг лопнет :DD

71

yakutyan_

21.12.20

16:56

(70) скинь код в котором у тебя ошибка

72

Said_We

21.12.20

16:58

(70) Пробуй (49) и не будет ошибки.

73

undertale

21.12.20

16:59

(72) там пипец сложно, я параллельно разбираю этот код, но я не могу полностью его переписать)

74

undertale

21.12.20

17:00

(71)     ЗапросВредность = Новый Запрос;                                  

    ЗапросВредность.Текст =

        «ВЫБРАТЬ

        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,

        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1

        |ИЗ

        |    Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления

        |ГДЕ

        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка

        |    И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность»;

    
    ЗапросВредность.УстановитьПараметр(«ДокументСсылка», ДокументПриема.Ссылка);

    ЗапросВредность.УстановитьПараметр(«ВидРасчетаВредность»,ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);

    ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();

    
    Если ВыборкаВредность.Следующий() Тогда

        йцу= ВыборкаВредность.Показатель1;

    иначе

        йцу = «0»;

    КонецЕсли;

75

lEvGl

21.12.20

17:00

ну если правильно понял, то процедура печати уже есть, где есть и запрос и выборка и заполнение областей в цикле и вывод в табдок, если это так, то делать все это свое еще раз не надо, так и не получится. Надо: в том месте модуля, где написан запрос и последующая его обработка с выводом в Табличный документ в сам запрос добавить к Выбрать еще одну колонку «Выбрать ТабличнаяЧасть.Сотрудник, ТабличнаяЧасть.Показатель», сотрудник (например, отсюда тот запрос не видно) уже там есть, а добавляем именно размер доплаты — Показатель, после точки ТабличнаяЧасть. имя как этот реквизит называется в метаданных, ну конструктор запроса ошибиться не даст. Все остальное в запросе и параметрах запроса оставляем как есть. Дальше в коде обработки результата запроса и вывода Областей макета (в котором надеюсь » В листе “Приказ о приёме” добавить пункт “Доплата за вредность”» это уже сделано) в ТабличныйДокумент добавляем перед ТабДок.Вывести(Область) новой строкой кода

Область.Параметры.Показатель = Выборка.Показатель;

Вроде больше ничего не надо

76

lEvGl

21.12.20

17:02

не надо переписывать, надо просто добавить в макет новую колонку, рядом с теми что уже есть и заполнить ее значение кодом наряду с теми колонками, которые уже заполняются.

Ну это конечно если я правильно предполагаю, то что у тебя происходит.

77

Kassern

21.12.20

17:02

(70) Ты прикалываешься чтоль? Какая еще ошибка, если у тебя запрос пустой, то ты в макете заполнишь 0. Вангую, ты в пустом запросе смотришь в отладке выборку и недоумеваешь, как так ашипка напротив данных! В этом варианте (46) код нормально отработает. Не надо обрабатывать данные выборки, если она пустая.

78

lEvGl

21.12.20

17:03

а смотрю я в (50)

79

lEvGl

21.12.20

17:04

(77) не понятно зачем тут писать свое что то, если печатная форма уже есть и работает, надо только добавить одну колонку

80

undertale

21.12.20

17:08

81

undertale

21.12.20

17:09

Я не знаю уже, как это комментировать

82

Kassern

21.12.20

17:11

(77) Если тебе кровь из носа нужно, чтобы выборка всегда была заполнена, можешь следующим образом написать:

ВЫБРАТЬ

    СУММА(ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1) КАК Показатель1,

    ЗаказКлиентаТовары.Ссылка КАК Ссылка

ПОМЕСТИТЬ ДоплатыЗаВредность

ИЗ

    Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления

ГДЕ

    ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка

    И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета = &ВидРасчетаВредность

СГРУППИРОВАТЬ ПО

    ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка

;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ

    ПриемНаРаботуВОрганизацию.Ссылка КАК Ссылка,

    ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество

ИЗ

    Документ.ПриемНаРаботуВОрганизацию КАК ПриемНаРаботуВОрганизацию

        ЛЕВОЕ СОЕДИНЕНИЕ ДоплатыЗаВредность КАК ДоплатыЗаВредность

        ПО ПриемНаРаботуВОрганизацию.Ссылка = ДоплатыЗаВредность.Ссылка

ГДЕ

    ПриемНаРаботуВОрганизацию.Ссылка = &ДокументСсылка

83

Kassern

21.12.20

17:12

(82) //ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество ЕСТЬNULL(ДоплатыЗаВредность.Показатель1, 0) КАК Показатель1

84

Kassern

21.12.20

17:13

(83) поясню, а то вдруг не понял строчку ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество в запросе замени на

Количество ЕСТЬNULL(ДоплатыЗаВредность.Показатель1, 0) КАК Показатель1

85

undertale

21.12.20

17:15

(82) А это адекватно вообще? Просто я по факту, в самом начале написал что-то похожее на тот код, который ты написал и который работает нормально, а они до меня так докапываются.

86

undertale

21.12.20

17:16

(84) даже сейчас, говорят что не правильно и нужно исправить как-то.

87

sqr4

21.12.20

17:16

(86) Какой код ты не должен поломать то?

88

Kassern

21.12.20

17:17

(85) залезть в голову твоим работодателям я не могу, задай наводящие вопросы, как им нужно и какой результат они ждут

89

undertale

21.12.20

17:17

(82) смысл в том, что они говорят :» Запрос не трогай, он правильный. Сделай выборку верно». :DDD

90

Said_We

21.12.20

17:18

(49) Пробовать будешь или нет?

91

Kassern

21.12.20

17:18

(86) по уму посмотри как типовые печатные формы работают, как там получают шапку и данные для печати. Постарайся полученный опыт перенести в свою обработку

92

undertale

21.12.20

17:18

(87) НУ, в обработке есть ещё печсатные формы, которые не я делал, тот код поломать и не должен

93

Said_We

21.12.20

17:19

(89) Значит в выборке вредность уже есть. Раз так говорят.

94

undertale

21.12.20

17:20

(90) 5 минут

95

undertale

21.12.20

17:22

(90) съехало просто не много , не могу полностью разобраться

96

Kassern

21.12.20

17:23

(92) ну не трогай запрос тогда, делай как я тебе написал еще раньше с условием в выборке. Ошибка данных у тебя только в отладке, на самом деле ошибки ни какой не будет при выполнении обработки, так как ты не обрабатываешь данные пустого запроса, а всего лишь выводишь 0, если выборка пустая в ПФ.

97

undertale

21.12.20

17:29

(96) Хорошо , спасибо

98

sqr4

21.12.20

18:01

Как я понимаю остальные виды расчета тоже выводятся. И нужно как то обойти результат, выделив из него надбавку за вредность

Доброго времени суток, коллеги! Много раз на нашем сайте обсуждалась тема запросов в 1С, например, как получить всех родителей элемента справочника одним запросом. В этой статье вы увидите еще много разных примеров запросов, которые помогут вам решать повседневные задачи. Вот, посмотрите.

Содержание

  1. Как в запросе 1с8 установить условие проверки периода на конец дня?
  2. Как правильно обрабатывать значения NULL в запросе 1С8?
  3. Как вывести результат запроса в табличный документ?
  4. Как посчитать возраст по дате рождения в запросе 1С8?
  5. Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?
  6. Как запросом получить все подчиненные документы?
  7. Как выглядит недокументированный синтаксис оператора ВЫБОР?
  8. Как составить запрос к табличной части документа?
  9. Как запросом для документа найти все подчинённые ему документы?
  10. Как сравнить строки в запросе?
  11. Как в запросе проверить поле на пустую ссылку?
  12. Как в запросе убрать фильтр на значение параметра?

Как в запросе 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(ГТД.Количество, 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
ИЗ
	Документ.НачислениеЗарплатыРаботникамОрганизаций КАК Начисление
	СОЕДИНЕНИЕ
	Документ.УвольнениеИзОрганизаций КАК Увольнение
ПО
Начисление.ДокументОснование = Увольнение.ДокументОснование
ГДЕ
(Начисление.ДокументОснование<>
ЗНАЧЕНИЕ(Документ.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка))

Заметим, что в параметре пишем «Документ», а не «Документы» и «ПустаяСсылка» без скобок.

Как в запросе убрать фильтр на значение параметра?

Например, нам нужно вывести данные о продажах, отфильтровав их по значению в поле формы «Товар», если в этом поле выбран нужный нам товар. И если товар не выбран, то вывести данные по всем товарам. Пример запроса такой:

Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
|	ПродажиОбороты.Номенклатура,
|	ПродажиОбороты.СуммаОборот КАК Сумма
|ИЗ
|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
|	&ДатаОкончания, , 
|	&Товар) КАК ПродажиОбороты";

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Запрос.УстановитьПараметр("Товар", Товар);

Рассмотрим четыре способа, как избавится от фильтра в запросе.

  1. Изменим параметр запроса с помощью функции «СтрЗаменить»:
    Если Товар.Пустая() Тогда
    	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", "");
    Иначе
    	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", "Номенклатура = &Товар");
    КонецЕсли;
    
  2. В параметре виртуальной таблицы вместо значения «&Товар» запишем следующее выражение:
    |&Товар = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) 
    | ИЛИ Номенклатура = &Товар
    

    Если параметр товар не заполнен, то первое выражение примет значение ИСТИНА, тогда значение всего выражения примет значение ИСТИНА. В этом случае как-будто и нет никакого фильтра. Но если товар заполнен, то первое выражение принимает значение ЛОЖЬ. Тогда сработает второе выражение и произойдет фильтрация по товару.

  3. Еще один способ возможен благодаря новому объекту платформы «СхемаЗапроса (QuerySchema)», который появился в версии 1С 8.3.5:
    СхемаЗапроса = Новый СхемаЗапроса;
    СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
    Если ЗначениеЗаполнено(Товар) Тогда
    	СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Источник.Параметры[3].Выражение = 
    	Новый ВыражениеСхемыЗапроса("Номенклатура = &Товар");
    КонецЕсли;
    Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
    
  4. Последний способ очень громоздкий, но его тоже можно использовать:
    Если Товар.Пустая() Тогда
    	Запрос.Текст =
    	"ВЫБРАТЬ
    	|	ПродажиОбороты.Номенклатура,
    	|	ПродажиОбороты.СуммаОборот КАК Сумма
    	|ИЗ
    	|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
    	|	&ДатаОкончания, , ) КАК ПродажиОбороты"
    Иначе
    	Запрос.Текст =
    	"ВЫБРАТЬ
    	|	ПродажиОбороты.Номенклатура,
    	|	ПродажиОбороты.СуммаОборот КАК Сумма
    	|ИЗ
    	|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
    	|	&ДатаОкончания, , Номенклатура = &Товар) КАК ПродажиОбороты";
    КонецЕсли;
    

    Как видите, в запросе изменилось только значение условия виртуальной таблицы.

ПОДПИСКА

Ошибка чтения значения

Автор Рафаэль, 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. Как в запросе 1с8 установить условие проверки периода на конец дня?
  2. Как правильно обрабатывать значения NULL в запросе 1С8?
  3. Как вывести результат запроса в табличный документ?
  4. Как посчитать возраст по дате рождения в запросе 1С8?
  5. Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?
  6. Как запросом получить все подчиненные документы?
  7. Как выглядит недокументированный синтаксис оператора ВЫБОР?
  8. Как составить запрос к табличной части документа?
  9. Как запросом для документа найти все подчинённые ему документы?
  10. Как сравнить строки в запросе?
  11. Как в запросе проверить поле на пустую ссылку?
  12. Как в запросе убрать фильтр на значение параметра?

Как в запросе 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(ГТД.Количество, 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
ИЗ
Документ.НачислениеЗарплатыРаботникамОрганизаций КАК Начисление
СОЕДИНЕНИЕ
Документ.УвольнениеИзОрганизаций КАК Увольнение
ПО
Начисление.ДокументОснование = Увольнение.ДокументОснование
ГДЕ
(Начисление.ДокументОснование<>
ЗНАЧЕНИЕ(Документ.ТабельУчетаРабочегоВремениОрганизации.ПустаяСсылка))

Заметим, что в параметре пишем «Документ», а не «Документы» и «ПустаяСсылка» без скобок.

Как в запросе убрать фильтр на значение параметра?

Например, нам нужно вывести данные о продажах, отфильтровав их по значению в поле формы «Товар», если в этом поле выбран нужный нам товар. И если товар не выбран, то вывести данные по всем товарам. Пример запроса такой:

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	ПродажиОбороты.Номенклатура,
|	ПродажиОбороты.СуммаОборот КАК Сумма
|ИЗ
|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
|	&ДатаОкончания, , 
|	&Товар) КАК ПродажиОбороты";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Запрос.УстановитьПараметр("Товар", Товар);

Рассмотрим четыре способа, как избавится от фильтра в запросе.

  1. Изменим параметр запроса с помощью функции «СтрЗаменить»:
    Если Товар.Пустая() Тогда
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", "");
    Иначе
    Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Товар", "Номенклатура = &Товар");
    КонецЕсли;
    
  2. В параметре виртуальной таблицы вместо значения «&Товар» запишем следующее выражение:
    |&Товар = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) 
    | ИЛИ Номенклатура = &Товар
    

    Если параметр товар не заполнен, то первое выражение примет значение ИСТИНА, тогда значение всего выражения примет значение ИСТИНА. В этом случае как-будто и нет никакого фильтра. Но если товар заполнен, то первое выражение принимает значение ЛОЖЬ. Тогда сработает второе выражение и произойдет фильтрация по товару.

  3. Еще один способ возможен благодаря новому объекту платформы «СхемаЗапроса (QuerySchema)», который появился в версии 1С 8.3.5:
    СхемаЗапроса = Новый СхемаЗапроса;
    СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
    Если ЗначениеЗаполнено(Товар) Тогда
    СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Источник.Параметры[3].Выражение = 
    Новый ВыражениеСхемыЗапроса("Номенклатура = &Товар");
    КонецЕсли;
    Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
    
  4. Последний способ очень громоздкий, но его тоже можно использовать:
    Если Товар.Пустая() Тогда
    Запрос.Текст =
    "ВЫБРАТЬ
    	|	ПродажиОбороты.Номенклатура,
    	|	ПродажиОбороты.СуммаОборот КАК Сумма
    	|ИЗ
    	|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
    	|	&ДатаОкончания, , ) КАК ПродажиОбороты"
    Иначе
    Запрос.Текст =
    "ВЫБРАТЬ
    	|	ПродажиОбороты.Номенклатура,
    	|	ПродажиОбороты.СуммаОборот КАК Сумма
    	|ИЗ
    	|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
    	|	&ДатаОкончания, , Номенклатура = &Товар) КАК ПродажиОбороты";
    КонецЕсли;
    

    Как видите, в запросе изменилось только значение условия виртуальной таблицы.

ПОДПИСКА

Почему возникает Ошибка чтения значений?

В консоле запрос работает, а вот в коде выдаёт ошибку.
5cfdf9004b119862880174.png5cfdf906a71bf049978238.png


  • Вопрос задан

  • 1798 просмотров

В коде напиши Запрос.Выполнить().Выгрузить() вместо Запрос.Выполнить().Выбрать()
Метод выгрузить возвращает тебе таблицу значений как в консоли, выбрать подходит для поочередного обхода значений таблицы в цикле.

Пригласить эксперта


  • Показать ещё
    Загружается…

23 сент. 2023, в 01:31

6000 руб./за проект

23 сент. 2023, в 01:13

3000 руб./за проект

22 сент. 2023, в 23:30

6500 руб./за проект

Минуточку внимания

Понравилась статья? Поделить с друзьями:
  • Срок действия договора истек код ошибки 16 сбербанк
  • Ссылка на папку недоступна mega ошибка
  • Ссд выдает ошибку
  • Стабилизатор стар 10000 ошибка н
  • Стабилизатор напряжения ресанта 10000вт ошибки