Выборкадетальныезаписи ошибка чтения значения

Простой запрос и ошибка в чтении значения ☑ 0

Iater

09.06.15

01:07

Всем привет! Помогите, пожалуйста, справится с запросом — в консоли запросов всё работает идеально, а на практике выдает ошибку в чтении значения я хз почему:

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

    Запрос.Текст =

        «ВЫБРАТЬ

        |    Сотрудники.ДатаРождения КАК ДатаРождения

        |ИЗ

        |    Справочник.Сотрудники КАК Сотрудники

        |ГДЕ

        |    Сотрудники.Наименование = &ФИО»;

        
    Запрос.УстановитьПараметр(«ФИО», ФИО);

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

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

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

    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;

Как я понял, проблема в позиционировании выборки на значении? Как же спозиционировать-то иначе?

1

Iater

09.06.15

01:10

забыл скачать — в 8.3 работаю

2

Сергиус

09.06.15

01:11

(0)Что у тебя в параметре ФИО?

3

Iater

09.06.15

01:13

в ФИО  — Иванов

я точку останова поставил — в ФИО точно нормально всё читает

4

France

09.06.15

01:14

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

здесь песню поешь

конецЦикла.

и не будет ошибки..

5

Сергиус

09.06.15

01:15

(3)Запрос.УстановитьПараметр(«ФИО», СокрЛП(ФИО));

6

Iater

09.06.15

01:16

у меня одно значение, не нужен цикл. Впрочем, поставил — ноль на массу. Не работает всё равно

7

Iater

09.06.15

01:17

в ФИО сейчас забил не Иванов, а цифру «1» — не работает хоть как ты СокрЛП или не сокр

8

Сергиус

09.06.15

01:19

(7)Так может нет такого сотрудника с наименованием «1» в базе?

9

Iater

09.06.15

01:19

Сергиус, есть… в консоли же всё верно выводит

10

Сергиус

09.06.15

01:22

ВыборкаДетальныеЗаписи.Количество() что говорит?

11

Iater

09.06.15

01:24

неопределено

12

Сергиус

09.06.15

01:29

Сохрани все в обработку, и выложи куда ть.

13

Сергиус

09.06.15

01:29

или можно по ТимВьюверу)

14

France

09.06.15

01:34

(6) сообщение об ошибке есть?.. если да, то текст сюда.

15

Iater

09.06.15

01:36

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

16

France

09.06.15

01:39

а ФИО как устанавливается?? можно сюда текст??

17

France

09.06.15

01:42

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

18

Iater

09.06.15

01:43

в форме документа делаю:

&НаСервере

Функция ДатаРождения (ФИО)

    

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

    Запрос.Текст =

        «ВЫБРАТЬ

        |    Сотрудники.ДатаРождения КАК ДатаРождения

        |ИЗ

        |    Справочник.Сотрудники КАК Сотрудники

        |ГДЕ

        |    Сотрудники.Наименование = &ФИО»;

        
    Запрос.УстановитьПараметр(«ФИО», ФИО);

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

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

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

    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;

    
    Возврат ДатаРождения;    

    
    
КонецФункции

&НаКлиенте

Процедура ФИОФИОПриИзменении(Элемент)

    СтрокаТабличнойЧасти = Элементы.ФИО.ТекущиеДанные;

    ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);

    
    ДатаДокумента = Объект.Дата;

    
    Возраст = ДатаДокумента — ДатаРождения;

    
    СтрокаТабличнойЧасти.Возраст = Возраст;

КонецПроцедуры

19

France

09.06.15

01:46

смотри что тут » ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);»

20

Iater

09.06.15

01:50

не понял что там?

21

Вася Чез

09.06.15

01:50

(18) ДатаДокумента и ДатаРождения это дата в секундах или что?

22

Iater

09.06.15

01:52

да плевать пока, в секундах наверняка )) у меня запрос не получается — вот что хреново

23

France

09.06.15

01:53

(20) тип значения.

24

Iater

09.06.15

01:55

France, объясни, пожалуйста, как для тупого )) ФИО передается в запрос — я это вижу, когда ставлю точку останова

25

France

09.06.15

01:59

(24) да, ты видишь фио, но не обязательно что это строка. а в запросе ты со строкой сравниваешь. в отладчике тип значения виден..

26

Iater

09.06.15

02:09

France, ФИО из формы передается как ссылка (тип СправочникСсылка.Сотрудники)

чета я не соображаю в чем проблема

27

Вася Чез

09.06.15

02:11

(26) Проблема в том, что в консоли у тебя ФИО строка, а сейчас у ФИО какой тип? посмотри в отладчике, правой тапкой по ФИО во время отладки «Вычислить выражение».

28

France

09.06.15

02:14

СправочникСсылка.Сотрудники (27) (26) ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО.наименование);»

29

France

09.06.15

02:14

в консоли он как раз устанавливал правильное значение, а не строку, так как в консоли 1С-на сама тип определяет..

30

Iater

09.06.15

02:16

всё заработала, спасибо огромное!!

Дейсвительно из-за типа ФИО. Поставил:

31

Iater

09.06.15

02:17

ДатаРождения = ДатаРождения(Строка(СтрокаТабличнойЧасти.ФИО));

и всё заработало

32

France

09.06.15

02:24

(31) в другом месте такое преобразование боком вылезти может))

33

Iater

09.06.15

02:37

почему7

34

Iater

09.06.15

02:37

как по-другому сделать, чтобы всё было правильно и работало?

35

France

09.06.15

02:39

(33) у спр сотрудники представление «наименование». если бы был код — твой вариант не сработал бы (хотя, представление код вроде и не часто используется). нужно было явно указать ФИО.Наименование, либо в запросе делать фильтр на ссылку, а не на наименование..

36

Simod

09.06.15

06:51

Раньше было «модно» искать через НайтиПоНаименованию(), сейчас это делают через Запросы. Может пора разобраться что такое Ссылка и Объект, и как с ними работать?

37

hhhh

09.06.15

07:11

(34) ну, по-нормальному. Выбирать сотрудника из справочника, а не писать вручную фамилию.

38

Вася Чез

09.06.15

07:31

(37) может это особенность нетленки ТС — заполнять ТЧ вручную, хз правда зачем

39

azt-yur

09.06.15

07:47

У тебя уже ссылка на справочник имеется. Зачем писать целую функцию для получения даты рождения, да еще и с запросом к этому же справочнику?

Не проще ли

ДатаРождения = СтрокаТабличнойЧасти.ФИО.ДатаРождения;

40

katc

09.06.15

08:47

Выборка и пустой может быть.

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

    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;

КонецЕсли;

41

ДенисЧ

09.06.15

08:50

«Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда »

три года. Без конфискации.

42

katc

09.06.15

09:18

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

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

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

43

katc

09.06.15

09:21

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

Ну а теперь расскажи за что в этом случае меня надо на 3 года?

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

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

44

Krolik Bezobraznik

09.06.15

09:29

Чудес не бывает.

Перемудрил с типами значений передаваемых параметров.

Ваш запрос ничего не возвращает. Далее у вас стоит процедура получения значения строки. Строк у вас нет, а вы упорно даете указание чтобы вернуть значение. Тут и проблема. ИМХО.

Используйте конструкцию с циклом. Она более корректная. Если переживаете, что ваш запрос вернет более одной строки, то возвращайте в запросе ПЕРВЫЕ 1. Если результат запроса будет пустым, то ошибок не будет и вы отладчиком увидите, если проблемы будут.

Простой запрос и ошибка в чтении значения

Я

Iater

09.06.15 — 01:07

Всем привет! Помогите, пожалуйста, справится с запросом — в консоли запросов всё работает идеально, а на практике выдает ошибку в чтении значения я хз почему:

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

    Запрос.Текст =

        «ВЫБРАТЬ

        |    Сотрудники.ДатаРождения КАК ДатаРождения

        |ИЗ

        |    Справочник.Сотрудники КАК Сотрудники

        |ГДЕ

        |    Сотрудники.Наименование = &ФИО»;

        
    Запрос.УстановитьПараметр(«ФИО», ФИО);

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

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

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

    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;

Как я понял, проблема в позиционировании выборки на значении? Как же спозиционировать-то иначе?

Iater

1 — 09.06.15 — 01:10

забыл скачать — в 8.3 работаю

Сергиус

2 — 09.06.15 — 01:11

(0)Что у тебя в параметре ФИО?

Iater

3 — 09.06.15 — 01:13

в ФИО  - Иванов

я точку останова поставил - в ФИО точно нормально всё читает

France

4 — 09.06.15 — 01:14

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

и не будет ошибки..

Сергиус

5 — 09.06.15 — 01:15

(3)Запрос.УстановитьПараметр(«ФИО», СокрЛП(ФИО));

Iater

6 — 09.06.15 — 01:16

у меня одно значение, не нужен цикл. Впрочем, поставил — ноль на массу. Не работает всё равно

Iater

7 — 09.06.15 — 01:17

в ФИО сейчас забил не Иванов, а цифру «1» — не работает хоть как ты СокрЛП или не сокр

Сергиус

8 — 09.06.15 — 01:19

(7)Так может нет такого сотрудника с наименованием «1» в базе?

Iater

9 — 09.06.15 — 01:19

Сергиус, есть… в консоли же всё верно выводит

Сергиус

10 — 09.06.15 — 01:22

ВыборкаДетальныеЗаписи.Количество() что говорит?

Iater

11 — 09.06.15 — 01:24

неопределено

Сергиус

12 — 09.06.15 — 01:29

Сохрани все в обработку, и выложи куда ть.

Сергиус

13 — 09.06.15 — 01:29

или можно по ТимВьюверу)

France

14 — 09.06.15 — 01:34

(6) сообщение об ошибке есть?.. если да, то текст сюда.

Iater

15 — 09.06.15 — 01:36

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

France

16 — 09.06.15 — 01:39

а ФИО как устанавливается?? можно сюда текст??

France

17 — 09.06.15 — 01:42

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

Iater

18 — 09.06.15 — 01:43

в форме документа делаю:

&НаСервере

Функция ДатаРождения (ФИО)
    

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

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

    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
         
    ВыборкаДетальныеЗаписи.Следующий();
    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
    
    Возврат ДатаРождения;    
    
    
КонецФункции

&НаКлиенте
Процедура ФИОФИОПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.ФИО.ТекущиеДанные;
    ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);
    
    ДатаДокумента = Объект.Дата;
    
    Возраст = ДатаДокумента - ДатаРождения;
    
    СтрокаТабличнойЧасти.Возраст = Возраст;

КонецПроцедуры

France

19 — 09.06.15 — 01:46

смотри что тут » ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО);»

Iater

20 — 09.06.15 — 01:50

не понял что там?

Вася Чез

21 — 09.06.15 — 01:50

(18) ДатаДокумента и ДатаРождения это дата в секундах или что?

Iater

22 — 09.06.15 — 01:52

да плевать пока, в секундах наверняка )) у меня запрос не получается — вот что хреново

France

23 — 09.06.15 — 01:53

(20) тип значения.

Iater

24 — 09.06.15 — 01:55

France, объясни, пожалуйста, как для тупого )) ФИО передается в запрос — я это вижу, когда ставлю точку останова

France

25 — 09.06.15 — 01:59

(24) да, ты видишь фио, но не обязательно что это строка. а в запросе ты со строкой сравниваешь. в отладчике тип значения виден..

Iater

26 — 09.06.15 — 02:09

France, ФИО из формы передается как ссылка (тип СправочникСсылка.Сотрудники)

чета я не соображаю в чем проблема

Вася Чез

27 — 09.06.15 — 02:11

(26) Проблема в том, что в консоли у тебя ФИО строка, а сейчас у ФИО какой тип? посмотри в отладчике, правой тапкой по ФИО во время отладки «Вычислить выражение».

France

28 — 09.06.15 — 02:14

