Что такое пакетные запросы в системе 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

ПОДПИСКА

4 ответы
  1. аноним говорит:

    в третьей таблице снизу, похоже ошибка:
    номеклатура номенклатура1
    бензин Аи-92 бензин Аи-93
    по идее должно быть:
    бензин Аи-92 бензин Аи-92

  2. Sari говорит:

    спасибо большое! очень помогла Ваша статья !

Комментарии закрыты.