Значение ошибка чтения значения 1с

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

Я
   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. Как в запросе 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. Последний способ очень громоздкий, но его тоже можно использовать:
    Если Товар.Пустая() Тогда
    	Запрос.Текст =
    	"ВЫБРАТЬ
    	|	ПродажиОбороты.Номенклатура,
    	|	ПродажиОбороты.СуммаОборот КАК Сумма
    	|ИЗ
    	|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
    	|	&ДатаОкончания, , ) КАК ПродажиОбороты"
    Иначе
    	Запрос.Текст =
    	"ВЫБРАТЬ
    	|	ПродажиОбороты.Номенклатура,
    	|	ПродажиОбороты.СуммаОборот КАК Сумма
    	|ИЗ
    	|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, 
    	|	&ДатаОкончания, , Номенклатура = &Товар) КАК ПродажиОбороты";
    КонецЕсли;
    

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

ПОДПИСКА

Процедура ОбработкаПроведения(Отказ, Режим)
	Движения.ОстаткиТоваров.Записывать = Истина;
	Движения.Продажи.Записывать = Истина;

	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		
	        "ВЫБРАТЬ
	 |	СУММА(ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток,
	 |	ОстаткиТоваровОстатки.Номенклатура КАК Номенклатура,
	 |	СУММА(ЕСТЬNULL(ОстаткиТоваровОстатки.СуммаОстаток, 0)) КАК СуммаОстаток,
	 |	СУММА(ЕСТЬNULL(РасходРасходТЧ.Количество, 0)) КАК Количество
	 |ИЗ
	 |	Документ.Расход.РасходТЧ КАК РасходРасходТЧ
	 |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
	 |		ПО ОстаткиТоваровОстатки.Номенклатура = РасходРасходТЧ.Номенклатура
	 |
	 |СГРУППИРОВАТЬ ПО
	 |	ОстаткиТоваровОстатки.Номенклатура";
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
		
	Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
		
	        Движения.ОстаткиТоваров.Записывать = Ложь;
			Движения.Продажи.Записывать = Ложь;
			Сообщить("Недостаточно товара на складе!");
	КонецЕсли;		
	
	СуммаСебестоимость = 0;

    СуммаСебестоимость = Выборка.СуммаОстаток / Выборка.КоличествоОстаток * Выборка.Количество;
		
	Для Каждого ТекСтрокаРасходТЧ Из РасходТЧ Цикл
		Движение = Движения.ОстаткиТоваров.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
		Движение.Период = Дата;
		Движение.Номенклатура = ТекСтрокаРасходТЧ.Номенклатура;
		Движение.Количество = Выборка.Количество;
		Движение.Сумма = СуммаСебестоимость;
		
		Движение = Движения.Продажи.Добавить();
		Движение.Период = Дата;
		Движение.Номенклатура = ТекСтрокаРасходТЧ.Номенклатура;
		Движение.Количество = Выборка.Количество;
		Движение.Сумма = Выборка.Сумма;
			
	КонецЦикла;		
	КонецПроцедуры

Почему в отладчике выдается «Ошибка чтения значений»? Гуглил так и не нагуглил, не понимаю в чем ошибка. Буду рад помощи, спасибо заранее


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

    более двух лет назад

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

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

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

Ну алгоритм не корректен.
Как понял цель найти остатки, если их хватает создать запись.

Выборка = РезультатЗапроса.Выбрать();
 Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
          Движения.ОстаткиТоваров.Записывать = Ложь;
      Движения.Продажи.Записывать = Ложь;
      Сообщить("Недостаточно товара на складе!");
  КонецЕсли;

Без перебора результата выборки из запроса.

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

Для Каждого ТекСтрокаРасходТЧ Из РасходТЧ Цикл
    Движение = Движения.ОстаткиТоваров.Добавить();
    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;

Подглядите туточки


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

12 июн. 2023, в 15:24

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

12 июн. 2023, в 15:01

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

12 июн. 2023, в 14:55

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

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

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

Я

  

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

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

ПОДПИСКА

Страница 1 из 2

  1. Добрый день, пишу обработку для выгрузки результата запроса в 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.Закрыть();


  2. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков);
    Запрос.УстановитьПараметр("Счет", Счет);
    Запрос.УстановитьПараметр("Склад", СкладВыбор);
  3. параметры запроса он получает…, но не отрабатывает запрос, что делать , куда копать!!


  4. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    С чего вы взяли что не отрабатывает ?

  5. Смотрю через «»Вычислить выражение» РЕЗУЛЬТАТ , он пишет : ошибка чтения значений

    — Объединение сообщений, 8 июл 2015

    Может и отрабатывает, но в xml ни чего не догружает кроме шапки


  6. alexburn

    Offline

    alexburn
    Модераторы
    Команда форума
    Модератор

    Регистрация:
    5 янв 2009
    Сообщения:
    15.150
    Симпатии:
    560
    Баллы:
    204

    Отладчиком смотрите, либо в консоли запросов проверяйте ваш запрос.

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


  8. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Потому что значение нужно смотреть после Результат.Следующий()

  9. Смотрю значение «Результат.Субконто1» тоже пустота . Как мне тогда результат запроса записать в xml//


  10. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Тип значения какой у «пустоты»?

  11. значение пустота , тип неопределенно


  12. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    у всех элементов из выборки?

  13. да , посмотрел в цикле, все идет пустотой, нет пойму уже из за чего


  14. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Значит не определены значения Субконто1 на выбранном счете для всех проводок, попадающих под условия отбора в запросе.

  15. Проверяю через консоль , все заполненно все отображается


  16. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Скриншотом можете продемонстрировать результат отладки кода?

  17. вот скрин , немного переделал код

    Вложения:

    • выборка.jpg

  18. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    А так чтобы было видно исполняемый код и точку останова в нем?

  19. вот

    — Объединение сообщений, 8 июл 2015

    .

    Вложения:

    • выборка.jpg

  20. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.889
    Симпатии:
    1.029
    Баллы:
    204

    Внимательно читаем пост #8 и еще раз проверяем значение, в данном случае уже у переменной ВЫБОРКА

Страница 1 из 2


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3

Понравилась статья? Поделить с друзьями:
  • Значение корня в слове ошибка
  • Значение ошибок на панели приборов опель
  • Значение кодов ошибок опель астра н
  • Значение ошибок на панели приборов на калине
  • Значение кодов ошибок в роблокс