Разработка и оптимизация запросов в 1С:Предприятие 8.3. Модуль 4. Использование нескольких таблиц в запросе: вложенные запросы, соединение, объединение
На данной странице задавайте вопросы по материалам и практическому заданию четвертого модуля курса «Разработка и оптимизация запросов в 1С:Предприятие 8.3».
Практические задания
К сожалению, у Вас недостаточно прав для дальнейшего просмотра.
Если Вы приобрели курс, но еще не активировали токен — пожалуйста, активируйте доступ по инструкциям, высланным на Ваш email после покупки.
Если Вы не залогинены на сайте — залогиньтесь, вернитесь на эту страницу и обновите ее.
Если Вы залогинены, у Вас активирован токен доступа, но Вы все равно видите эту запись — напишите нам на e-mail поддержки.
Комментарии / обсуждение (382):
Комментарии закрыты

Добрый день!
У меня есть два варианта запроса на выборку табличной части документов
ВЫБРАТЬ
| ПлатежноеПоручениеИсходящееРаботники.Физлицо,
| 0,
| СУММА(ВЫРАЗИТЬ(ПлатежноеПоручениеИсходящееРаботники.Сумма КАК ЧИСЛО(19, 2)))
|ИЗ
| Документ.ПлатежноеПоручениеИсходящее.Работники КАК ПлатежноеПоручениеИсходящееРаботники
|ГДЕ
| ПлатежноеПоручениеИсходящееРаботники.Ссылка.Проведен = ИСТИНА
| И НЕ ПлатежноеПоручениеИсходящееРаботники.Ссылка.детскиеПособия
и
ВЫБРАТЬ
| ПлатежноеПоручениеИсходящееРаботники.Физлицо КАК Физлицо,
| ПлатежноеПоручениеИсходящееРаботники.Сумма КАК Сумма,
| 0 КАК ПремияМежРасчет
|ПОМЕСТИТЬ ФизЛица
|ИЗ
| Документ.ПлатежноеПоручениеИсходящее.Работники КАК ПлатежноеПоручениеИсходящееРаботники
|ГДЕ
| ПлатежноеПоручениеИсходящееРаботники.Ссылка В
| (ВЫБРАТЬ
| ПлатежноеПоручение.Ссылка
| ИЗ
| Документ.ПлатежноеПоручениеИсходящее КАК ПлатежноеПоручение
| ГДЕ
| ПлатежноеПоручение.Проведен
| И НЕ ПлатежноеПоручение.детскиеПособия
| И ПлатежноеПоручение.Организация = &Организация)
Какой более верный?.
…
(текст комментария доступен только участникам Мастер-группы)
спасибо.
Это не СКД, а запрос с выводом в табличный документ . Мне необходимо вывести список сотрудников из табличной части документа (движений по регистрам он не делает поэтому по документам) Изначально я использовал фильтр вроде как
ГДЕ
Документ.ПлатежноеПоручениеИсходящее.Работники.Ссылка.ДетскиеВыплаты =ЛОЖЬ и Документ.ПлатежноеПоручениеИсходящее.Работники.Ссылка.ДатаПеречисления=&НашаДата.
Однако в выборку попадали не верные данные, поэтому я использовал тогда 2 вариант через
| ПлатежноеПоручениеИсходящееРаботники.Ссылка В
| (ВЫБРАТЬ
| ПлатежноеПоручение.Ссылка
| ИЗ
| Документ.ПлатежноеПоручениеИсходящее КАК ПлатежноеПоручение
| ГДЕ
| ПлатежноеПоручение.ДатаПеречисления = &НашаДата
| И НЕ ПлатежноеПоручение.детскиеПособия
и хотел уточнить почему такой фильтр через ссылку не работает. Но возможно тут просто не учел некоторые факторы и получил не верный результат.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день. Скажите ВНУТРЕННЕЕ соединение по ИСТИНА это и есть ДЕКАРТОВО произведение?
…
(текст комментария доступен только участникам Мастер-группы)
Приветствую!
Видеоурок. Особенность левого соединения (4-2-11)
Хочу добавить ясности:
Если при левом соединении добавить условие на поле правой таблицы….то соединение НЕ становится Внутренним, а так и остается Левым с выборкой по полю ГДЕ,
но вот результат запроса Эквивалентен внутреннему соединению таблиц.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
не получается создать вложенный запрос, выдает ошибку.
…
(текст комментария доступен только участникам Мастер-группы)
В видеоуроке «Как соединить две таблицы, если у них нет общего поля» используется полное соединение. Но почему именно оно? Ведь в в примере можно было использовать и левое, получилось бы то же самое.
…
(текст комментария доступен только участникам Мастер-группы)
РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровТовары.Цена КАК Цена,
РеализацияТоваровТовары.Сумма КАК Сумма
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
ГДЕ
(РеализацияТоваровТовары.Номенклатура, РеализацияТоваровТовары.Цена) В
(ВЫБРАТЬ
ПоступлениеТоваровТовары.Номенклатура КАК Номенклатура,
ПоступлениеТоваровТовары.Цена КАК Цена
ИЗ
Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары)
В видеоуроке указано, что должны быть сопоставлены оба столбца. Вопрос: они сопоставляются по имени, типу или порядку, в котором указаны в выражении или все вместе?
Проверил. Порядок точно влияет (ну и тип разумеется). Наименование поля нет. Переименовал номенклатуру в ТЧ поступления в товар, запрос после правки отработал нормально.
…
(текст комментария доступен только участникам Мастер-группы)
Если в условии заменить
на
то запрос не отработает. То же самое, если во вложенном запросе поменять порядок полей. Так что и порядок имеет значение.
…
(текст комментария доступен только участникам Мастер-группы)
Так и подумал. Спасибо за ответ!
Пожалуйста!
Интересного обучения!
Здравствуйте. У меня не получается открыть конструктор запроса в произвольном выражении условия. Система выдает ошибку (скриншоты во вложении), 2-ой — после нажатия кнопки «Подробно». И ключевые слова вроде В, ПОДОБНО цветом не выделяются, может это как-то связано. Как мне быть?
Еще раз здравствуйте, нашел ответ на аналогичный вопрос ниже. Скачал консоль для версии 8.2, открыл в режиме толстого клиента — все работает.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день. Запросом получаю данные из регистра бухгалтерии «Хозрасчетный».
В запросе используются ВТ — ХозрасчетныйОстаткиИОбороты, ХозрасчетныйДвиженияССубконто
Не могу понять, как получить Остаток Дт или Остаток Кт (выделено красным) на Дату оплаты (выделено черным), при этом период, счет и контрагент задается пользователем. Отчет простой, сформирован на СКД.
Задача, получить остаток задолженности по документу реализации на дату оплаты, для последующего расчета пеней по просрочке платежа.
Спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
Доброе утро. А без использования СКД эту задачу можно решить в рамках этого курса?
Досмотрел 7 модуль, 3 глава, про регистры бухгалтерии, много нового для себя почерпнул, но для решения своей задачи там ничего похожего нет. Конечно, курс СКД я приобрету, но хотелось бы до конца разобраться с этим курсом и понять, где можно обойтись чистыми запросами, а где использовать более сложные механизмы, типа СКД.
Спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
Василий, спасибо, за развернутый ответ.
Пожалуйста!
Интересного обучения!
В продолжение моей задачи. У меня получилось сделать так как Вы написали. Теперь уменя сложность в следующем. Есть контрагент, договор, реализация. И есть несколько оплат от разных дат, которые гасят задолженность.
Запросом получаю данные Дог Реал ДатаРеал ДатаОплаты:
Дог……Реал…..ДатаРеал….ДатаОплаты…………Период
N5…..N1234….04.09.19…….01.11.19…………04.09.19 — 01.11.19
N5…..N1234….04.09.19…….06.11.19…………01.11.19 — 06.11.19
N5…..N1234….04.09.19…….15.11.19…………06.11.19 — 15.11.19
Как можно получить указаные данные в столбце Период?
С получением периода в первой строке нет проблем. Проблема с пониманием, как получить периоды в строке 2 и 3. Спасибо.
Вот более наглядно. Выделенное красным, период не правильный, надо 08.11.2019 — 11.11.2019.
Соответственно и «Дни просрочки» для второй строки не правильно считаются.
…
(текст комментария доступен только участникам Мастер-группы)
Оплаты то как раз правильно соотнесены,я это уже проверил и перепроверил. Проблема в другом.
Поясню. Задача ставилась юристом для расчета пеней по просрочке платежей. Ему надо формировать расчетный период следующим образом (это для случаев нескольких оплат по документу реализации).
Отталкиваться начинаем от Срока оплаты.
1-я оплата 08.11.19
2-я оплата 11.11.19
Юрист хочет получить расчетный период:
для 1-ой оплаты 16.10.19 — 08.11.19 — это получается
для 2-ой оплаты 08.11.19 — 11.11.19 — а это нет, как получить?
Т.е. чтобы посчитать количество дней просрочки.
Другими словами, если оплата полностью гасит задолженность, то проблемы получить нужный расчетный период нет, если же оплат несколько, то возникает тупик, у меня по крайней мере, как получить нужные даты для 2-ой, 3-ей и т.д. оплаты.
…
(текст комментария доступен только участникам Мастер-группы)
Я правильно понимаю, чтобы сравнение правильно отработало, надо сначала упорядочить полученные данные по документу и потом уже выгрузить в ТЗ?
…
(текст комментария доступен только участникам Мастер-группы)
Василий, все получилось. Спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день. Подскажите пожалуйста почему так происходит. В выражении дата получается 30.11.2019 23:59:59, а по факту 30.11.2019 00:00:00.
Не помогает, даже если все обернуть в КонецДня(). Переменная все равно получается на начало дня. Соответственно и в запрос уходит параметр неправильный.
Спасибо.
Все разобрался. Одинаковые имена переменной и значения.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день, в обработке «Консоль запросов» не появляется пункт меню «Конструктор запросов» как показано в видео уроке Query-4-1-Nested-2 при нажатии правой кнопки мышки, на вкладке «Условия» в произвольном выражении в скобках выделен пробел .
…
(текст комментария доступен только участникам Мастер-группы)
У меня ссылка на скачивание только консоли запросов для управляемых форм, где мне скачать консоль запросов обычную? На сайте its.1c есть еще обработка для 8.2 , но там тоже при редактировании произвольного выражения недоступен конструктор запросов
…
(текст комментария доступен только участникам Мастер-группы)
Скачала обработку по ссылке для 8.2 выдается сообщение при открытии конструктора запросов в главном окне «Конструктор запроса доступен только в режиме толстого клиента» и не запустить даже первый конструктор в главном окне
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо, открылся конструктор запроса
…
(текст комментария доступен только участникам Мастер-группы)
Видео 12. Автоматическая подстановка соединения в конструкторе запроса. При автоматической подстановке на первом месте в левом соединении стоит табличная часть либо подчиненный справочник, а не основная таблица. Если на первое место поставить основную таблицу, результат получится таким же. Имеет ли значение, какая таблица устанавливается первой в левом соединении в запросе?
…
(текст комментария доступен только участникам Мастер-группы)
При соединении документа с его табличной частью по ссылке результат будет один и тот же вне зависимости от того, какая таблица находится в левой части. Автоподстановка в конструкторе запроса в левую часть подставляет табличную часть. Я хотел уточнить, в этом есть какой-то сакральный смысл и надо делать именно так или это просто выбор разработчиков конструктора запроса из двух равнозначных вариантов, и не важно какой из них использовать.
…
(текст комментария доступен только участникам Мастер-группы)
Практическое задание 20. Вложенный запрос по полю ПоступлениеТоваров.Склад. Есть смысл дополнительно группировать по этому полю. Будет ли при этом запрос выполняться быстрее? Т.е. вложенный запрос в таком виде:
ВЫБРАТЬ
ПоступлениеТоваров.Склад КАК Склад
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
СГРУППИРОВАТЬ ПО
ПоступлениеТоваров.Склад
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте! Пытаюсь решить учебную задачу на нумерацию строк запроса с упорядочиванием по нескольким полям. Вот текст задачи:
«Пронумеровать строки таблицы, полученной путем выборки данных из РегистраСведений Оборудование в следующем порядке: Производитель в порядке убывания числа производимых им моделей (при одинаковом числе моделей Наименование производителя в алфавитном порядке по возрастанию), Код модели (по возрастанию).
Вывод: Номер (в соответствии с заданным порядком), Производитель (Наименование), Модель.»
я сделал такой запрос
Оборудование.Производитель КАК Производитель,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Оборудование.Модель) КАК КоличествоМоделей,
Оборудование1.Модель КАК Модель,
Оборудование1.Модель.Код КАК МодельКод
ПОМЕСТИТЬ ВТ
ИЗ
РегистрСведений.Оборудование КАК Оборудование
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.Оборудование КАК Оборудование1
ПО Оборудование.Производитель = Оборудование1.Производитель
СГРУППИРОВАТЬ ПО
Оборудование.Производитель,
Оборудование1.Модель,
Оборудование1.Модель.Код
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(ВТ1.Модель) КАК Номер,
ВТ.Производитель.Наименование КАК Производитель,
ВТ.Модель
ИЗ
ВТ КАК ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ1
ПО ВТ.Модель >= ВТ1.Модель
СГРУППИРОВАТЬ ПО
ВТ.Модель,
ВТ.Производитель.Наименование,
ВТ.КоличествоМоделей,
ВТ.МодельКод
УПОРЯДОЧИТЬ ПО
ВТ.КоличествоМоделей УБЫВ,
ВТ.Производитель.Наименование,
ВТ.МодельКод
Упорядочение по заданию прошло корректно, но вот нумерация строк, так как она привязана к модели и идет по возрастанию номера модели, выстроилась неправильно
Номер Производитель Код
2 А 1232
3 А 1233
9 А 1276
5 А 1298
12 А 1401
13 А 1408
8 А 1752
4 Е 1260
11 Е 1434
16 Е 2112
15 Е 2113
1 Б 1121
7 Б 1750
14 Д 1288
10 Д 1433
6 Ц 1321
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо! К сожалению, по условиям задачи, это нужно решать запросом. Я пытался разобраться в совете человека решившего эту задачу именно запросом но пока так и не понял что же он сделал.
«oliage пишет:
С нумерацией строк запроса все ОК, 1…16 по порядку. Но внутреннее соединение «портит» порядок — «производитель по числу моделей, (внутри по алфавиту), код модели». Т.е. я пошла по пути «сначала получили правильный набор строк, потом пытаемся их пронумеровать», но тут, видимо нужно правильный набор строк получать внутри запроса с внутренним соединением :?:
Путь такой: сначала получи конечную таблицу и неважно какой там у нее порядок строк, а потом сделай внутреннее соединение так, чтобы от правой таблицы попадало в функцию запроса Количество(ПраваяТаблица.ЛюбаяКолонка) количество элементов равное порядковому номеру и как следствие месту этой строки после сортировки.
ЛеваяТаблица.КакаяТоКолонка,
Количество(ПраваяТаблица.ЛюбаяКолонка) как Номер
из ЛеваяТаблица
внутреннее соединение ПраваяТаблица
По
ЛеваяТаблица.КакаяТоКолонка <= ПраваяТаблица.КакаяТоКолонка <----- вот что делает порядковый номер и как следствие сортировку !!!
Сгруппировать по
ЛеваяТаблица.КакаяТоКолонка
Упорядочить по Номер
1 КАК Цифра,
"А" КАК Буква
ПОМЕСТИТЬ Таблица1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1,
"Б"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2,
"А"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2,
"Б"
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(Таблица11.Цифра) КАК Номер,
Таблица1.Цифра,
Таблица1.Буква
ИЗ
Таблица1 КАК Таблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица11
ПО (Таблица1.Цифра = Таблица11.Цифра И Таблица1.Буква <= Таблица11.Буква)
ИЛИ
Таблица1.Цифра > Таблица11.Цифра)
СГРУППИРОВАТЬ ПО
Таблица1.Буква,
Таблица1.Цифра
УПОРЯДОЧИТЬ ПО
Номер
По запросу выше, Левая и правая таблица это одна и та же таблица и содержит в колонке КакаяТоКолонка буквы А,Б,В,Г.
В любойКолонке, что угодно — ссылки, цифры, буквы.
Вместо ЛюбойКолонки, в функции Количество(ПраваяТаблица.ЛюбаяКолонка), может быть и КакаяТоКолонка, главное чтобы в этой колонке не было пустых значений, то есть надо чтобы было что считать.
И не надо делать так — Количество(Различные ПраваяТаблица.ЛюбаяКолонка), потому что в ЛюбойКолонке могут быть повторяющиеся значения, которые посчитаются как 1.
В момент выполнения запроса происходит следующее, запрос стоит по левой таблице на букве А и сверяет ее с буквой А правой таблицы, А<=А да, соответственно в функцию количество попадает элемент из колонки ЛюбаяКолонка правой таблицы и номер становится равен 1.
Следующим шагом запрос по левой таблице остается на А по правой таблице переходит на Б, проверяем условие А<=Б да, соответственно в функцию количество попадает элемент из колонки ЛюбаяКолонка правой таблицы и номер становится равен 2.
Следующим шагом запрос по левой таблице остается на А по правой таблице переходит на В, проверяем условие А<=В да, соответственно в функцию количество попадает элемент из колонки ЛюбаяКолонка правой таблицы и номер становится равен 3.
Следующим шагом запрос по левой таблице остается на А по правой таблице переходит на Г, проверяем условие А<=Б да, соответственно в функцию количество попадает элемент из колонки ЛюбаяКолонка, правой таблицы и номер становится равен 4.
Потом запрос по левой таблице переходит на букву Б, а по правой начинает все сначала Б<=А нет, номер остается равен 0.
Б<=Б, да, номер равен 1.
Б<=В, да, номер равен 2
Б<=Г, да, номер равен 3
Потом по левой соответственно у буквы В номер равен 2 по понятным причинам, а у Г номер становится равен 1, потому что больше Г в таблице букв нет.
Итак мы получаем А — 4, Б — 3, В — 2, Г = 1, у порядочиваем по возрастанию получаем Г,В,Б,А.
А вот если в условии запроса "ЛеваяТаблица.КакаяТоКолонка = ПраваяТаблица.КакаяТоКолонка», то после запроса получим обратную картину А — 1, Б — 2, В — 3, Г = 4 и после сортировки получаем А,Б,В,Г.
Вот такой вот метод сортировки с помощью внутреннего соединения.
Дальше есть задача круче, примерно так: отсортируйте по названию поставщика (по возрастанию) и по названию оборудования(по убыванию) которое этот поставщик продает.
Выведете всю таблицу но название поставщика только для первого элемента оборудования этого поставщика.
»
Задачу по разнонаправленной сортировке букв и цифр я решил таким образом
4 КАК Цифра,
"Г" КАК Буква
ПОМЕСТИТЬ Таблица1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2,
"Б"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
3,
"В"
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
1,
"А"
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(Таблица11.Цифра) КАК Номер,
Таблица1.Цифра
ПОМЕСТИТЬ ВТ
ИЗ
Таблица1 КАК Таблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица11
ПО Таблица1.Цифра >= Таблица11.Цифра
СГРУППИРОВАТЬ ПО
Таблица1.Цифра
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(Таблица11.Буква) КАК Номер,
Таблица1.Буква
ПОМЕСТИТЬ ВТ1
ИЗ
Таблица1 КАК Таблица1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Таблица1 КАК Таблица11
ПО Таблица1.Буква <= Таблица11.Буква
СГРУППИРОВАТЬ ПО
Таблица1.Буква
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Номер КАК Номер,
ВТ.Цифра,
ВТ1.Буква
ИЗ
ВТ КАК ВТ
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ1
ПО ВТ.Номер = ВТ1.Номер
УПОРЯДОЧИТЬ ПО
Номер
А вот с основной задачей никак. При чем, я знаю, что как минимум 231 человек до меня ее решил на том ресурсе на котором она выложена
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо Вам большое за наводку! Покопаю в этом направлении
Добрый день.
Склады.Ссылка КАК Ссылка
ИЗ
Справочник.Склады КАК Склады
ГДЕ
НЕ Склады.Ссылка В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
Поступление.Склад
ИЗ
Документ.ПоступлениеТоваров КАК Поступление)
Указание Различные ускорит процесс выборки или не имеет смысла?
Как я понимаю:
Сначала будет сформирован массив складов из Поступление где «Различные» сразу отсеивает дубликаты и получаем большую производительность, а затем уже запрос самих складов
ИЛИ я неверно понимаю механизм, и:
На скорость работы это не повлияет, а только на результат (понятно что здесь он одинаков в обоих случаях с «Различные» и без )
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день. При выполнении практического задания 20, при попытке открыть конструктор запроса при формировании условия «В» программа выдает ошибку(см. прилагаемый файл)
…
(текст комментария доступен только участникам Мастер-группы)
Добрый День!
У меня есть отчет, который написан моим предшественником и я периодически его дорабатываю. Текст запроса привожу во вложенном файле. При прохождении курса у меня возникли вопросы, помогите, пожалуйста, разобраться, вопросы общие, это не стоит рассматривать как помощь в доработке. Вопросы следующие:
— Вопрос, по сути, схож с вашим примером (крайнее видео в 4ом модуле) – почему вы сделали объединение, ведь можно было выбрать всю номенклатуру и через виртуальные таблицы соединить сначала с приходом, а потом с расходом?
Что касается моего случая:
Почему ВТ_Итоговая (там, где мы добавляем цены) сделаны через объединение, ведь можно было сделать через соединение, добавив каждый вид цены в новой ВТ соответственно добавляя по одной колонке «цена» каждый раз. Пока у меня ответ только – «дело в оптимизации и чем больше ВТ тем дольше формируется отчет». Подскажите, пожалуйста – прав ли я? И это действительно оптимальное решение?
— Почему в ВТ_Продажи и ВТ_Приход стоят параметры – «Номенклатура в ВТ_Номенклатура»? Ведь потом они все равно соединяются в ВТ_ОстаткиПродажи по номенклатуре и характеристике, а в регистре сведений Аналитика Номенклатуры присутствует вся номенклатура. Я добавил колонку остатки и не стал добавлять параметры, отчет отрабатывает правильно, то есть остатки показывает на текущую дату, а список товаров не меняется. Подскажите, пожалуйста – это правильно или нужно сделать по аналогии с «ВТ_Продажи» и «ВТ_Приход»? Если да, то почему?
…
(текст комментария доступен только участникам Мастер-группы)
день добрый, у преподавателя в ответе на практическое задание 20, можно сделать конструктор запроса, а у меня такого пункта даже нет. это на 57 секунде в решение видео с практическим 20. это зависит от версии 1с?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день! Очень часто пользователи просят, чтобы значение в интересующей колонке выходило не пустым, а «0». Можно ли как-то результат запроса с типом NULL привести к такому значению? Получается только привести к типу Строка.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
…
(текст комментария доступен только участникам Мастер-группы)
добрый день, можно ли было решить План-фактную задачу методом Соединения таблиц? использовать полное соединение и колонку товары склеить в одну через естьNull().
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
Для чего вообще нужно правое соединение, если можно поменять таблицы местами и указать левое?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день
Как сгруппировать результат объединения запросов по одному и томе же регистратору? Я результат объединения помещаю во временную таблицу и группирую по регистратору уже в ней. Может есть более простой способ? Спасибо
Здравствуйте.
Вы всё правильно делаете. Если речь идёт о группировке результата объединения, то действительно, нужно помещать результат либо во вложенный запрос, либо во временную таблицу, и затем уже группировать.
Добрый вечер
При соединении двух таблиц несколькими связями иногда задваиваються данные, в общих чертах понятно почему это происходит. Есть ли какие-нибудь рекомендации как этого можно избежать и делать правильно? И где более правильно и оптимально по производительности накладывать дополнительные условия при соединении таблиц: на закладке «Связи» или «Условия» ? Спасибо
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день.
Можно ли так связывать таблицы – второе левое соединение – и как это работает
(Т3 левое соединение к Т1 по Т2.поле = Т3.поле):
ВЫБРАТЬ ПЕРВЫЕ 100
СпрНоменклатура.Ссылка КАК Номенклатура,
ХарактеристикиНоменклатуры.Ссылка КАК ХарактеристикиНоменклатуры,
ТоварыНаСкладахОстатки.КоличествоОстаток
ИЗ
Справочник.Номенклатура КАК СпрНоменклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ПО СпрНоменклатура.Ссылка = ХарактеристикиНоменклатуры.Владелец
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
ПО (ВЫБОР ТоварыНаСкладахОстатки.Номенклатура.ВестиУчетПоХарактеристикам
КОГДА ИСТИНА
ТОГДА ХарактеристикиНоменклатуры.Ссылка = ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры
ИНАЧЕ СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
КОНЕЦ)
ГДЕ
НЕ СпрНоменклатура.ЭтоГруппа
Заранее Спасибо
…
(текст комментария доступен только участникам Мастер-группы)
Огромное спасибо, а в материалах курса рассматривается подобный пример?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
Для решения заданий использую базу Query-Homework-Template. Судя по тексту на стартовой странице это должна быть обновленная 16.01.2018 база.
В конфигурации нет справочника «Регионы». Соответственно, в справочнике «Контрагенты» нет реквизита «Регион».
А в видеоуроках используется справочник «Регионы». Я не ошиблась с базой ? Может быть где-то лежит база соответствующая той, которая используется в видеоуроках ?
ВОПРОС СНЯТ. Прочла предыдущие комментарии
…
(текст комментария доступен только участникам Мастер-группы)
По объединению таблиц:
В методическом пособии описана работа, если в одной таблице получаем таблицу, и когда в другой её нет, то пользуемся ПУСТАЯТАБЛИЦА. А что делать с реквизитами типа ссылка?
…
(текст комментария доступен только участникам Мастер-группы)
Я имела в виду:
Если в одной таблице есть поле Поставщик, а в другой нет — как прописать пустой реквизит?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
Здравствуйте.
Возникли сложности в понимании…
В конфигурации Розница 2.2, например, нужно в отчете отразить движения номенклатуры без учета оприходования и списания в оборотах. Бывает, что поставщиков у товара несколько. Как правильно отобрать какого-то одного, например, который последний поставлял? Или который поставил больше товара?
Запрос в данном случае так выглядит:
ЗакупкиТоваровОбороты.Номенклатура КАК Номенклатура,
0 КАК НачальныйОстаток,
ЗакупкиТоваровОбороты.КоличествоОборот КАК Приход,
0 КАК Расход,
0 КАК КонечныйОстаток,
ЗакупкиТоваровОбороты.СуммаОборот КАК СуммаПриход,
0 КАК СуммаРасход
ПОМЕСТИТЬ Данные
ИЗ
РегистрНакопления.ЗакупкиТоваров.Обороты(&ДатаН, &ДатаК, , ) КАК ЗакупкиТоваровОбороты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ПродажиОбороты.Номенклатура,
0,
0,
ПродажиОбороты.КоличествоОборот,
0,
0,
ПродажиОбороты.СтоимостьОборот
ИЗ
РегистрНакопления.Продажи.Обороты(&ДатаН, &ДатаК, , ) КАК ПродажиОбороты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура,
ТоварыНаСкладахОстатки.КоличествоОстаток,
0,
0,
0,
0,
0
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаН, ) КАК ТоварыНаСкладахОстатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура,
0,
0,
0,
ТоварыНаСкладахОстатки.КоличествоОстаток,
0,
0
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаК, ) КАК ТоварыНаСкладахОстатки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Данные.Номенклатура КАК Номенклатура,
СУММА(Данные.НачальныйОстаток) КАК НачальныйОстаток,
СУММА(Данные.Приход) КАК Приход,
СУММА(Данные.Расход) КАК Расход,
СУММА(Данные.КонечныйОстаток) КАК КонечныйОстаток,
СУММА(ЦеныНаНачало.Цена * Данные.НачальныйОстаток) КАК СуммаНачальныйОстаток,
СУММА(Данные.СуммаПриход) КАК СуммаПриход,
СУММА(Данные.СуммаРасход) КАК СуммаРасход,
СУММА(Данные.КонечныйОстаток * ЦеныНаКонец.Цена) КАК СуммаКонечныйОстаток,
ВложенныйЗапрос.Поставщик КАК Поставщик
ИЗ
Данные КАК Данные
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаН, ) КАК ЦеныНоменклатурыСрезПоследних) КАК ЦеныНаНачало
ПО Данные.Номенклатура = ЦеныНаНачало.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаК, ) КАК ЦеныНоменклатурыСрезПоследних) КАК ЦеныНаКонец
ПО Данные.Номенклатура = ЦеныНаКонец.Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
МАКСИМУМ(ЗакупкиТоваров.Поставщик) КАК Поставщик,
ЗакупкиТоваров.Номенклатура КАК Номенклатура
ИЗ
РегистрНакопления.ЗакупкиТоваров КАК ЗакупкиТоваров
ГДЕ
ЗакупкиТоваров.Период МЕЖДУ &ДатаН И &ДатаК
СГРУППИРОВАТЬ ПО
ЗакупкиТоваров.Номенклатура) КАК ВложенныйЗапрос
ПО Данные.Номенклатура = ВложенныйЗапрос.Номенклатура
СГРУППИРОВАТЬ ПО
Данные.Номенклатура,
ВложенныйЗапрос.Поставщик
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо вам огромное! Теперь всё стало понятно.
Добрый вечер.
У меня почему-то в конструкторе запросов (управляемое приложение) в условиях по нажатию правой кнопки мыши не предлагает открыть конструктор запросов(
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день, создал реквизит составного типа (Строка, Число), но значение в запросе не отображается, как «неопределено», более того, по отладчику оно равно 0, подскажите почему?
…
(текст комментария доступен только участникам Мастер-группы)
Я разобрался в чём причина. Если изначально поставить не составной тип данных, а «число», обновиться, а затем сделать состовной «Строка, Число» и обновиться, тогда все значения будут нулями при отладке, а не неопределено.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо.
Здравствуйте, Василий!
Подскажите, пожалуйста, как правильно в запросе посчитать итоги по данным, имеющим тип «Характеристика.ДополнительныеРеквизитыИСведения»?
В документе «ЗаказКлиента» (конфигурация КА2) есть табличная часть «ДополнительныеРеквизиты», реквизит «СуммаКредита», по которому нужно получить итоги, имеет этот самый тип.
Спасибо!
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!)))
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день! Я вроде бы снимала вопрос. Да, вот такой запрос в первом приближении дает верный результат. Задача — посмотреть, до какой даты у нас сверены данные с поставщиком (м.б. несколько договоров). У меня возник еще вопрос, как получить ссылку на документ сверки и дату начала периода? Три функции МАКСИМУМ в общем случае могут и не относиться к одному документу сверки, а мне охота в отчет вывести и ссылку на документ сверки и период сверки из этого документа.
Уроки смотрю по порядку, до 9 еще не дошла. Данный вопрос возник после просмотра данного модуля, ведь сразу же пытаешься соотнести просмотренный материал с имеющейся базой. Если далее есть нечто подобное — отвечать не надо. А за оперативный ответ — спасибо.
ВЫБРАТЬ
Контрагенты.Наименование КАК Наименование,
СверкаВзаиморасчетов.Договор КАК Договор,
МАКСИМУМ(СверкаВзаиморасчетов.КонецПериода) КАК КонецПериода
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Документ.СверкаВзаиморасчетов КАК СверкаВзаиморасчетов
ПО (СверкаВзаиморасчетов.Контрагент = Контрагенты.Ссылка)
ГДЕ
Контрагенты.Родитель = &Родитель
СГРУППИРОВАТЬ ПО
Контрагенты.Наименование,
СверкаВзаиморасчетов.Договор
УПОРЯДОЧИТЬ ПО
Наименование
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте! У меня возник вопрос по видеоуроку “Особенность левого соединения”. А как изменится запрос, если документов продажи будет много, а я хочу видеть только последний?
Здравствуйте, Василий!
На практике в КА 2 хотел применить способ объединения запросов из последнего видео в 4м модуле.
Требуется отобрать суммы платежей наличными и безналом. Получил запросами 2 таблицы, объединил. Ожидал, что в по одному и тому же заказу клиента в одной строке будут стоять 2 суммы нал и безнал, если оплата по нему проводилась по частям обоими способами. Но получил такой результат:
Период Заказ Нал Безнал
24.03.2018 15:14:18 Заказ клиента ВЮ00-002970 от 24.03.2018 14:48:37 3 800
24.03.2018 15:14:41 Заказ клиента ВЮ00-002970 от 24.03.2018 14:48:37 20 000
Если можно, подскажите, пожалуйста, что делаю не так?
Спасибо!
Текст запроса таков:
ВЫБРАТЬ
ВложенныйЗапрос.Период КАК Период,
ВложенныйЗапрос.ЗаказКлиента КАК ЗаказКлиента,
СУММА(ВложенныйЗапрос.ОплатаНаличными) КАК ОплатаНаличными,
СУММА(ВложенныйЗапрос.ОплатаБезнал) КАК ОплатаБезнал
ИЗ
(ВЫБРАТЬ
РасчетыСКлиентами.Период КАК Период,
РасчетыСКлиентами.ЗаказКлиента КАК ЗаказКлиента,
СУММА(РасчетыСКлиентами.Сумма) КАК ОплатаНаличными,
СУММА(0) КАК ОплатаБезнал
ИЗ
РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
ГДЕ
РасчетыСКлиентами.Период МЕЖДУ &Начало И &Конец
И НЕ РасчетыСКлиентами.ВидДвижения = &ВидДвижения
И РасчетыСКлиентами.ХозяйственнаяОперация = &ХозяйственнаяОперацияНал
И РасчетыСКлиентами.ФормаОплаты = &ФормаОплатыНал
СГРУППИРОВАТЬ ПО
РасчетыСКлиентами.Период,
РасчетыСКлиентами.ЗаказКлиента
ОБЪЕДИНИТЬ
ВЫБРАТЬ
РасчетыСКлиентами.Период,
РасчетыСКлиентами.ЗаказКлиента,
СУММА(0),
СУММА(РасчетыСКлиентами.Сумма)
ИЗ
РегистрНакопления.РасчетыСКлиентами КАК РасчетыСКлиентами
ГДЕ
РасчетыСКлиентами.Период МЕЖДУ &Начало И &Конец
И НЕ РасчетыСКлиентами.ВидДвижения = &ВидДвижения
И РасчетыСКлиентами.ХозяйственнаяОперация = &ХозяйственнаяОперацияБезНал
И РасчетыСКлиентами.ФормаОплаты = &ФормаОплатыБезНал
СГРУППИРОВАТЬ ПО
РасчетыСКлиентами.Период,
РасчетыСКлиентами.ЗаказКлиента) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.ЗаказКлиента,
ВложенныйЗапрос.Период
УПОРЯДОЧИТЬ ПО
Период
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо! А можно ли это как то обойти? Если да, то подскажите, пожалуйста, как?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
Здравствуйте!
Делаю 20 задание в 4 модуле
Использую консоль запросов для 8.3 (скачивал по ссылке из материалов по этому курсу)
Повторяю решение задания. Не вызывается 2й конструктор запроса как в решении. Скриншот во вложении.
При решении задания с помощью левого соединения, как в примере из этой ветке обсуждений, при выборе двух таблиц связь в консоли устанавливается автоматически и редактируется вручную. Не так удобно как в консоли в которой решение преподавателя.
Можете указать ссылку на консоль запросов которое использовалось при решении задач?
Спасибо!
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
Пробовал с консолью 8.2 в не открывался конструктор запроса. Теперь всё наладилось.
А как доработать консоль под 8.3? В методическом материале доработка приводилась, это о ней идёт речь?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо!
ВЫБРАТЬ
ПоДокументамРасчетов.Контрагент КАК Контрагент,
ПоДокументамРасчетов.ДоговорКонтрагента КАК ДоговорКонтрагента,
ПоДокументамРасчетов.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности КАК ДнейКредита,
ПоДокументамРасчетов.Регистратор КАК Документ,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток КАК ОстатокНаНачало,
ПоДокументамРасчетов.Регистратор.СуммаДокумента КАК СуммаДокумента,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК ОстатокНаКонец,
ДвиженияДенежныхСредствОбороты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов КАК ПоДокументамРасчетов
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ВзаиморасчетыСКонтрагентамиПоДокументамРасчетов.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, Авто, , ) КАК ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОбороты
ПО ПоДокументамРасчетов.ДоговорКонтрагента = ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОбороты.ДоговорКонтрагента
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДвиженияДенежныхСредств.Обороты КАК ДвиженияДенежныхСредствОбороты
ПО ПоДокументамРасчетов.ДоговорКонтрагента = ДвиженияДенежныхСредствОбороты.ДоговорКонтрагента
ГДЕ
ПоДокументамРасчетов.Контрагент В ИЕРАРХИИ(&Контрагент)
И ТИПЗНАЧЕНИЯ(ПоДокументамРасчетов.Регистратор) = ТИП(Документ.РеализацияТоваровУслуг)
И ПоДокументамРасчетов.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
СГРУППИРОВАТЬ ПО
ПоДокументамРасчетов.ДоговорКонтрагента,
ПоДокументамРасчетов.Регистратор,
ПоДокументамРасчетов.Контрагент,
ПоДокументамРасчетов.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности,
ПоДокументамРасчетов.Регистратор.СуммаДокумента,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток,
ВзаиморасчетыСКонтрагентамиПоДокументамРасчетовОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток,
ДвиженияДенежныхСредствОбороты.СуммаОборот
УПОРЯДОЧИТЬ ПО
ПоДокументамРасчетов.Контрагент.Наименование,
Документ
ИТОГИ
СУММА(ОстатокНаНачало),
СУММА(СуммаДокумента),
СУММА(ОстатокНаКонец),
СУММА(СуммаОборот)
ПО
ОБЩИЕ,
Контрагент ИЕРАРХИЯ,
ДоговорКонтрагента
Добрый день. Решаю данную задачу. Проблема как выбрать из регистра ДвиженеиДенежныхСредствОбороты суммаоборот, так что бы в итогах, выходила именно эта сумма, а то она выводится, но суммируется столько раз сколько выбирает документов.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день.
Подскажите пожалуйста как настроить конфигуратор таким образом, чтобы автоматом выводились шаблоны условий, циклов и сообщений, как в Ваших видео.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо. А то занимаюсь с 1С уже больше 10 лет, а многими полезными фишками не пользуюсь
Добрый день.
Подскажите пожалуйста, какой комбинацией клавиш переходить на процедуру, выделенную в коде?
…
(текст комментария доступен только участникам Мастер-группы)
Добрый день!
СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
ПРЕДСТАВЛЕНИЕ(СвободныеОстаткиОстатки.Номенклатура) КАК НоменклатураПредставление,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена,
СвободныеОстаткиОстатки.ВНаличииОстаток КАК ВНаличииОстаток
ИЗ
РегистрНакопления.СвободныеОстатки.Остатки(&Период, ) КАК СвободныеОстаткиОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
ПО (СвободныеОстаткиОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура)
ГДЕ
ЦеныНоменклатурыСрезПоследних.ВидЦены = &ВидЦены
И СвободныеОстаткиОстатки.Склад = &Склад
И СвободныеОстаткиОстатки.Номенклатура = &Номенклатура
В запросе не выходит ничего, по регистру накопления остаток по Номенклатуре есть, а по регистру сведений нет, ожидаемый результат: Номенклатура с остатком и пустой ценой, но в итоге строк нет вообще. Не могу разобраться.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо! Помогло!
Добрый день.
Решил задачу, немного отличающимся способом от преподавателя.
Склады.Ссылка КАК Ссылка
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
ПРАВОЕ СОЕДИНЕНИЕ Справочник.Склады КАК Склады
ПО ПоступлениеТоваров.Склад = Склады.Ссылка
ГДЕ ПоступлениеТоваров.Ссылка ЕСТЬ NULL
Верным ли будет такого рода решение ?
…
(текст комментария доступен только участникам Мастер-группы)
Ознакомился с видеоуроками модуля и хочу поделиться интересным примером на тему сравнений в запросах. Он нарушает все базовые принципы классической логики, гласящей что выражение: А или не А — всегда истинно. Я в свое время на реальной задаче весь мозг себе сломал, пока не понял причину. Итак первый простой запрос (на учебной БД):
СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
-------------------------------------
результат: 285
Теперь накладываем условие на эту выборку по контрагенту «Техника и Электроника ООО»:
СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
ГДЕ
ТоварыНаСкладахОбороты.Регистратор.Контрагент = &Контрагент
-------------------------------------
результат: 55
Наконец, накладываем отрицание этого условия, ожидая получить 285-55=230
СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
ГДЕ
Не ТоварыНаСкладахОбороты.Регистратор.Контрагент = &Контрагент
--------------------------------------
Результат: 216 !!! Куда пропали 14 штук???
Ну, погоди, машина! Сейчас я тебя поймаю! Накладываем условие, которое по правилам логики всегда истинно.
СУММА(ТоварыНаСкладахОбороты.КоличествоПриход) КАК КоличествоПриход
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(, , Регистратор, ) КАК ТоварыНаСкладахОбороты
ГДЕ
Не ТоварыНаСкладахОбороты.Регистратор.Контрагент = &Контрагент Или ТоварыНаСкладахОбороты.Регистратор.Контрагент = &Контрагент
----------------------------------------
Результат: 271. Как так???
Есть желающие объяснить этот парадокс?
…
(текст комментария доступен только участникам Мастер-группы)
Понятно, что причина в регистраторе без Контрагента. Но проблема-то сидит глубже. Хорошо, нам сказано, что сравнение Контрагент = Null всегда ложно. Обозначим это высказывание через А. По правилам логики тогда высказывание Не А — должно быть всегда истинно! А в 1С и Контрагент = Null и Не (Контрагент = Null) — всегда ложны! Есть какая-нибудь информация для чего придумана такая парадоксальная логика, приводящая к проблемам в приведенном примере?
…
(текст комментария доступен только участникам Мастер-группы)
День добрый.
В консоли запросов в редакторе произвольных выражений при выделенном пробеле по нажатию правой кнопки мыши нет пункта «Конструктор запроса». Синтаксис тоже не подсвечивается — ни операторы, ни функции, ни параметры — всё черным цветом.
И еще на закладке «Условия» нет возможности переключать вид условия с произвольного на другой. Всегда только произвольный вид.
1С запущена от имени администратора (в пользовательском ситуация аналогична).
В конфигураторе всё работает как надо, в консоли — вышеописанные проблемы.
Консоль для версии 8.3.
С версией для 8.2 нет таких проблем.
Но почему с 8.3 такое?
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос к задаче 20. На мой взгляд, в приведенном решении во вложенном запросе не хватает предложения Различные, т.к. поступлений на один и тот же склад может быть несколько.
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос по особенностям левого соединения.
Контрагенты.Ссылка КАК Ссылка,
РеализацияТоваров.Ссылка КАК Ссылка1
ИЗ
Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
ПО (РеализацияТоваров.Контрагент = Контрагенты.Ссылка)
И (РеализацияТоваров.Организация = &Организация)
//ГДЕ
// РеализацияТоваров.Организация = &Организация ИЛИ РеализацияТоваров.Организация IS NULL
Собственно вот запрос, если выполнить его таким образом, то количество элементов одно, но если убрать из условия связи отбор по организации и перенести его в блок УСЛОВИЯ и добавить проверку на NULL, то количество записей в запросе становится меньше. Чисто логически, условие отбора вроде как одно и тоже. Причем пропадают контрагенты, по которым есть как раз документы, а контрагенты, по которым нет движений выводятся. Или же при таком условии, включается внутреннее соединение по записям которые подподают под условие, а на остальные записи данное условие не распространяется ? Даже если добавить проверку на неопределено это не помогает. (База для практических заданий) Просто не понимаю почему он начинает выводить контрагентов, о которым вообще нет движений, если включается внутреннее соединение, то почему оно не распространяется и на них?
…
(текст комментария доступен только участникам Мастер-группы)
1. Спасибо за прием. Оказывается, я давно-давно его использую. Но не работала с конструктором запроса таким образом.
2. Практику сделала. Единственное отличие созданного мною запроса от решения тренера- это условие
ГДЕ
ПоступлениеТоваров.Ссылка ЕСТЬ NULL
Так же можно? результат один в один.
3. Пожелание. База для запросов Модуля 4 отличается от базы тренера — нет регионов, названия документов другие, чем в практическом задании и уроках. Все есть в демке «Управляемое приложение» (взяла эту базу с диска ИТС — из раздела разработчикам и программистам), но отличается по данным. Просто есть опыт написания запросов и вопросов не возникло, а если б я была новичок, начинающий программист?
4. Спасибо за еще один взгляд на Консоль запросов» — просто как на инструмент, который программист настраивает под свои запросы. Тоже дорабатывала сейчас во время просмотра уроков внешнюю обработку для 8.3 «ИнструментыРазработчикаКонсольЗапроса» — ну очень стала удобной она!
Спасибо.
С наступающим Новым Годом! Здоровья, Счастья, Благополучия и Процветания!
…
(текст комментария доступен только участникам Мастер-группы)
А у меня все таки возник вопрос. Когда нужно выделить через ВЫРАЗИТЬ несколько документов (обычно 2-4) как правильно это сделать?
…
(текст комментария доступен только участникам Мастер-группы)
Поняла. Спасибо.
Я просмотрел весь файл с теоретическим материалом и не нашел в нем описания языка плана запроса. Не подскажите в каком уроке это детально разбирается?
…
(текст комментария доступен только участникам Мастер-группы)
Вот как?! А я так надеялся разобраться в этом под руководством профессионалов… А для PostgreSQL есть материалы?
…
(текст комментария доступен только участникам Мастер-группы)
И последний вопрос по этой теме. А по планировщику файловой БД есть описание, или он похож на что-то?
…
(текст комментария доступен только участникам Мастер-группы)
Вопрос по порядку следования левых соединений. Имеет ли он значение? Провел ряд экспериментов в тестовой БД. Получил, скажем, что следующие 2 запроса дают одинаковый результат.
РеализацияТоваровТовары.Ссылка,
РеализацияТоваровТовары.Номенклатура,
Контрагенты.Город КАК Регион,
РеализацияТоваровТовары.Количество
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура1
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Номенклатура1.Поставщик = Контрагенты.Ссылка
ПО РеализацияТоваровТовары.Номенклатура = Номенклатура1.Ссылка
ГДЕ
РеализацияТоваровТовары.Ссылка = &Ссылка
и
РеализацияТоваровТовары.Ссылка,
РеализацияТоваровТовары.Номенклатура,
Контрагенты.Город КАК Регион,
РеализацияТоваровТовары.Количество
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура1
ПО РеализацияТоваровТовары.Номенклатура = Номенклатура1.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО (Номенклатура1.Поставщик = Контрагенты.Ссылка)
ГДЕ
РеализацияТоваровТовары.Ссылка = &Ссылка
Это, действительно, одинаковые запросы?
…
(текст комментария доступен только участникам Мастер-группы)
А с точки зрения производительности есть разница?
…
(текст комментария доступен только участникам Мастер-группы)
Попробовал получить планы для этих двух вариантов запроса. Сразу скажу, что я мало пока в них что понимаю (научиться разбираться в них — одна из моих целей этого изучения курса, надеюсь, где-то это будет подробно рассматриваться). Вот они:
T1.Ссылка,
T1.Номенклатура,
T3.Город,
T1.Количество
FROM Документ.РеализацияТоваров.Товары T1
LEFT OUTER JOIN Справочник.Номенклатура T2
ON (T1.Номенклатура = T2.Ссылка)
LEFT OUTER JOIN Справочник.Контрагенты T3
ON (T2.Поставщик = T3.Ссылка)
WHERE (T1.Ссылка = 0xB2F2001F160DE72A11E444F2378D2BEB
---------------------------------------------------
Fields:(
T1.Ссылка,
T1.Номенклатура,
T3.Город,
T1.Количество
)
_DOCUMENT38_VT53 (T1) RANGE SCAN USING INDEX (_DOCUMENT38_VT53_INTKEYIND) (1 fields)
NESTED OUTER LOOP
Справочник.Номенклатура (T2) RANGE SCAN USING INDEX (_IDRREFIDX) (1 fields)
WHERE
(T1.Номенклатура = T2.Ссылка)
NESTED OUTER LOOP
_REFERENCE19 (T3) RANGE SCAN USING INDEX (_IDRREFIDX) (1 fields)
WHERE
(T2.Поставщик = T3.Ссылка)
Statistics: RecordsScanned = 8, ParseTime = 0, ExecuteTime = 0, BuffersMemory = 33214, ResultRecords = 3, RecordSize = 247
и второй
T1.Ссылка,
T1.Номенклатура,
T3.Город,
T1.Количество
FROM Документ.РеализацияТоваров.Товары T1
LEFT OUTER JOIN Справочник.Номенклатура T2
LEFT OUTER JOIN Справочник.Контрагенты T3
ON (T2.Поставщик = T3.Ссылка)
ON (T1.Номенклатура = T2.Ссылка)
WHERE (T1.Ссылка = 0xB2F2001F160DE72A11E444F2378D2BEB
------------------------------------------------------
Fields:(
T1.Ссылка,
T1.Номенклатура,
T3.Город,
T1.Количество
)
_DOCUMENT38_VT53 (T1) RANGE SCAN USING INDEX (_DOCUMENT38_VT53_INTKEYIND) (1 fields)
NESTED OUTER LOOP BY SELECT RANGE SCAN USING INDEX (AUTOINDEX) (1 fields)
(
Fields:(
T2.Ссылка,
T3.Город
)
Справочник.Номенклатура (T2) FULL SCAN USING INDEX (_IDRREFIDX)
NESTED OUTER LOOP
_REFERENCE19 (T3) RANGE SCAN USING INDEX (_IDRREFIDX) (1 fields)
WHERE
(T2.Поставщик = T3.Ссылка)
)
WHERE
(T1.Номенклатура = T2.Ссылка)
Statistics: RecordsScanned = 10045, ParseTime = 0, ExecuteTime = 10, BuffersMemory = 33214, ResultRecords = 3, RecordSize = 247
Меня смущает колоссальная разница в количестве просмотренных записей: (8 и 10045).
…
(текст комментария доступен только участникам Мастер-группы)
Можно поподробнее прокомментировать эту ситуацию. Что за записи просматривались в этих вариантах? Ведь по этому примеру получается, что порядок соединений приводит к огромной разнице в эффективности. Более того, как я понял, второй вариант — это вариант который система автоматически применяет при разыменовании выражений. Получается она делает эту трансляцию неэффективно? В качестве БД я использовал скаченную из курса, только добавил в номенклатуру реквизит поставщик и заполнил его для двух позиций товара из реализации 000000008:
Запрос: Документ.РеализацияТоваров.Товары (Записей в результате: 0)
Ссылка Номенклатура Регион Количество
Реализация товаров 000000008 от 17.07.2014 12:00:00 Молоко 1,5% Москва 2
Реализация товаров 000000008 от 17.07.2014 12:00:00 Кефир 2,5% Санкт-Петербург 3
Реализация товаров 000000008 от 17.07.2014 12:00:00 Сметана 15% 1
…
(текст комментария доступен только участникам Мастер-группы)
Я провел тестирование проблемы на нашей реальной БД ЕРП. Сравнивал 3 запроса.
Вариант 1 (множественная ссылка через точку)
РеализацияТоваровУслугТовары.Номенклатура,
РеализацияТоваровУслугТовары.Характеристика,
РеализацияТоваровУслугТовары.Количество,
РеализацияТоваровУслугТовары.Номенклатура.Производитель.Наименование КАК Производитель
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка = &Ссылка
Вариант2 (разыменование, как это по умолчанию предлагает сделать конструктор запроса)
РеализацияТоваровУслугТовары.Номенклатура,
РеализацияТоваровУслугТовары.Характеристика,
РеализацияТоваровУслугТовары.Количество,
Производители.Наименование
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура1
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Производители КАК Производители
ПО Номенклатура1.Производитель = Производители.Ссылка
ПО РеализацияТоваровУслугТовары.Номенклатура = Номенклатура1.Ссылка
ГДЕ
РеализацияТоваровУслугТовары.Ссылка = &Ссылка
Вариант 3 (разыменование, полученное из предыдущего перестановкой соединений)
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Характеристика КАК Характеристика,
РеализацияТоваровУслугТовары.Количество КАК Количество,
Производители.Наименование КАК Наименование
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура1
ПО (РеализацияТоваровУслугТовары.Номенклатура = Номенклатура1.Ссылка)
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Производители КАК Производители
ПО (Номенклатура1.Производитель = Производители.Ссылка)
ГДЕ
РеализацияТоваровУслугТовары.Ссылка = &Ссылка
Результаты получились следующие. Варианты 1 и 3 транслировались в идентичные планы запросов и выполнялись быстрее, чем Вариант 2. Правда планы запросов выглядели совсем не так, как в БД из курса и не показывали количество просканированных записей:
-> nested loop left join (cost=0.70..162.64 rows=17 width=65) (actual time=0.045..0.657 rows=59 loops=1)
-> index scan using Документ.РеализацияТоваровУслуг.Товары_intkeyind on Документ.РеализацияТоваровУслуг.Товары t1 (cost=0.42..37.33 rows=17 width=45) (actual time=0.024..0.071 rows=59 loops=1)
index cond: ((ОбластьДанныхОсновныеДанные = 0::numeric) and (Ссылка = '\\x8b4ae8de2700f96d11e7d4cce0014713'::bytea))
-> index scan using Справочник.Номенклатураhpk on Справочник.Номенклатура t2 (cost=0.28..7.36 rows=1 width=40) (actual time=0.008..0.008 rows=1 loops=59)
index cond: ((ОбластьДанныхОсновныеДанные = 0::numeric) and (t1.Номенклатура = Ссылка))
-> index scan using Справочник.Производителиhpk on Справочник.Производители t3 (cost=0.14..0.17 rows=1 width=62) (actual time=0.003..0.003 rows=1 loops=59)
index cond: ((ОбластьДанныхОсновныеДанные = 0::numeric) and (t2.Производитель = Ссылка))
planning time: 1.517 ms
execution time: 0.961 ms
",rowsaffected=59
Получается, что порядок соединений все-таки имеет важное значение для эффективности? Т.е. второй вариант заведомо хуже третьего или это зависит от данных? Если последнее, то можно описать ситуацию, когда будет обратный эффект?
…
(текст комментария доступен только участникам Мастер-группы)
Мне хочется сформулировать некое общее правило использования того или иного порядка соединений. Скажем, так. При соединении трех транзитивно связанных таблиц, если соединение первых двух дает заведомо меньшую выборку, чем соединение второй и третьей, то лучше использовать «параллельный» порядок соединений второй и третьей таблиц к первой, в противном случае — оптимальный результат даст вложение второго и третьего соединения в соединение первого со вторым. Прав ли я?
…
(текст комментария доступен только участникам Мастер-группы)
Возник вопрос по примеру разыменования ссылочных полей из теоретических материалов курса:
РасходТовараТовары.Ссылка,
РасходТовараТовары.Товар,
РасходТовараТовары.Товар.Поставщик.Регион КАК Регион,
РасходТовараТовары.Количество
ИЗ Документ.РасходТовара.Товары КАК РасходТовараТовары
Сообщается что данный запрос развернется в:
РасходТовараТовары.Ссылка,
РасходТовараТовары.Товар,
Регионы.Ссылка КАК Регион,
РасходТовараТовары.Количество
ИЗ Документ.РасходТовара.Товары КАК РасходТовараТовары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Регионы КАК Регионы
ПО Контрагенты.Регион = Регионы.Ссылка
ПО Товары.Поставщик = Контрагенты.Ссылка
ПО РасходТовараТовары.Товар = Товары.Ссылка
На мой взгляд, здесь что-то лишнее. Ведь Регион можно уже получить как реквизит справочника Контрагенты. Зачем здесь еще выполняется соединение со справочником регионы?
…
(текст комментария доступен только участникам Мастер-группы)
Тогда у меня такой вопрос: это пример реальной трансляции исходного запроса в запрос к БД или просто код, набранный человеком?
…
(текст комментария доступен только участникам Мастер-группы)
Подскажите пожалуйста не очень понял сущности видов соединений внутреннее и внешнее,бывает ли внутреннее левое? Зачем пишут левое внутренее если оно одно? Хотел бы поподробнее узнать этот момент.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый вечер.
Не очень понял про объединить и объединить все
ВЫБРАТЬ 1
ОБЪЕДИНИТЬ
ВЫБРАТЬ 1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 1
Получим
1
1
Логично. Выбрали 1, объединяем со сл запросом, но говорим — дубли не нужны, потом объединяем с третьим, но уже можно и дубли, поэтому и появляется еще одна строка.
ВЫБРАТЬ 1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ 1
ОБЪЕДИНИТЬ
ВЫБРАТЬ 1
Тут получаем только 1. Странно. Выбрали 1, объединяем, говорим — можно и дубли, потом объединяем с третьим запросом, но уже без дублей. Но строчка одна.
…
(текст комментария доступен только участникам Мастер-группы)
Добрый вечер! У меня вопрос по видеоуроку «Видеоурок. NULL для реквизитов битой ссылки» (видео-файл «Query-4-2-Join-8»). Там показано на примере запроса, что в значениях полей битой ссылки стоит Null. Вот этот запрос:
РасходТовараТовары.Ссылка,
РасходТовараТовары.Товар.Артикул КАК Артикул,
РасходТовараТовары.Товар,
РасходТовараТовары.Количество КАК Количество
ИЗ
Документ.РасходТовара.Товары КАК РасходТовараТовары
Однако, если в отладчике запустить запрос на базе Query-Homework-Template (предварительно создав битую ссылку номенклатуры)
ПоступлениеТоваров.Ссылка КАК Ссылка
ИЗ
Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
ГДЕ
ПоступлениеТоваров.Ссылка = &Ссылка
и передать в параметр Ссылка интересующий нас документ с битой ссылкой, то в отладчике, нажимая «Вычислить выражение» можно увидеть, что в поле Артикул содержится не Null, а пустая строка. Как объяснить это противоречие?
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо за ответ! Скажите, а что все-таки содержится в полях битой ссылки на самом деле?
…
(текст комментария доступен только участникам Мастер-группы)
Здравствуйте.
В связи с тем, что стандартный отчёт из 1С(БП 2.0, обычные формы) иногда работает неправильно, поставили задачу написать отчёт как в приложенной картинке.
Посему такой вопрос : каким образом писать такие отчёты-запросы ? разбить на подзадачки и идти справа налево ? сначала найти все оплаты+суммы с параметром реализация, потом все реализации с параметром счёт, потом…
?
или это простой запрос и не надо огород городить ? существует какой-нибудь шаблон для решения таких задач ?
Спасибо.
…
(текст комментария доступен только участникам Мастер-группы)
Спасибо большое.