Что такое пакетные запросы в системе 1С:Предприятие 8?
Здравствуйте, уважаемые читатели блога SoftMaker.kz! Тема запросов очень актуальна в системе 1С:Предприятие 8, поэтому на нашем сайте не раз появлялись статьи о запросах, например об объединении запросов и о получении последних по дате документов в 1С запросе. Как вы увидите, для темы этой статьи, также актуально соединение запросов. Давайте начнем!
Для создания пакетного запроса в системы 1С:Предприятие 8 используется предложение ПОМЕСТИТЬ.
Пакетный запрос это нескольких запросов, описанных как один большой запрос. Эти запросы выполняются последовательно один за другим. Результат любого из этих запросов можно поместить во временную таблицу и обратиться к ней из другого запроса.
В чём плюсы этого метода?
Когда результаты такого запроса помещаются во временную таблицу, они могут использоваться несколько раз. При этом не нужно несколько раз выполнять один и тот же вложенный запрос, а выбирать данные из готовой таблицы.
В чём минусы этого метода?
При использовании временных таблиц в пакетных запросах система формирует в базе данных реальные таблицы. Чем это плохо? Тратится время на создание таблицы, а после исполнения запроса, на её уничтожение.
Например:
ВЫБРАТЬ Номенклатура, Сумма(Количество) КАК Количество, Сумма(Сумма) КАК Сумма, ПОМЕСТИТЬ ДокПриход ИЗ Документ.ПоступлениеТоваровУслуг.Товары СГРУППИРОВАТЬ ПО Номенклатура
Результат:
Количество |
3 |
Как видим, после выполнения этого запроса выводится лишь количество записей, помещенных во временную таблицу. Результаты находятся в той же временной таблице. Сделаем подобный запрос для расходного документа. Разделим эти два запроса символом «;». Символ «;» показывает, что закончился один пакетный запрос и начинается другой.
ВЫБРАТЬ Номенклатура, Сумма(Количество) КАК Количество, Сумма(Сумма) КАК Сумма, ПОМЕСТИТЬ ДокПриход ИЗ Документ.ПоступлениеТоваровУслуг.Товары СГРУППИРОВАТЬ ПО Номенклатура ; ВЫБРАТЬ Номенклатура, Сумма(Количество) КАК Количество, Сумма(Сумма) КАК Сумма, ПОМЕСТИТЬ ДокРасход ИЗ Документ.РеализацияТоваровУслуг.Товары СГРУППИРОВАТЬ ПО Номенклатура ; ВЫБРАТЬ * ИЗ ДокПриход КАК ДокПриход ПОЛНОЕ СОЕДИНЕНИЕ ДокРасход КАК ДокРасход ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура
Как видим, третий запрос соединяет данные из этих двух запросов. Результат:
Ссылка | Номенклатура | Количество | Цена | Сумма | Ссылка1 | Номенклатура1 | Количество1 | Цена1 | Сумма1 |
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01 | Бензин Аи-92 | 70,000 | 92,86 | 6 500,00 | Реализация ТМЗ и услуг 00000000008 от 31.08.2008 12:00:06 | Бензин Аи-92 | 15,950 | 105,42 | 1 681,45 |
Поступление ТМЗ и услуг 00000000083 от 31.05.2008 12:00:01 | Бензин Аи-93 | 70,000 | 92,86 | 6 500,00 | Реализация ТМЗ и услуг 00000000014 от 31.08.2008 12:00:19 | Бензин Аи-93 | 1,146 | 105,42 | 120,81 |
Поступление ТМЗ и услуг 00000000121 от 09.06.2008 12:00:02 | Скоросшиватель пластиковый | 50,000 | 67,00 | 3 350,00 | |||||
Реализация ТМЗ и услуг 00000000016 от 27.11.2008 12:22:03 | Модем ADSL ZyXEL | 1,000 | 7 790,00 | 7 790,00 |
Соединение полное, данные из обеих таблиц попали все. Теперь приведем запрос к более красивому виду. Отразим в результате запроса, какие суммы и количество у нас были приходными, а какие расходными. Для этого изменим текст третьего запроса.
... ; ВЫБРАТЬ ДокПриход.Номенклатура, ДокРасход.Номенклатура, ДокПриход.Количество КАК КолПриход, ДокПриход.Сумма КАК СумПриход, ДокРасход.Количество КАК КолРасход, ДокРасход.Сумма КАК СумРасход ИЗ ДокПриход КАК ДокПриход ПОЛНОЕ СОЕДИНЕНИЕ ДокРасход КАК ДокРасход ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура
Результат:
Номенклатура | Номенклатура1 | КолПриход | СумПриход | КолРасход | СумРасход |
Бензин Аи-92 | Бензин Аи-93 | 70,000 | 6 500,00 | 15,950 | 1 681,45 |
Бензин Аи-92 | Бензин Аи-93 | 70,000 | 6 500,00 | 1,146 | 120,81 |
Скоросшиватель пластиковый | 50,000 | 3 350,00 | |||
Модем ADSL ZyXEL | 1,000 | 7 790,00 |
Как видно из результата, мы получили данные по приходу и расходу. Но у нас остаётся проблема как объединить два столбца, «Номенклатура» и «Номенклатура1»? Если брать значение из столбца «Номенклатура», то не получим значение из последней строки, а если брать значение из столбца «Номенклатура1», то не получим значение из третьей строки. Для этого воспользуемся функцией «ЕСТЬNULL». Запрос будет выглядеть следующим образом:
... ; ВЫБРАТЬ ЕСТЬNULL(ДокПриход.Номенклатура,ДокРасход.Номенклатура) КАК Номенклатура, ДокПриход.Количество КАК КолПриход, ДокПриход.Сумма КАК СумПриход, ДокРасход.Количество КАК КолРасход, ДокРасход.Сумма КАК СумРасход ИЗ ДокПриход КАК ДокПриход ПОЛНОЕ СОЕДИНЕНИЕ ДокРасход КАК ДокРасход ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура
Результат:
Номенклатура | КолПриход | СумПриход | КолРасход | СумРасход |
Бензин Аи-92 | 70,000 | 6 500,00 | 15,950 | 1 681,45 |
Бензин Аи-93 | 70,000 | 6 500,00 | 1,146 | 120,81 |
Скоросшиватель пластиковый | 50,000 | 3 350,00 | ||
Модем ADSL ZyXEL | 1,000 | 7 790,00 |
Ещё одна маленькая проблема. Как замненить значения на числовое ноль? Воспользуемся опять функцией «ЕСТЬNULL» и перепишем запрос:
... ; ВЫБРАТЬ ЕСТЬNULL(ДокПриход.Номенклатура,ДокРасход.Номенклатура) КАК Номенклатура, ЕСТЬNULL(ДокПриход.Количество,0) КАК КолПриход, ЕСТЬNULL(ДокПриход.Сумма,0) КАК СумПриход, ЕСТЬNULL(ДокРасход.Количество,0) КАК КолРасход, ЕСТЬNULL(ДокРасход.Сумма,0) КАК СумРасход ИЗ ДокПриход КАК ДокПриход ПОЛНОЕ СОЕДИНЕНИЕ ДокРасход КАК ДокРасход ПО ДокПриход.Номенклатура = ДокРасход.Номенклатура
Результат:
Номенклатура | КолПриход | СумПриход | КолРасход | СумРасход |
Бензин Аи-92 | 70,000 | 6 500,00 | 15,950 | 1 681,45 |
Бензин Аи-93 | 70,000 | 6 500,00 | 1,146 | 120,81 |
Скоросшиватель пластиковый | 50,000 | 3 350,00 | 0 | 0 |
Модем ADSL ZyXEL | 0 | 0 | 1,000 | 7 790,00 |
в третьей таблице снизу, похоже ошибка:
номеклатура номенклатура1
бензин Аи-92 бензин Аи-93
по идее должно быть:
бензин Аи-92 бензин Аи-92
Спасибо за предупреждение!
спасибо большое! очень помогла Ваша статья !
Sari, пожалуйста!