Ошибка чтения данных запрос

Ошибка чтения значения в Выборке ☑ 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

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

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

Автор Рафаэль, 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с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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ
            |   дфГосЗаказОбороты.Держатель КАК Держатель,
            |   дфГосЗаказОбороты.ПостащикЛома КАК ПостащикЛома,
            |   дфГосЗаказОбороты.ВидКонтракта КАК ВидКонтракта,
            |   дфГосЗаказОбороты.Статус КАК Статус,
            |   ВложенныйЗапрос.Контрагент КАК Контрагент,
            |   дфГосЗаказОбороты.ЯнварьОборот КАК Январь,
            |   дфГосЗаказОбороты.ФевральОборот КАК Февраль,
            |   дфГосЗаказОбороты.МартОборот КАК Март,
            |   дфГосЗаказОбороты.АпрельОборот КАК Апрель,
            |   дфГосЗаказОбороты.МайОборот КАК Май,
            |   дфГосЗаказОбороты.ИюньОборот КАК Июнь,
            |   дфГосЗаказОбороты.ИюльОборот КАК Июль,
            |   дфГосЗаказОбороты.АвгустОборот КАК Август,
            |   дфГосЗаказОбороты.СентябрьОборот КАК Сентябрь,
            |   дфГосЗаказОбороты.ОктябрьОборот КАК Октябрь,
            |   дфГосЗаказОбороты.НоябрьОборот КАК Ноябрь,
            |   дфГосЗаказОбороты.ДекабрьОборот КАК Декабрь
            |ИЗ
            |   (ВЫБРАТЬ
            |       ххх_МеталлоломОбороты.Контрагент КАК Контрагент,
            |       ххх_МеталлоломОбороты.ЧистыйВесОборот КАК ЧистыйВесОборот,
            |       ххх_МеталлоломОбороты.Держатель КАК Держатель
            |   ИЗ
            |       РегистрНакопления.ххх_Металлолом.Обороты КАК ххх_МеталлоломОбороты) КАК ВложенныйЗапрос
            |       ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.дфГосЗаказ.Обороты КАК дфГосЗаказОбороты
            |       ПО дфГосЗаказОбороты.ПостащикЛома.Наименование = ВложенныйЗапрос.Контрагент.Наименование
            |ГДЕ
            |   дфГосЗаказОбороты.Статус <> &Статус
            |   И дфГосЗаказОбороты.ВидКонтракта = &ВидКонтракта
            |   И дфГосЗаказОбороты.ПостащикЛома <> дфГосЗаказОбороты.Держатель
            |   И ВложенныйЗапрос.Держатель = &Держатель";
                
            Запрос.УстановитьПараметр("Статус", Перечисления.дфСтатусыГосЗаказа.Расторгнут);
            Запрос.УстановитьПараметр("ВидКонтракта", Перечисления.дфВидыКонтрактов.Госзаказ);
            Запрос.УстановитьПараметр("Держатель", Отчет.Организация);
 
            //Запрос.УстановитьПараметр("ДатаНачалаПериода", НачалоГода(Отчет.Дата));
            //Запрос.УстановитьПараметр("ДатаОкончанияПериода", КонецГода(Отчет.Дата));
            //Запрос.УстановитьПараметр("ВыбраннаяОрганизация", Отчет.Организация);
                            
            РезультатЗапроса = Запрос.Выполнить();
            
            Выгрузка = РезультатЗапроса.Выгрузить();
            
            ВыборкаДетальныеЗаписиОсновнаяЧасть = РезультатЗапроса.Выбрать();
 
            Пока ВыборкаДетальныеЗаписиОсновнаяЧасть.Следующий() Цикл           
            //заполняем остальную таблицу, где Держатель != ПоставщикЛома
                ОбластьОсновного.Параметры.Заполнить(ВыборкаДетальныеЗаписиОсновнаяЧасть);
                Если Не ТабличныйДокумент.ПроверитьВывод(ОбластьОсновного) Тогда
                    ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
                    НомерЛиста = НомерЛиста + 1;
                    ОбластьШапки.Параметры.НомерЛиста = НомерЛиста;
                    ТабличныйДокумент.Вывести(ОбластьОсновного);
                КонецЕсли;
                ТабличныйДокумент.Вывести(ОбластьОсновного);
 
            ОбластьОсновного.Параметры.УНП = ВыборкаДетальныеЗаписиОсновнаяЧасть.Контрагент.ИНН;
            ОбластьОсновного.Параметры.НаименованиеОрганизации = ВыборкаДетальныеЗаписиОсновнаяЧасть.ПостащикЛома.Наименование;
                        
                
                МесяцЧисло = Месяц(Отчет.Дата); //Получаем число месяца из переменной КонецМесяца
                
                Запрос = Новый Запрос;
                Запрос.Текст = 
                    "ВЫБРАТЬ
                    |   СУММА(ххх_МеталлоломОбороты.ЧистыйВесОборот) КАК СуммаЧистыйВесЗаМесяц
                    |ИЗ
                    |   РегистрНакопления.ххх_Металлолом.Обороты(&НачалоМесяца, &КонецМесяца, Месяц, ) КАК ххх_МеталлоломОбороты
                    |ГДЕ
                    |   ххх_МеталлоломОбороты.Период МЕЖДУ &НачалоМесяца И &КонецМесяца
                    |   И ххх_МеталлоломОбороты.Партнер = &Партнер";
                
                Запрос.УстановитьПараметр("НачалоМесяца", НачалоМесяца(Отчет.Дата));
                Запрос.УстановитьПараметр("КонецМесяца", КонецМесяца(Отчет.Дата));
                Запрос.УстановитьПараметр("Партнер", Отчет.Организация);
 
                РезультатЗапроса = Запрос.Выполнить();
                
                ВыборкаПоМесяцу = РезультатЗапроса.Выбрать();
        
                Пока ВыборкаПоМесяцу.Следующий() Цикл
      
                    Если МесяцЧисло = 1 Тогда     // определяем число Месяца и считаем план за месяц
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 2 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 3 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Март;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 4 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 5 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Май;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 6 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 7 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 8 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Август;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;;
                    ИначеЕсли МесяцЧисло = 9 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 10 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 11 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    ИначеЕсли МесяцЧисло = 12 Тогда
                        ОбластьОсновного.Параметры.ПланМесяц = ВыборкаДетальныеЗаписиОсновнаяЧасть.Декабрь;
                        ОбластьОсновного.Параметры.ФактМесяц = ВыборкаПоМесяцу.СуммаЧистыйВесЗаМесяц;
                    КонецЕсли;
                    ОбластьОсновного.Параметры.ФактМесяц = Формат(ОбластьОсновного.Параметры.ФактМесяц,"ЧДЦ=3"); 
                    
                КонецЦикла;
                
                //проверка на пустоту плана за месяц
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланМесяц) Тогда
                    СуммаПланМесяц = СуммаПланМесяц + ОбластьОсновного.Параметры.ПланМесяц;
                Иначе
                    СуммаПланМесяц = СуммаПланМесяц + 0;
                КонецЕсли;
                
                //проверка на пустоту факта за месяц
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактМесяц) Тогда
                    СуммаФактМесяц = СуммаФактМесяц + ОбластьОсновного.Параметры.ФактМесяц;
                Иначе
                    СуммаФактМесяц = СуммаФактМесяц + 0;
                КонецЕсли;
 
                // подсчёт процента за Месяц и проверка на пустоту Плана и Факта
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланМесяц) И НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактМесяц)  Тогда
                    ПроцентЗаМесяц = ОбластьОсновного.Параметры.ФактМесяц/ОбластьОсновного.Параметры.ПланМесяц*100;
                    ОбластьОсновного.Параметры.ПроцентМесяц = Формат(ПроцентЗаМесяц,"ЧДЦ=2"); 
                Иначе
                    ОбластьОсновного.Параметры.ПроцентМесяц = " ";
                КонецЕсли;
                
                //считаем план за квартал
                Запрос = Новый Запрос;
                Запрос.Текст = 
                    "ВЫБРАТЬ
                    |   СУММА(ххх_МеталлоломОбороты.ЧистыйВесОборот) КАК СуммаЧистыйВесЗаКвартал
                    |ИЗ
                    |   РегистрНакопления.ххх_Металлолом.Обороты(&НачалоКвартала, &КонецКвартала, Квартал, ) КАК ххх_МеталлоломОбороты
                    |ГДЕ
                    |   ххх_МеталлоломОбороты.Период МЕЖДУ &НачалоКвартала И &КонецКвартала
                    |   И ххх_МеталлоломОбороты.Партнер = &Партнер";
                
                Запрос.УстановитьПараметр("НачалоКвартала", НачалоКвартала(Отчет.Дата));
                Запрос.УстановитьПараметр("КонецКвартала", КонецКвартала(Отчет.Дата));
                Запрос.УстановитьПараметр("Партнер", Отчет.Организация);
 
                РезультатЗапроса = Запрос.Выполнить();
                
                ВыборкаПоКварталу = РезультатЗапроса.Выбрать();
                
                Пока ВыборкаПоКварталу.Следующий() Цикл
                    //Определяем число месяца и считаем План за Квартал   
                    Если МесяцЧисло = 1 ИЛИ МесяцЧисло = 2 ИЛИ МесяцЧисло = 3 Тогда        
                        ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь +  ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март;
                        ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал;
                    ИначеЕсли МесяцЧисло = 4 ИЛИ МесяцЧисло = 5 ИЛИ МесяцЧисло = 6 Тогда
                        ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель +  ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь;
                        ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал;
                    ИначеЕсли МесяцЧисло = 7 ИЛИ МесяцЧисло = 8 ИЛИ МесяцЧисло = 9 Тогда
                        ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль +  ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь;
                        ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал;
                    ИначеЕсли МесяцЧисло = 10 ИЛИ МесяцЧисло = 11 ИЛИ МесяцЧисло = 12 Тогда
                        ОбластьОсновного.Параметры.ПланКвартал = ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь +  ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Декабрь;
                        ОбластьОсновного.Параметры.ФактКвартал = ВыборкаПоКварталу.СуммаЧистыйВесЗаКвартал;
                    КонецЕсли;
                    ОбластьОсновного.Параметры.ФактКвартал = Формат(ОбластьОсновного.Параметры.ФактКвартал,"ЧДЦ=3"); 
 
                КонецЦикла;
                
                //проверка на пустоту плана за квартал
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланКвартал) Тогда
                    СуммаПланКвартал = СуммаПланКвартал + ОбластьОсновного.Параметры.ПланКвартал;
                Иначе
                    СуммаПланКвартал = СуммаПланКвартал + 0;
                КонецЕсли;
                
                //проверка на пустоту факта за квартал
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактКвартал) Тогда
                    СуммаФактКвартал = СуммаФактКвартал + ОбластьОсновного.Параметры.ФактКвартал;
                Иначе
                    СуммаФактКвартал = СуммаФактКвартал + 0;
                КонецЕсли;
 
                // подсчёт процента за Квартал и проверка на пустоту Плана и Факта
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланКвартал) И НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактКвартал)  Тогда
                    ПроцентЗаКвартал = ОбластьОсновного.Параметры.ФактКвартал/ОбластьОсновного.Параметры.ПланКвартал*100;
                    ОбластьОсновного.Параметры.ПроцентКвартал = Формат(ПроцентЗаКвартал,"ЧДЦ=2");
                Иначе
                    ОбластьОсновного.Параметры.ПроцентКвартал = " ";
                КонецЕсли;
                        
                Запрос = Новый Запрос;
                Запрос.Текст = 
                    "ВЫБРАТЬ
                    |   СУММА(ххх_МеталлоломОбороты.ЧистыйВесОборот) КАК СуммаЧистыйВесЗаГод
                    |ИЗ
                    |   РегистрНакопления.ххх_Металлолом.Обороты(&НачалоГода, &КонецВыбранногоМесяца, Год, ) КАК ххх_МеталлоломОбороты
                    |ГДЕ
                    |   ххх_МеталлоломОбороты.Период МЕЖДУ &НачалоГода И &КонецВыбранногоМесяца
                    |   И ххх_МеталлоломОбороты.Партнер = &Партнер";
                
                Запрос.УстановитьПараметр("КонецВыбранногоМесяца", КонецМесяца(Отчет.Дата));
                Запрос.УстановитьПараметр("НачалоГода", НачалоГода(Отчет.Дата));
                Запрос.УстановитьПараметр("Партнер", Отчет.Организация);
 
                
                РезультатЗапроса = Запрос.Выполнить();
                
                ВыборкаФактЗаГод = РезультатЗапроса.Выбрать();
                
                Пока ВыборкаФактЗаГод.Следующий() Цикл
                    //Определяем число месяца и считаем План за Год   
                        Если МесяцЧисло=1 Тогда  
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 2 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписи.Февраль;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 3 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 4 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 5 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 6 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 7 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 8 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 9 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 10 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 11 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь;
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        ИначеЕсли МесяцЧисло = 12 Тогда
                            ОбластьОсновного.Параметры.ПланГод = ВыборкаДетальныеЗаписиОсновнаяЧасть.Январь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Февраль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Март + ВыборкаДетальныеЗаписиОсновнаяЧасть.Апрель + ВыборкаДетальныеЗаписиОсновнаяЧасть.Май + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июнь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Июль + ВыборкаДетальныеЗаписиОсновнаяЧасть.Август + ВыборкаДетальныеЗаписиОсновнаяЧасть.Сентябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Октябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Ноябрь + ВыборкаДетальныеЗаписиОсновнаяЧасть.Декабрь;     
                            ОбластьОсновного.Параметры.ФактГод = ВыборкаФактЗаГод.СуммаЧистыйВесЗаГод;
                        КонецЕсли;
                        
                        ОбластьОсновного.Параметры.ФактГод = Формат(ОбластьОсновного.Параметры.ФактГод,"ЧДЦ=3"); 
                КонецЦикла;
                
                
                //проверка на пустоту плана за год
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланГод) Тогда
                    СуммаПланГод = СуммаПланГод + ОбластьОсновного.Параметры.ПланГод;
                Иначе
                    СуммаПланГод = СуммаПланГод + 0;
                КонецЕсли;
                
                //проверка на пустоту факта за год
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактГод) Тогда
                    СуммаФактГод = СуммаФактГод + ОбластьОсновного.Параметры.ФактГод;
                Иначе
                    СуммаФактГод = СуммаФактГод + 0;
                КонецЕсли;
    
                // подсчёт процента за Год и проверка на пустоту Плана и Факта
                Если НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ПланГод) И НЕ ПустаяСтрока(ОбластьОсновного.Параметры.ФактГод)  Тогда
                    ПроцентЗаГод = ОбластьОсновного.Параметры.ФактГод/ОбластьОсновного.Параметры.ПланГод*100;
                    ОбластьОсновного.Параметры.ПроцентГод = Формат(ПроцентЗаГод,"ЧДЦ=2");
                Иначе
                    ОбластьОсновного.Параметры.ПроцентГод = " ";
                КонецЕсли;
            
    //Продолжить;
            КонецЦикла;
Процедура ОбработкаПроведения(Отказ, Режим)
	Движения.ОстаткиТоваров.Записывать = Истина;
	Движения.Продажи.Записывать = Истина;

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

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

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


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

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

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

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

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

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

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

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

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

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


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

19 окт. 2023, в 10:45

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

19 окт. 2023, в 09:48

800 руб./в час

19 окт. 2023, в 09:35

1000 руб./в час

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

  • Ошибка чтения карты 362
  • Ошибка чередования фаз на кондиционере
  • Ошибка чтения nfc метки сбпэй айфон
  • Ошибка чтения данных архива data1 bin
  • Ошибка чек энджин рено меган 2