Введение
При создании торговых конфигураций часто возникает необходимость проверить наличие необходимого количество товара на складе перед оформлением документов. Задача эффективно решается при помощи языка запросов, путем связи табличной части документа с таблицей остатков и дальнейшей проверкой остатков. В данном разделе мы рассмотрим некоторые тонкие моменты, которые могут подстерегать разработчика при решении данной задачи.
Проверка остатков
Запрос для получения остатков для товаров, присутствующих в табличной части, выглядит примерно так:
ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
РасходнаяНакладнаяСостав.Ссылка = &Документ
ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
РасходнаяНакладнаяСостав.Ссылка = &Документ И
(УчетНоменклатурыОстатки.КоличествоОстаток < РасходнаяНакладнаяСостав.Количество ИЛИ
УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL)
ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
Номенклатура В (
ВЫБРАТЬ Номенклатура
ИЗ Документ.РасходнаяНакладная.Состав
ГДЕ Ссылка = &Документ)) КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = РасходнаяНакладнаяСостав.Номенклатура
ГДЕ
РасходнаяНакладнаяСостав.Ссылка = &Документ И
(УчетНоменклатурыОстатки.КоличествоОстаток < РасходнаяНакладнаяСостав.Количество ИЛИ
УчетНоменклатурыОстатки.КоличествоОстаток ЕСТЬ NULL)
ВЫБРАТЬ
Состав.Номенклатура,
Состав.Количество,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
(ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
СУММА(РасходнаяНакладнаяСостав.Количество) КАК Количество
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ГДЕ РасходнаяНакладнаяСостав.Ссылка = &Документ
СГРУППИРОВАТЬ ПО РасходнаяНакладнаяСостав.Номенклатура) КАК Состав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
Номенклатура В (
ВЫБРАТЬ
Документ.РасходнаяНакладная.Состав.Номенклатура
ИЗ
Документ.РасходнаяНакладная.Состав
ГДЕ
Документ.РасходнаяНакладная.Состав.Ссылка = &Документ)
) КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = Состав.Номенклатура
ГДЕ
(УчетНоменклатурыОстатки.КоличествоОстаток < Состав.Количество
ИЛИ (УчетНоменклатурыОстатки.КоличествоОстаток) ЕСТЬ NULL )
ВЫБРАТЬ
Состав.Номенклатура,
Состав.Номенклатура.Представление КАК Представление,
Состав.Количество,
УчетНоменклатурыОстатки.КоличествоОстаток
ИЗ
(ВЫБРАТЬ
РасходнаяНакладнаяСостав.Номенклатура КАК Номенклатура,
СУММА(РасходнаяНакладнаяСостав.Количество) КАК Количество
ИЗ
Документ.РасходнаяНакладная.Состав КАК РасходнаяНакладнаяСостав
ГДЕ РасходнаяНакладнаяСостав.Ссылка = &Документ
СГРУППИРОВАТЬ ПО РасходнаяНакладнаяСостав.Номенклатура) КАК Состав
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.УчетНоменклатуры.Остатки(,
Номенклатура В (
ВЫБРАТЬ
Документ.РасходнаяНакладная.Состав.Номенклатура
ИЗ
Документ.РасходнаяНакладная.Состав
ГДЕ
Документ.РасходнаяНакладная.Состав.Ссылка = &Документ)
) КАК УчетНоменклатурыОстатки
ПО УчетНоменклатурыОстатки.Номенклатура = Состав.Номенклатура
ГДЕ
(УчетНоменклатурыОстатки.КоличествоОстаток < Состав.Количество
ИЛИ (УчетНоменклатурыОстатки.КоличествоОстаток) ЕСТЬ NULL )
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Сообщить("Обнаружены товары в недостаточном количестве:");
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Представление + ": требуется " + Строка(Выборка.Количество)
+ " остаток: " + Строка(Выборка.КоличествоОстаток));
КонецЦикла;
КонецЕсли;
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua