ЗАДАЧА: необходимо реализовать механизм выгрузки Прайс-листа нашей организации (номенклатура в наличии, с актуальными ценами), с возможностью отбора по Складу.
- Возьмем обработку из предыдущей моей публикации и модифицируем под текущую задачу.
- Копируем обработку. Меняем название на ВыгрузкаПрайсаВФайл. Добавляем реквизит: Склад (Тип: СправочникСсылка.Склады)
- Разместим реквизит Склад на форме обработки.
- Доработаем Макет. В моем варианте печатная форма Прайса будет иметь такой вид. Как редактировать макет печатных форм можно посмотреть уроки в Интернете.
- Код функции ЗаполнитьТаблицуНаСервере изменим следующим образом:
Функция ЗаполнитьТаблицуНаСервере(ТабДок, Склад)
Макет = Обработки.ВыгрузкаПрайсаВФайл.ПолучитьМакет("Макет");
ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
ОбластьКатегория = Макет.ПолучитьОбласть("ОблКатегория");
ОбластьШапка = Макет.ПолучитьОбласть("ОблШапка");
ОбластьСклад = Макет.ПолучитьОбласть("ОблСклад");
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Товары.Родитель КАК Категория,
| Товары.Наименование КАК Наименование,
| ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток,0) КАК Количество,
| ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена,
| ОстаткиТоваровОстатки.Склад КАК Склад
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
|
| ПРАВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки() КАК ОстаткиТоваровОстатки
| ПО ОстаткиТоваровОстатки.Номенклатура = Товары.Ссылка
| ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = Товары.Ссылка
|
|ГДЕ
| ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток,0) > 0 И НЕ Товары.ПометкаУдаления
| И
| (НЕ &ОтборПоСкладу ИЛИ (ОстаткиТоваровОстатки.Склад = &Склад))
|
|УПОРЯДОЧИТЬ ПО
| Категория,
| Склад,
| Наименование,
| Количество
|ИТОГИ ПО
| Склад, Категория";
Запрос.УстановитьПараметр("ОтборПоСкладу", ЗначениеЗаполнено(Склад));
Запрос.УстановитьПараметр("Склад", Склад);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ОбластьЗаголовок.Параметры.Дата = Формат(ТекущаяДата(),"ДФ=dd.MM.yyyy");
ТабДок.Вывести(ОбластьЗаголовок);
Пока Выборка.Следующий() Цикл
ОбластьСклад.Параметры.Склад = "Склад " + Выборка.Склад;
ТабДок.Вывести(ОбластьСклад);
ТабДок.Вывести(ОбластьШапка);
ВыборкаКатегория = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаКатегория.Следующий() Цикл
ОбластьКатегория.Параметры.Категория = ВыборкаКатегория.Категория;
ТабДок.Вывести(ОбластьКатегория);
ВыборкаДетальныеЗаписи = ВыборкаКатегория.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ОбластьСтрока.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
ТабДок.Вывести(ОбластьСтрока)
КонецЦикла;
ТабДок.Вывести(ОбластьПодвал);
КонецЦикла;
КонецЦикла;
Возврат(ТабДок);
КонецФункции
- Обратите внимание: в функцию теперь передается второй параметр - Склад. Для этого в процедуре КнопкаВыгрузить передаем параметр Объект.Склад
//Заполним ТабДок на сервере
ЗаполнитьТаблицуНаСервере(ТабДок, Объект.Склад);
Рассмотрим детально запрос
ВЫБРАТЬ
ОстаткиТоваровОстатки.Склад КАК Склад,
Товары.Родитель КАК Категория,
Товары.Наименование КАК Наименование,
ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток,0) КАК Количество,
ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Товары
ПРАВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки() КАК ОстаткиТоваровОстатки
ПО ОстаткиТоваровОстатки.Номенклатура = Товары.Ссылка
ПО ЦеныНоменклатурыСрезПоследних.Номенклатура = Товары.Ссылка
ГДЕ
ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток,0) > 0 И НЕ Товары.ПометкаУдаления
И
(НЕ &ОтборПоСкладу ИЛИ (ОстаткиТоваровОстатки.Склад = &Склад))
УПОРЯДОЧИТЬ ПО
Категория,
Склад,
Наименование,
Количество
ИТОГИ ПО
Склад,
Категория
Нам необходимо получить список товаров, которые имеются в наличии на складах, а также наиболее актуальную цену.
- Общаемся в запросе к Соединению таблиц: Справочника "Номенклатура", виртуальной таб. СрезПоследних Регистра сведений "ЦеныНоменклатуры" и Регистру накопления - "ОстаткиТоваров". Соединяем по полю Номенклатура
Обратите внимание: таблице Справочник.Номенклатура я задала псевдоним "Товары", во избежание возникновения ошибок при исполнении запроса, поскольку название таблицы совпадает с наименованием полей регистров.
- Не задаем параметр Период для регистров, поскольку нам нужны самые "свежие" остатки товаров и цены.
- В секции ГДЕ указываем, что нас интересуют товары, имеющиеся в наличии и не помеченные на удаление.
- А также проверяем не пусто ли значение параметра Склад. В случае, если пользователь не выбрал на форме интересующий Склад, в прайс пойдет информация по всем складам.
- Сгруппируем ИТОГИ ПО Складу и Категории
- Установим параметры.
Результат запроса в консоли выглядит так:
В результирующем запросе у нас есть ИТОГИ, поэтому обходить результат будем ПоГруппировкам, а затем выберем Детальные записи.
Более подробно об этом типе обхода советую прочесть в Главе.2 книги "Язык запросов 1С: Предприятие" Е.Ю. Хрусталевой.
- В цикле мы получаем записи группировки 1-го уровня (Склад), во вложенном цикле записи группировки 2-го уровня (Категория) и в выборке детальных записей - сами строки с номенклатурой.
- Получаем Макет. Области макета. В обходах выборки заполняем параметры. И возвращаем ТабДок.
Наша обработка готова.
На первом скрине: на форме склад не был выбран, Прайс выгружен в формат PDF .
На первом скрине: результат с отбором по складу, Прайс выгружен в формат XLS.
Пробуйте, запускайте.
Успешной работы!