Modber Сообщество
профессионалов по 1С

Что такое пакетные запросы в системе 1С:Предприятие 8?



Платформы: 1С:Предприятие 8.1
Конфигурации: 1С:Документооборот
2014-04-29
3603 
maxdzhavala
0  

Думаю все вы согласитесь с тем, что тема запросов в системе 1С:Предприятие 8 сегодня может похвастаться своей актуальностью. Именно поэтому нашу сегодняшнюю статью мы решили посвятить теме, связанной с объединением запросов, получении последних по дате документов в 1С запросе и соединением запросов. Давайте все таки начнем. 

Итак, для того, чтобы создать в системе 1С:Предприятие пакетный запрос следует использовать предложение ПОМЕСТИТЬ. Пакетный запрос подразумевают под собой сразу же несколько запросов, описанных как один большой запрос. Все они выполняются последовательно один за другим. В результате использования любого из этих запросов, их можно поместить во внутрь временной таблицы и потом обратится к ней используя для этого уже какой то другой запрос. Наверное большинство из вас спросят: в чем же плюсы этого метода?

У нас есть ответ на этот вопрос. Лично я считаю, что самым большим преимуществом этого метода является возможность помещать его результаты во внутрь так называемой временной таблицы. В ней они могут использоваться несколько раз. Более того, вам при всем этом не нужно будет несколько раз подряд выполнять один и тот же вложенный запрос, все что вам будет нужно это просто напросто выбирать данные из уже готовой таблицы. Некоторые из вас спросят: есть ли в этой методике какие то минусы. Безусловно, как и во всем в нашем мире в этой методике есть некоторые, определенные недостатки.

К самым существенным можно отнести то, что во время использования временных таблиц в пакетных запросах система может формировать в базе данных вполне реальные таблицы. Возможно некоторые спросят: так в что же здесь такого плохого? С одной стороны это хорошо. Но, с другой вы будете тратить значительную часть своего времени для того, чтобы создавать запросы, а после того, как вы их используете, вам придется уделить некоторое время еще и для того, чтобы удалить их. 

Вот, например:
ВЫБРАТЬ
    Номенклатура,
    Сумма(Количество) КАК Количество,
    Сумма(Сумма) КАК Сумма,
ПОМЕСТИТЬ ДокПриход
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары
СГРУППИРОВАТЬ ПО Номенклатура

 

В результате, после того, как вы выполните этот запрос выведется только то количество записей, которое было помещено в таблицу. Результаты при этом будут находится в той же самой таблице. Давайте сделаем подобный запрос для расходного документа. Для этого нам потребуется разделить эти два запроса с помощью символа ";". Именно он способен рассказать пользователю о том, что закончился один пакетный запрос и начинается другой.

ВЫБРАТЬ
    Номенклатура,
    Сумма(Количество) КАК Количество,
    Сумма(Сумма) КАК Сумма,
ПОМЕСТИТЬ ДокПриход
ИЗ
    Документ.ПоступлениеТоваровУслуг.Товары
СГРУППИРОВАТЬ ПО Номенклатура
;

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

;
ВЫБРАТЬ
*
ИЗ
    ДокПриход КАК ДокПриход
ПОЛНОЕ СОЕДИНЕНИЕ
    ДокРасход КАК ДокРасход
ПО  
    ДокПриход.Номенклатура = ДокРасход.Номенклатура


 

Из этого можно увидеть, что третий запрос соединяет данные из этих двух запросов.

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

ВЫБРАТЬ
    ДокПриход.Номенклатура,
    ДокРасход.Номенклатура,
    ДокПриход.Количество КАК КолПриход,
    ДокПриход.Сумма КАК СумПриход,
    ДокРасход.Количество КАК КолРасход,
    ДокРасход.Сумма КАК СумРасход
ИЗ
    ДокПриход КАК ДокПриход
ПОЛНОЕ СОЕДИНЕНИЕ
    ДокРасход КАК ДокРасход
ПО  
    ДокПриход.Номенклатура = ДокРасход.Номенклатура

 

В результате мы получим данные по приходу и расходу. Но, у нас все же осталась проблема, связанная с тем, каким образом можно было бы объединить два столбца, «Номенклатура» и «Номенклатура1»? В том случае, если брать значение из столбца «Номенклатура», то мы в итоге так и не получим значение из последней строки, ну а если же брать значение из столбца «Номенклатура1», то не получим в итоге значение из третьей строки. Для этого следует воспользоватся функцией «ЕСТЬNULL».
В итоге запрос будет иметь такой вид:

ВЫБРАТЬ
    ЕСТЬNULL(ДокПриход.Номенклатура,ДокРасход.Номенклатура) 
    КАК Номенклатура,
    ДокПриход.Количество КАК КолПриход,
    ДокПриход.Сумма КАК СумПриход,
    ДокРасход.Количество КАК КолРасход,
    ДокРасход.Сумма КАК СумРасход
ИЗ
    ДокПриход КАК ДокПриход
ПОЛНОЕ СОЕДИНЕНИЕ
    ДокРасход КАК ДокРасход
ПО  
    ДокПриход.Номенклатура = ДокРасход.Номенклатура

 

При этом может возникнуть еще одна проблема, связанная с тем, каким образом можно было бы заменить значения на числовое ноль? Для этого вам опять придется воспользоватся функцией «ЕСТЬNULL» и написать запрос:

ВЫБРАТЬ
    ЕСТЬNULL(ДокПриход.Номенклатура,ДокРасход.Номенклатура) 
    КАК Номенклатура,
    ЕСТЬNULL(ДокПриход.Количество,0) КАК КолПриход,
    ЕСТЬNULL(ДокПриход.Сумма,0) КАК СумПриход,
    ЕСТЬNULL(ДокРасход.Количество,0) КАК КолРасход,
    ЕСТЬNULL(ДокРасход.Сумма,0) КАК СумРасход
ИЗ
    ДокПриход КАК ДокПриход
ПОЛНОЕ СОЕДИНЕНИЕ
    ДокРасход КАК ДокРасход
ПО  
    ДокПриход.Номенклатура = ДокРасход.Номенклатура




Бесплатная юридическая
консультация по телефону

8 (499) 350-80-26(Москва)
8 (812) 627-15-62(Спб)

звонок бесплатный

В центре внимания

Комментарии (1)