СправочникСсылка.Сотрудники (27) (26) ДатаРождения = ДатаРождения(СтрокаТабличнойЧасти.ФИО.наименование);»

France

29 — 09.06.15 — 02:14

в консоли он как раз устанавливал правильное значение, а не строку, так как в консоли 1С-на сама тип определяет..

Iater

30 — 09.06.15 — 02:16

всё заработала, спасибо огромное!!

Дейсвительно из-за типа ФИО. Поставил:

Iater

31 — 09.06.15 — 02:17

ДатаРождения = ДатаРождения(Строка(СтрокаТабличнойЧасти.ФИО));

и всё заработало

France

32 — 09.06.15 — 02:24

(31) в другом месте такое преобразование боком вылезти может))

Iater

33 — 09.06.15 — 02:37

почему7

Iater

34 — 09.06.15 — 02:37

как по-другому сделать, чтобы всё было правильно и работало?

France

35 — 09.06.15 — 02:39

(33) у спр сотрудники представление «наименование». если бы был код — твой вариант не сработал бы (хотя, представление код вроде и не часто используется). нужно было явно указать ФИО.Наименование, либо в запросе делать фильтр на ссылку, а не на наименование..

Simod

36 — 09.06.15 — 06:51

Раньше было «модно» искать через НайтиПоНаименованию(), сейчас это делают через Запросы. Может пора разобраться что такое Ссылка и Объект, и как с ними работать?

hhhh

37 — 09.06.15 — 07:11

(34) ну, по-нормальному. Выбирать сотрудника из справочника, а не писать вручную фамилию.

Вася Чез

38 — 09.06.15 — 07:31

(37) может это особенность нетленки ТС — заполнять ТЧ вручную, хз правда зачем

azt-yur

39 — 09.06.15 — 07:47

У тебя уже ссылка на справочник имеется. Зачем писать целую функцию для получения даты рождения, да еще и с запросом к этому же справочнику?

Не проще ли

ДатаРождения = СтрокаТабличнойЧасти.ФИО.ДатаРождения;

katc

40 — 09.06.15 — 08:47

Выборка и пустой может быть.

Если ВыборкаДетальныеЗаписи.Следующий()= Истина Тогда
    
    ДатаРождения = ВыборкаДетальныеЗаписи.ДатаРождения;
КонецЕсли;

ДенисЧ

41 — 09.06.15 — 08:50

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

три года. Без конфискации.

katc

42 — 09.06.15 — 09:18

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

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

katc

43 — 09.06.15 — 09:21

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

Ну а теперь расскажи за что в этом случае меня надо на 3 года?

Чем конструкция Пока Выборка.Следующий() Цикл
отличается от Если Выборка.Следующий() Тогда
  

Krolik Bezobraznik

44 — 09.06.15 — 09:29

Чудес не бывает.

Перемудрил с типами значений передаваемых параметров.

Ваш запрос ничего не возвращает. Далее у вас стоит процедура получения значения строки. Строк у вас нет, а вы упорно даете указание чтобы вернуть значение. Тут и проблема. ИМХО.

Используйте конструкцию с циклом. Она более корректная. Если переживаете, что ваш запрос вернет более одной строки, то возвращайте в запросе ПЕРВЫЕ 1. Если результат запроса будет пустым, то ошибок не будет и вы отладчиком увидите, если проблемы будут.

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

Содержание

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

Как в запросе 1с8 установить условие проверки периода на конец дня?

В запросе воспользуемся функцией КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ), она приведет дату к виду «23:59:59».

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

Как правильно обрабатывать значения NULL в запросе 1С8?

В запросе значения типа NULL образуются в результате соединений (ЛЕВОЕ, ПРАВОЕ), когда элементу из одной таблицы по условию не находится соответствующего элемента из другой. Значение типа NULL имею специфические особенности:

    • Cравнение значения NULL с любым другим аргументом всегда возвращает ложь. Например, если в запросе поле «Количество» возвращает NULL, то если использовать операции сравнения «<», «>», или «=» с числом 1000, то результатом всегда будет «Ложь». Даже, если сравнить с самим значением NULL, то все равно результатом будет «Ложь»:
ГДЕ
ГТД.Количество = NULL
    • Применение арифметических операций к значению типа NULL всегда возвращает NULL. Например, если в запросе к полю «Количество», которое возвращает NULL, прибавить числовое значение или отнять от него числовое значение, то будет возвращено значение NULL:
	ГТД.Количество+300 КАК Поле1
    • Для определения значения NULL используется функция конструкция «IS NULL». Чтобы получить записи со значением NULL воспользуемся следующей конструкцией:
      ГДЕ ГТД.Регистратор.Организация IS NULL 

      если нужно получить записи без NULL, тогда:

      ГДЕ НЕ ГТД.Регистратор.Организация IS NULL 
    • Для преобразования типа NULL используется функция «isNULL» или «ЕСТЬNULL». Теперь можно сравнивать с полученным значением или применять к нему арифметические операции, не боясь за конечный результат:
	ЕСТЬNULL(ГТД.Количество, 0)+300 КАК Поле1
    • Для того, чтобы в результате запроса отсечь записи, содержащие значения NULL применяются следующие конструкции: «IS NOT NULL», «NOT <поле> is NULL»:
ГДЕ
ГТД.Регистратор.Организация IS NOT NULL

или

ГДЕ
NOT ГТД.Регистратор.Организация IS NULL

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

Для этого можно использовать объект ПостроительОтчета:

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

Как посчитать возраст по дате рождения в запросе 1С8?

Использовать функцию языка запроса РАЗНОСТЬДАТ:

ВЫБРАТЬ
Сотрудники.Сотрудник,
Сотрудники.Пол,
	РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ТекДата, ГОД) КАК Возраст
ИЗ
Сотрудники КАК Сотрудники
ПОЛНОЕ СОЕДИНЕНИЕ ПриемНаРаботу КАК ПриемНаРаботу
ПО Сотрудники.Сотрудник = ПриемНаРаботу.Сотрудник
ПОЛНОЕ СОЕДИНЕНИЕ Пенсия КАК Пенсия
ПО Сотрудники.Сотрудник = Пенсия.Сотрудник

Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?

Бывает, что в консоли запрос отрабатывается нормально, но в рабочем режиме падает с ошибкой «Значение не является значением объектного типа (Сумма)». При этом отладчик показывает, что в коллекции «ВыборкаИзРезультатаЗапроса» находиться сумма со значением «Ошибка чтения значения». При отладке выдается «Ошибка чтения значения», если в функции написать так:

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

Ошибка чтения значений результата запроса, возникает из-за того, что в выборке еще не осуществлена установка на первый элемент выборки. Для этого существует метод «Следующий()» коллекции «ВыборкаИзРезультатаЗапроса». Поэтому надо писать так:

Если Выборка.Следующий() Тогда
ДоговорКонтрагента = Выборка.Наименование;
КонецЕсли;

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

С помощью Функции «ПолучитьСписокВводимыхДокументовНаОсновании» получим список документов, которые вводятся на основании заданного документа:

//  Параметры: ДокументПоиска: Тип - Метаданные объекта
Функция ПолучитьСписокВводимыхДокументовНаОсновании(ДокументПоиска) Экспорт
СписокДокументов = Новый СписокЗначений;
Для Каждого Документ Из Метаданные.Документы Цикл
Если Документ.ВводитсяНаОсновании.Содержит(ДокументПоиска) Тогда
СписокДокументов.Добавить(Документ.Имя, Документ.Синоним);
КонецЕсли;
КонецЦикла;
Возврат СписокДокументов;
КонецФункции

Теперь, на основании списка документов найдем все подчинённые заданному документу:

Функция ПолучитьПодчиненныеДокументы()	
СписокЗаполнения = ПолучитьСписокВводимыхДокументовНаОсновании(СсылкаНаОбъект.Метаданные());
ТекстЗапросаПоСтатусу = "";
Для Каждого ЭлементСписка Из СписокЗаполнения Цикл
Если НЕ ПустаяСтрока(ТекстЗапросаПоСтатусу) Тогда
ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + "
			|ОБЪЕДИНИТЬ ВСЕ
			|";
КонецЕсли;		
ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + "
		|ВЫБРАТЬ " + ?(ПустаяСтрока(ТекстЗапросаПоСтатусу), "РАЗРЕШЕННЫЕ", "") + "
		| Док.Ссылка КАК ПодчиненныйДокумент
		|ИЗ
		| Документ." + ЭлементСписка.Значение + " КАК Док
		|ГДЕ
		| Док.ДокументОснование = &парамОснование
		| И Док.Проведен
		|";
КонецЦикла;	
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("парамОснование", СсылкаНаОбъект);
Запрос.Текст = ТекстЗапросаПоСтатусу;
Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ПодчиненныйДокумент");	
КонецФункции // ПолучитьПодчиненныеДокументы()

Выведем полученные документы:

Процедура ВывестиПодчиненныеДокументы()
Массив = ПолучитьПодчиненныеДокументы();
Для каждого Эл Из Массив Цикл
Сообщить(Эл);
КонецЦикла;
КонецПроцедуры

Как выглядит недокументированный синтаксис оператора ВЫБОР?

Вот нестандартный вариант синтаксиса оператора ВЫБОР:

	ВЫБРАТЬ
ВЫБОР ДЕНЬНЕДЕЛИ(ДАТАВРЕМЯ(2015, 4, 1))
КОГДА 1
ТОГДА "Понедельник"
КОГДА 2
ТОГДА "Вторник"
КОГДА 3
ТОГДА "Среда"
КОГДА 4
ТОГДА "Четверг"
КОГДА 5
ТОГДА "Пятница"
КОГДА 6
ТОГДА "Суббота"
ИНАЧЕ "Воскресенье"
КОНЕЦ КАК ДеньНедели

В этом примере показано, как с помощью опрератора ВЫБОР выводить текстовое представление дня недели.

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

Пример запроса:

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

Особенность этого запроса в том, что мы обращаемся к табличной части «Товары». Поэтому к реквизитам документа «ЧекККМ» мы обращаемся через свойство «Ссылка». Только в этом случае мы сможем получить строки табличной части документа. Если не указать свойство «Ссылка», то появится ошибка, примерно такого вида:

{(7, 5)}: Поле не найдено «Документ.ЧекККМ.Дата»

Как запросом для документа найти все подчинённые ему документы?

Воспользуемся следующим запросом:

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

Как сравнить строки в запросе?

|  ГДЕ  (Номер ПОДОБНО &НомерНакладной)
Запрос.УстановитьПараметр("НомерНакладной", "%"+НомерНакладной+"%");

Как в запросе проверить поле на пустую ссылку?

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

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

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

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

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

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

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

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

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

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

ПОДПИСКА

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");
                Иначе
                    ОбластьОсновного.Параметры.ПроцентГод = " ";
                КонецЕсли;
            
    //Продолжить;
            КонецЦикла;

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

Я

  

undertale

21.12.20 — 09:50

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

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

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

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

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

        «ВЫБРАТЬ

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

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

        |ИЗ

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

        |ГДЕ

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

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

    

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

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

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

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

  

undertale

1 — 21.12.20 — 09:50

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

  

lEvGl

2 — 21.12.20 — 09:52

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

  

ДенисЧ

3 — 21.12.20 — 09:54

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

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

  

undertale

4 — 21.12.20 — 09:57

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

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

  

lEvGl

5 — 21.12.20 — 10:02

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

  

ДенисЧ

6 — 21.12.20 — 10:03

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

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

  

undertale

7 — 21.12.20 — 10:04

(6) хДДД

  

lEvGl

8 — 21.12.20 — 10:05

вангануть что ли
если написать

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

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

  

Kassern

9 — 21.12.20 — 10:06

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

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

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

  

undertale

10 — 21.12.20 — 10:10

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

  

undertale

11 — 21.12.20 — 10:12

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

  

undertale

12 — 21.12.20 — 10:14

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

  

Kassern

13 — 21.12.20 — 10:16

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

  

undertale

14 — 21.12.20 — 10:23

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

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

  

lEvGl

15 — 21.12.20 — 10:25

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

  

undertale

16 — 21.12.20 — 10:35

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

  

undertale

17 — 21.12.20 — 10:36

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

  

lEvGl

18 — 21.12.20 — 10:38

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

  

DrShad

19 — 21.12.20 — 10:38

Если …

  

Kassern

20 — 21.12.20 — 10:39

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

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

  

lEvGl

21 — 21.12.20 — 10:42

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

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

я делаю так

Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Для Каждого Строка Из Результат.Выгрузить() Цикл
тра та та
КонецЦикла;
КонецЕсли;

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

  

Kassern

22 — 21.12.20 — 10:50

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

  

Йохохо

23 — 21.12.20 — 10:51

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

  

hhhh

24 — 21.12.20 — 11:29

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

Таб = Запрос.Выполнить().Выгрузить();
Для Каждого Стр Из Таб Цикл

КонецЦикла;

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

  

undertale

25 — 21.12.20 — 11:38

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

  

undertale

26 — 21.12.20 — 11:39

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

  

lEvGl

27 — 21.12.20 — 11:46

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

  

undertale

28 — 21.12.20 — 12:05

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

  

undertale

29 — 21.12.20 — 12:11

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

  

Kassern

30 — 21.12.20 — 12:22

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

  

lEvGl

31 — 21.12.20 — 12:30

(29) так гучи же
>>>у него всё гучи и всё нормально работает
в чем проблема то

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

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


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

  

hhhh

32 — 21.12.20 — 12:55

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

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

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

  

undertale

33 — 21.12.20 — 14:53

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

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

  

ДенисЧ

34 — 21.12.20 — 15:03

ЗапросВредность = Новый Запрос;                                  
    ЗапросВредность.Текст =
        "ВЫБРАТЬ
        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
        |ИЗ
        |    Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
        |ГДЕ
        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
        |    И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность";
    
    ЗапросВредность.УстановитьПараметр("ДокументСсылка", ДокументПриема.Ссылка);
    ЗапросВредность.УстановитьПараметр("ВидРасчетаВредность",ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
    ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
    пока ВыборкаВредность.Следующий() Цикл
      сообщить("" + ВыборкаВредность.ВидРасчета + "   " + ВыборкаВредность.Показатель1);
    КонецЦикла;


Что выведет?

  

lEvGl

35 — 21.12.20 — 15:42

(34)было уже
>>>можешь хоть как то помочь?

можешь?

  

undertale

36 — 21.12.20 — 16:03

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

  

ДенисЧ

37 — 21.12.20 — 16:08

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

Проверь ещё

результат = ЗапросВредность.Выполнить();
сообщить("ЗАпрос пустой " + результат.Пустой());
ВыборкаВредность = результат.Выбрать();
Сообщить("В выборке " + ВыборкаВредность.Количество() + " элементов");

  

undertale

38 — 21.12.20 — 16:23

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

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

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

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

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

  

lEvGl

39 — 21.12.20 — 16:25

троль что ли

  

undertale

40 — 21.12.20 — 16:26

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

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

  

undertale

41 — 21.12.20 — 16:26

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

  

Said_We

42 — 21.12.20 — 16:28

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

  

Йохохо

43 — 21.12.20 — 16:28

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

  

undertale

44 — 21.12.20 — 16:30

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

Если ЗначениеЗаполнено(ВыборкаВредность.Показатель1) = истина тогда 
     ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1;
Иначе     
     ОбластьМакетаРаботник1.Параметры.Вредность = "0";
КонецЕсли;

  

undertale

45 — 21.12.20 — 16:32

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

  

Kassern

46 — 21.12.20 — 16:32

(44) Если ВыборкаВредность.Следующий Тогда
 ОбластьМакетаРаботник1.Параметры.Вредность = ВыборкаВредность.Показатель1;
Иначе
ОбластьМакетаРаботник1.Параметры.Вредность = "0";
КонецЕсли;

  

Kassern

47 — 21.12.20 — 16:33

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

  

lEvGl

48 — 21.12.20 — 16:33

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

  

Said_We

49 — 21.12.20 — 16:35

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

ВЫБРАТЬ

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

ИЗ 
(ВЫБРАТЬ
     &ВидРасчетаВредность как ВидРасчета
     ,0 как Показатель1

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

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

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

        ИЗ
            Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
        ГДЕ
            ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
            И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета = &ВидРасчетаВредность
) КАК ВложенныйЗапрос

Сгруппировать по
            ВложенныйЗапрос.ВидРасчета

  

undertale

50 — 21.12.20 — 16:35

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

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

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

  

sqr4

51 — 21.12.20 — 16:36

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

  

Kassern

52 — 21.12.20 — 16:36

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

  

Kassern

53 — 21.12.20 — 16:37

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

  

undertale

54 — 21.12.20 — 16:38

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

  

undertale

55 — 21.12.20 — 16:39

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

  

Said_We

56 — 21.12.20 — 16:39

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

  

Said_We

57 — 21.12.20 — 16:39

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

  

sqr4

58 — 21.12.20 — 16:39

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

  

Said_We

59 — 21.12.20 — 16:43

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

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

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

  

sqr4

60 — 21.12.20 — 16:43

  

  

Said_We

61 — 21.12.20 — 16:44

Читать:

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

  

Йохохо

62 — 21.12.20 — 16:45

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

  

undertale

63 — 21.12.20 — 16:46

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

  

undertale

64 — 21.12.20 — 16:47

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

  

Said_We

65 — 21.12.20 — 16:47

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

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

  

Йохохо

66 — 21.12.20 — 16:48

(64) — (46)(47)

  

undertale

67 — 21.12.20 — 16:49

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

  

undertale

68 — 21.12.20 — 16:50

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

  

undertale

69 — 21.12.20 — 16:55

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

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

  

undertale

70 — 21.12.20 — 16:56

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

  

yakutyan_

71 — 21.12.20 — 16:56

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

  

Said_We

72 — 21.12.20 — 16:58

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

  

undertale

73 — 21.12.20 — 16:59

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

  

undertale

74 — 21.12.20 — 17:00

(71)     ЗапросВредность = Новый Запрос;                                   
    ЗапросВредность.Текст =
        "ВЫБРАТЬ
        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета,
        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Показатель1
        |ИЗ
        |    Документ.ПриемНаРаботуВОрганизацию.ОсновныеНачисления КАК ПриемНаРаботуВОрганизациюОсновныеНачисления
        |ГДЕ
        |    ПриемНаРаботуВОрганизациюОсновныеНачисления.Ссылка = &ДокументСсылка
        |    И ПриемНаРаботуВОрганизациюОсновныеНачисления.ВидРасчета.Ссылка = &ВидРасчетаВредность";
    
    ЗапросВредность.УстановитьПараметр("ДокументСсылка", ДокументПриема.Ссылка);
    ЗапросВредность.УстановитьПараметр("ВидРасчетаВредность",ПланыВидовХарактеристик.КП_Константы.ДоплатаЗаВредность.Значение);
    ВыборкаВредность = ЗапросВредность.Выполнить().Выбрать();
    
    Если ВыборкаВредность.Следующий() Тогда
        йцу= ВыборкаВредность.Показатель1;
    иначе 
        йцу = "0";
    КонецЕсли;

  

lEvGl

75 — 21.12.20 — 17:00

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

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


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

  

lEvGl

76 — 21.12.20 — 17:02

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

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

  

Kassern

77 — 21.12.20 — 17:02

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

  

lEvGl

78 — 21.12.20 — 17:03

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

  

lEvGl

79 — 21.12.20 — 17:04

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

  

undertale

80 — 21.12.20 — 17:08

  

undertale

81 — 21.12.20 — 17:09

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

  

Kassern

82 — 21.12.20 — 17:11

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

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

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

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

ВЫБРАТЬ
    ПриемНаРаботуВОрганизацию.Ссылка КАК Ссылка,
    ЕСТЬNULL(ДоплатыЗаВредность.Количество, 0) КАК Количество
ИЗ
    Документ.ПриемНаРаботуВОрганизацию КАК ПриемНаРаботуВОрганизацию
        ЛЕВОЕ СОЕДИНЕНИЕ ДоплатыЗаВредность КАК ДоплатыЗаВредность
        ПО ПриемНаРаботуВОрганизацию.Ссылка = ДоплатыЗаВредность.Ссылка
ГДЕ
    ПриемНаРаботуВОрганизацию.Ссылка = &ДокументСсылка

  

Kassern

83 — 21.12.20 — 17:12

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

  

Kassern

84 — 21.12.20 — 17:13

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

  

undertale

85 — 21.12.20 — 17:15

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

  

undertale

86 — 21.12.20 — 17:16

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

  

sqr4

87 — 21.12.20 — 17:16

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

  

Kassern

88 — 21.12.20 — 17:17

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

  

undertale

89 — 21.12.20 — 17:17

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

  

Said_We

90 — 21.12.20 — 17:18

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

  

Kassern

91 — 21.12.20 — 17:18

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

  

undertale

92 — 21.12.20 — 17:18

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

  

Said_We

93 — 21.12.20 — 17:19

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

  

undertale

94 — 21.12.20 — 17:20

(90) 5 минут

  

undertale

95 — 21.12.20 — 17:22

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

  

Kassern

96 — 21.12.20 — 17:23

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

  

undertale

97 — 21.12.20 — 17:29

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

  

sqr4

98 — 21.12.20 — 18:01

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

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

Содержание

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

Как в запросе 1с8 установить условие проверки периода на конец дня?

В запросе воспользуемся функцией КОНЕЦПЕРИОДА(&ДатаКонец, ДЕНЬ), она приведет дату к виду «23:59:59».

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

Как правильно обрабатывать значения NULL в запросе 1С8?

В запросе значения типа NULL образуются в результате соединений (ЛЕВОЕ, ПРАВОЕ), когда элементу из одной таблицы по условию не находится соответствующего элемента из другой. Значение типа NULL имею специфические особенности:

    • Cравнение значения NULL с любым другим аргументом всегда возвращает ложь. Например, если в запросе поле «Количество» возвращает NULL, то если использовать операции сравнения «<», «>», или «=» с числом 1000, то результатом всегда будет «Ложь». Даже, если сравнить с самим значением NULL, то все равно результатом будет «Ложь»:
ГДЕ
	ГТД.Количество = NULL
    • Применение арифметических операций к значению типа NULL всегда возвращает NULL. Например, если в запросе к полю «Количество», которое возвращает NULL, прибавить числовое значение или отнять от него числовое значение, то будет возвращено значение NULL:
	ГТД.Количество+300 КАК Поле1
    • Для определения значения NULL используется функция конструкция «IS NULL». Чтобы получить записи со значением NULL воспользуемся следующей конструкцией:
      ГДЕ
      	ГТД.Регистратор.Организация IS NULL
      

      если нужно получить записи без NULL, тогда:

      ГДЕ
      	НЕ ГТД.Регистратор.Организация IS NULL
      
    • Для преобразования типа NULL используется функция «isNULL» или «ЕСТЬNULL». Теперь можно сравнивать с полученным значением или применять к нему арифметические операции, не боясь за конечный результат:
	ЕСТЬNULL(ГТД.Количество, 0)+300 КАК Поле1
    • Для того, чтобы в результате запроса отсечь записи, содержащие значения NULL применяются следующие конструкции: «IS NOT NULL», «NOT <поле> is NULL»:
ГДЕ
	ГТД.Регистратор.Организация IS NOT NULL

или

ГДЕ
	NOT ГТД.Регистратор.Организация IS NULL

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

Для этого можно использовать объект ПостроительОтчета:

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

Построитель = Новый ПостроительОтчета;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(Результат);
Построитель.Вывести(ТабДок);

ТабДок.Записать("D:mxlТаблица.mxl");

Как посчитать возраст по дате рождения в запросе 1С8?

Использовать функцию языка запроса РАЗНОСТЬДАТ:

ВЫБРАТЬ
	Сотрудники.Сотрудник,
	Сотрудники.Пол,
	РАЗНОСТЬДАТ(Сотрудники.ДатаРождения, &ТекДата, ГОД) КАК Возраст
ИЗ
	Сотрудники КАК Сотрудники
		ПОЛНОЕ СОЕДИНЕНИЕ ПриемНаРаботу КАК ПриемНаРаботу
		ПО Сотрудники.Сотрудник = ПриемНаРаботу.Сотрудник
		ПОЛНОЕ СОЕДИНЕНИЕ Пенсия КАК Пенсия
		ПО Сотрудники.Сотрудник = Пенсия.Сотрудник

Почему в результате запроса 1С8 появляется ошибка «Ошибка чтения значения» при отладке?

Бывает, что в консоли запрос отрабатывается нормально, но в рабочем режиме падает с ошибкой «Значение не является значением объектного типа (Сумма)». При этом отладчик показывает, что в коллекции «ВыборкаИзРезультатаЗапроса» находиться сумма со значением «Ошибка чтения значения». При отладке выдается «Ошибка чтения значения», если в функции написать так:

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

Ошибка чтения значений результата запроса, возникает из-за того, что в выборке еще не осуществлена установка на первый элемент выборки. Для этого существует метод «Следующий()» коллекции «ВыборкаИзРезультатаЗапроса». Поэтому надо писать так:

Если Выборка.Следующий() Тогда
   ДоговорКонтрагента = Выборка.Наименование;
КонецЕсли;

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

С помощью Функции «ПолучитьСписокВводимыхДокументовНаОсновании» получим список документов, которые вводятся на основании заданного документа:

//  Параметры: ДокументПоиска: Тип - Метаданные объекта
Функция ПолучитьСписокВводимыхДокументовНаОсновании(ДокументПоиска) Экспорт
	СписокДокументов = Новый СписокЗначений;
	Для Каждого Документ Из Метаданные.Документы Цикл
		Если Документ.ВводитсяНаОсновании.Содержит(ДокументПоиска) Тогда
			СписокДокументов.Добавить(Документ.Имя, Документ.Синоним);
		КонецЕсли;
	КонецЦикла;
	Возврат СписокДокументов;
КонецФункции

Теперь, на основании списка документов найдем все подчинённые заданному документу:

Функция ПолучитьПодчиненныеДокументы()	
	СписокЗаполнения = ПолучитьСписокВводимыхДокументовНаОсновании(СсылкаНаОбъект.Метаданные());
	ТекстЗапросаПоСтатусу = "";
	Для Каждого ЭлементСписка Из СписокЗаполнения Цикл
		Если НЕ ПустаяСтрока(ТекстЗапросаПоСтатусу) Тогда
			ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + "
			|ОБЪЕДИНИТЬ ВСЕ
			|";
		КонецЕсли;		
		ТекстЗапросаПоСтатусу = ТекстЗапросаПоСтатусу + "
		|ВЫБРАТЬ " + ?(ПустаяСтрока(ТекстЗапросаПоСтатусу), "РАЗРЕШЕННЫЕ", "") + "
		| Док.Ссылка КАК ПодчиненныйДокумент
		|ИЗ
		| Документ." + ЭлементСписка.Значение + " КАК Док
		|ГДЕ
		| Док.ДокументОснование = &парамОснование
		| И Док.Проведен
		|";
	КонецЦикла;	
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("парамОснование", СсылкаНаОбъект);
	Запрос.Текст = ТекстЗапросаПоСтатусу;
	
	Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("ПодчиненныйДокумент");	
КонецФункции // ПолучитьПодчиненныеДокументы()

Выведем полученные документы:

Процедура ВывестиПодчиненныеДокументы()
	Массив = ПолучитьПодчиненныеДокументы();
	Для каждого Эл Из Массив Цикл
		Сообщить(Эл);
	КонецЦикла;
КонецПроцедуры

Как выглядит недокументированный синтаксис оператора ВЫБОР?

Вот нестандартный вариант синтаксиса оператора ВЫБОР:

	ВЫБРАТЬ
	ВЫБОР ДЕНЬНЕДЕЛИ(ДАТАВРЕМЯ(2015, 4, 1))
		КОГДА 1
			ТОГДА "Понедельник"
		КОГДА 2
			ТОГДА "Вторник"
		КОГДА 3
			ТОГДА "Среда"
		КОГДА 4
			ТОГДА "Четверг"
		КОГДА 5
			ТОГДА "Пятница"
		КОГДА 6
			ТОГДА "Суббота"
		ИНАЧЕ "Воскресенье"
	КОНЕЦ КАК ДеньНедели

В этом примере показано, как с помощью опрератора ВЫБОР выводить текстовое представление дня недели.

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

Пример запроса:

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

Особенность этого запроса в том, что мы обращаемся к табличной части «Товары». Поэтому к реквизитам документа «ЧекККМ» мы обращаемся через свойство «Ссылка». Только в этом случае мы сможем получить строки табличной части документа. Если не указать свойство «Ссылка», то появится ошибка, примерно такого вида:

{(7, 5)}: Поле не найдено «Документ.ЧекККМ.Дата»

Как запросом для документа найти все подчинённые ему документы?

Воспользуемся следующим запросом:

Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
|	СчетФактураВыданный.Ссылка
|ИЗ
|	Документ.СчетФактураВыданный КАК СчетФактураВыданный
|ГДЕ
|	СчетФактураВыданный.ДокументОснование = &ДокументОснование";

Запрос.УстановитьПараметр("ДокументОснование",	Накладная);
РезультатЗапроса = Запрос.Выполнить();

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

Пока Выборка.Следующий() Цикл
	СФ = Выборка.Ссылка.ПолучитьОбъект();
	СФ.ДокументОснование = "";
	СФ.Записать(РежимЗаписиДокумента.Запись);
КонецЦикла;

Как сравнить строки в запросе?

|  ГДЕ  (Номер ПОДОБНО &НомерНакладной)
Запрос.УстановитьПараметр("НомерНакладной", "%"+НомерНакладной+"%");

Как в запросе проверить поле на пустую ссылку?

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

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

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

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

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

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

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

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

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

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

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

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

ПОДПИСКА

Форум консультаций по прикладным решениям и программам фирмы «1С».

Онлайн консультации, вопросы и ответы, бесплатная регистрация, личная страница, twitter и facebook каналы и многое другое ждут Вас здесь.

Зарегистрироваться ← Ваш выбор → Войти на форум

  1. Платформа 8.3 Бухгалтерия 3.0 (3.0.37.37) . Надо найти Номенклатуру по реквизиту «Артикул»
    Команда Справочники.Номенклатура.НайтаПоРеквизиту(«Артикул»,Артикул) — резульпат пустая ссылка. Справочники.Номенклатура.НайтаПоРеквизиту(«Артикул»,»11108″) — находит. В Артакул строка «11108». Делаю поиск запросом — результат тот же. Помогите!!

  2. Реклама на форуме

    Чтобы убрать:

  3. Попробуйте так
    Справочники.Номенклатура.НайтаПоРеквизиту(«Артикул»,СокрЛП(Артикул))
    Запрос то находит? Или тоже дает пустую ссылку?

  4. СокЛП пробывал и запросом тоже. Поиск на сервере. 1С:Предприятие 8.3 (8.3.5.138)

  5. Код в студию, плюс скриншот справочника и отладчика решил бы ситуацию.

  6. Согласен, код в студию….
    Имхо, на момент поиска в переменной Артикул, что-то иное, но только не искомый артикул.

  7. &НаКлиенте
    Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)

    Товар= ПоискПоАртикулю(Номенклатур);
    КонецПроцедуры

    &НаСервере
    Функция ПоискПоАртикулю(Номенклатур)

    Запрос = Новый Запрос;
    Запрос.Текст =
    «ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Артикул = &Артикул»;

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

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

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи;
    Иначе
    Сообщить(«Ненайдена номенклатура с артикулем «+Номенклатур)
    КонецЕсли;

    Возврат 0;
    КонецФункции
    В отладчеке
    Выдаёт Ссылка Ошибка чтения значения
    Номенклатур «11 016» Строка

    а если конкретно указать артикул т.е

    &НаСервере
    Функция ПоискПоАртикулю(Номенклатур)

    Запрос = Новый Запрос;
    Запрос.Текст =
    «ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Артикул = &Артикул»;
    Запрос.УстановитьПараметр(«Артикул», «11016»); //См здесь
    РезультатЗапроса = Запрос.Выполнить();

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

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи;
    Иначе
    Сообщить(«Ненайдена номенклатура с артикулем «+Номенклатур)
    КонецЕсли;

    Возврат 0;
    КонецФункции
    В отладчике
    ВыборкаДетальныеЗаписи.Ссылка 11016 Пружина подвески СправочникСсылка.Номенклатура
    т.е всё ищет

    А теперь возможно ключ к развязке. на сервере присвою полю код.
    &НаСервере
    Функция ПоискПоАртикулю(Номенклатур)

    Запрос = Новый Запрос;
    Запрос.Текст =
    «ВЫБРАТЬ
    | Номенклатура.Ссылка
    |ИЗ
    | Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    | Номенклатура.Артикул = &Артикул»;
    Номенклатур=»11016″; // Возможно отгадка

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

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

    Если ВыборкаДетальныеЗаписи.Следующий() Тогда
    Возврат ВыборкаДетальныеЗаписи;
    Иначе
    Сообщить(«Ненайдена номенклатура с артикулем «+Номенклатур)
    КонецЕсли;

    Возврат 0;
    КонецФункции

    Всё ок
    В отладчике
    ВыборкаДетальныеЗаписи.Ссылка 11016 Пружина подвески СправочникСсылка.Номенклатура

    Вывод: Дело где-то в передаче данных ч Клиента на Сервер.
    Может кто даст ссылку где прочесть про этот механизм.

  8. Да СокрЛП(Номенклатур) ставил.

  9. Вот тут
    &НаКлиенте
    …..
    Товар = ПоискПоАртикулю(Номенклатур)

    Номенклатур — какое значение?

  10. Реклама на форуме

    Чтобы убрать:

  11. Немного повангую.
    Вы открываете некий файл XLS, в котором есть некий перечень номенклатуры с артикулами. Парсите файл и из какой-то колонки дергаете ЧИСЛОВОЕ значение артикула, по которому и ищите номенклатуру. Но тут есть нюанс, в 1С по умолчанию разделитель триад (групп разрядов) числа — неразрывный пробел, что приводит к тому что число «10999» в строку транслируется как «10 999». Используйте функцию СтрЗаменить(ИсходнаяСтрока, Символы.НПП, «»)

  12. Андрей Вы телепат! Но дело в том что Это поле не числовое, а символьное и в нем пробелов не видно. Всё равно спасибо. попробую Используйте функцию СтрЗаменить(ИсходнаяСтрока, Символы.НПП.

  13. Загвоздка в том что там только числовые символы, и 1С, скорее всего, интерпретирует значение как число. Как вариант при загрузке значения из данной строки явно идентифицируйте его как строку, через «Строка()». Либо, если данные сначала загружаются в таблицу значений то у соответствующей колонки явно установите строковый тип.

  14. Спасибо Андрей. Всё получилось. Сделал как Вы советовали — поставил СтрЗаменить(ИсходнаяСтрока, Символы.НПП,»»)
    Резюме:
    Очевидно При чтении из Эксель поле с типом»символьное, где все символы числа 1С вставляет пробелы которые невидны. Решение при чтении из Экселя символьных полей всегда вставляйте «СтрЗаменить(ИсходнаяСтрока, Символы.НПП,»»)»

Похожие темы

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

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

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

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

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