1с результат запроса ошибка чтения значения

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

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

ПОДПИСКА

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

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

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

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


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

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

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

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

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

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

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

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

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

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


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

21 сент. 2023, в 07:57

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

21 сент. 2023, в 06:22

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

21 сент. 2023, в 04:48

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

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

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

Автор Рафаэль, 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Массив = Новый Массив;

«Массив» — служебное слово. Слева, имя переменной, придумайте другое.

Затем после цикла точку останова поставьте и посмотрите, чему «Массив» равен, скорее всего ничему.

Нет не является, используется только в конструкции «Новый Массив». Теоретически его можно использовать без каких либо проблем, на практике — просто не желательно.

Если я Вам помог, нажми — Спасибо!



<_< да все у вас верно, в отладке так и будет показывать «Ошибка чтения значения». Поставьте точку останова во внутрь цикла и увидите в ней данные.

Если я Вам помог, нажми — Спасибо!



Всем привет. Вопрос может простой , так что заранее сорри.
Есть запрос

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

                     ТаблицаДанных=Запрос.Выполнить().Выгрузить();            
    ДокументДанных=Новый ТабличныйДокумент;

            Макет=Отчеты.Отчет1.ПолучитьМакет(«Макет1»);
    ОбластьШапкаЗаявки=Макет.ПолучитьОбласть(«ШапкаЗаявки»);
    ОбластьЗаголовок=Макет.ПолучитьОбласть(«Заголовок»);
    ОбластьСтрока=Макет.ПолучитьОбласть(«Строка»);

        ОбластьШапкаЗаявки.Параметры.Клиент=Клиент;
    ОбластьШапкаЗаявки.Параметры.Грузополучатель=Грузополучатель;
    ДокументДанных.Вывести(ОбластьШапкаЗаявки);

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

        ОбластьСтрока.Параметры.НомерЗаказ=СтрокаДанных.НомерЗаказ;
    ОбластьСтрока.Параметры.НомерЗаявка=СтрокаДанных.НомерЗаявка;
    ОбластьСтрока.Параметры.ДатаЗаявка=СтрокаДанных.ДатаЗаявка;
    ОбластьСтрока.Параметры.НомерИнвойс=СтрокаДанных.НомерИнвойс;
    ОбластьСтрока.Параметры.ДатаИнвойс=СтрокаДанных.ДатаИнвойс;
    ОбластьСтрока.Параметры.СуммаИнвойс=СтрокаДанных.СуммаИнвойс;
    ОбластьСтрока.Параметры.СуммаЗаявка=СтрокаДанных.СуммаЗаявка;
    ОбластьСтрока.Параметры.СуммаИнвойс=СтрокаДанных.СуммаПриход;
    ОбластьСтрока.Параметры.СуммаЗаявка=СтрокаДанных.СуммаЗаявка;

           ДокументДанных.Вывести(ОбластьЗаголовок);
    ДокументДанных.Вывести(ОбластьСтрока);

                    КонецЦикла;

        Возврат ДокументДанных;

В результате выполнения получается табличка типа
…заявка инвойс…
…заявка инвойс…

но, в самом документе в 1 заявке может быть 2 инвойса, соответственно хотелось бы вывести
…заявка инвойс…
…       инвойс…

я понимаю что по регистру накоплений есть 2 записи по приходу от одной и той же заявки соответственно цикл эти 2 строки и выводит, но как вывести это одной строкой?

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • 1с регистрация ошибок конфигурации
  • 1с публикация на веб сервере iis ошибка 400
  • 1с рарус код ошибки 12002
  • 1с публикация на веб сервере iis ошибка 500
  • 1с публикация на веб сервере apache ошибка

  • Добавить комментарий

    ;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: