8.х отбор по 2 значениям в обработке

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем smrtdrv, 25 мар 2010.

  1. TopicStarter Overlay
    smrtdrv
    Offline

    smrtdrv

    Регистрация:
    25 мар 2010
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Имеется простенькая внешняя обработка для формирования отчета по документу Перемещение товаров.
    В форме выбирается период, группа номенклатуры, склад-отправитель и склад-получатель - в каждом поле ввода при выборе открывается соответствующий справочник для выбора нужного элемента.
    И склад-отправитель, и склад-получатель выбираются из одного справочника Склады.
    Модуль формы:
    Код:
    Процедура ДействияФормыОтчетСформировать(Кнопка)
    //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(Отчет)
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
    Отчет(ТабДок, ДатаКон, ДатаНач, Номенклатура, Организация, СкладОтправитель, СкладПолучатель);
    
    //}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА
    КонецПроцедуры
    
    Процедура Отчет(ТабДок, ДатаКон, ДатаНач, Номенклатура, Организация, СкладОтправитель, СкладПолучатель) Экспорт
    //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ(Отчет)
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Макет = ВнешняяОбработкаОбъект.ПолучитьМакет("Отчет");
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |    Товары.Номенклатура КАК Номенклатура,
    |    ПРЕДСТАВЛЕНИЕ(Товары.Номенклатура),
    |    СУММА(Товары.Количество) КАК Количество,
    |    СУММА(Товары.Сумма) КАК Сумма
    |ИЗ
    |    Документ.ПеремещениеТоваров.Товары КАК Товары
    |ГДЕ
    |    Товары.Ссылка.Проведен = ИСТИНА
    |    И Товары.Номенклатура В ИЕРАРХИИ(&Номенклатура)
    |    И Товары.Ссылка.СкладОтправитель В ИЕРАРХИИ(&СкладОтправитель)
    |    И Товары.Ссылка.СкладПолучатель В ИЕРАРХИИ(&СкладПолучатель)
    |    И Товары.Ссылка.Организация В ИЕРАРХИИ(&Организация)
    |    И Товары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
    |    И Товары.Ссылка.СкладОтправитель.ПометкаУдаления = ЛОЖЬ
    |    И Товары.Ссылка.СкладПолучатель.ПометкаУдаления = ЛОЖЬ
    |
    |СГРУППИРОВАТЬ ПО
    |    Товары.Номенклатура
    |
    |УПОРЯДОЧИТЬ ПО
    |    Товары.Номенклатура.Наименование
    |ИТОГИ
    |    СУММА(Количество),
    |    СУММА(Сумма)
    |ПО
    |    ОБЩИЕ,
    |    Номенклатура ИЕРАРХИЯ";
    
    Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон));
    Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Организация", Организация);
    Запрос.УстановитьПараметр("СкладОтправитель", СкладОтправитель);
    Запрос.УстановитьПараметр("СкладПолучатель", СкладПолучатель);
    
    Результат = Запрос.Выполнить();
    
    ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
    ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
    ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
    ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
    ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги");
    ОбластьНоменклатураИерархия = Макет.ПолучитьОбласть("НоменклатураИерархия");
    ОбластьНоменклатура = Макет.ПолучитьОбласть("Номенклатура");
    
    ТабДок.Очистить();
    ТабДок.Вывести(ОбластьЗаголовок);
    ТабДок.Вывести(ОбластьШапкаТаблицы);
    ТабДок.НачатьАвтогруппировкуСтрок();
    
    ВыборкаОбщийИтог = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    ВыборкаОбщийИтог.Следующий();        // Общий итог
    ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
    ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());
    
    ВыборкаНоменклатура = ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    
    Пока ВыборкаНоменклатура.Следующий() Цикл
    Если ВыборкаНоменклатура.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии Тогда
    Область = ОбластьНоменклатураИерархия;
    Иначе
    Область = ОбластьНоменклатура;
    КонецЕсли;
    
    Область.Параметры.Заполнить(ВыборкаНоменклатура);
    ТабДок.Вывести(Область, ВыборкаНоменклатура.Уровень());
    КонецЦикла;
    
    ТабДок.ЗакончитьАвтогруппировкуСтрок();
    ТабДок.Вывести(ОбластьПодвалТаблицы);
    ТабДок.Вывести(ОбластьПодвал);
    
    //}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ
    КонецПроцедуры
    
    
    
    Все прекрасно работает, но понадобилось формировать отчет, выбирая не только склад-отправитель "склад №1" или "склад№2" а сделать отбор по совокупности - доки, выписанные и со "склада№1", и со "склада№2" (что-то типа "склад№1" + "склад№2").
    Точно так же и по складу-получателю - нужна возможность отбора по 2 складам.
    Подскажите, пожалуйста, как это можно реализовать, не могу сообразить. Сколько ковырялся - ерунда получается ((
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    перед строкой
    Код:
    Макет = ВнешняяОбработкаОбъект.ПолучитьМакет("Отчет");
    
    
    нужно добавить следующие строки:
    Код:
    Склады = Новый Массив;
    Склады.Добавить(СкладОтправитель);
    Склады.Добавить(СкладПолучатель);
    
    
    В тексте запроса изменить "&СкладОтправитель" и "&Складполучатель" на "&Склады".

    Изменить условие
    Код:
    |    И Товары.Ссылка.СкладОтправитель В ИЕРАРХИИ(&СкладОтправитель)
    
    
    на

    Код:
    |    И Товары.Ссылка.СкладОтправитель В ИЕРАРХИИ(&Склады)
    
    
    Убрать условие:
    Код:
    |    И Товары.Ссылка.СкладПолучатель В ИЕРАРХИИ(&СкладПолучатель)
    
    
    , если вам нужны движения товаров с двух складо на остальные. Если необходимы движения товаров между двумя указанными складами, то это условие нужно оставить.

    Вместо
    Код:
    Запрос.УстановитьПараметр("СкладОтправитель", СкладОтправитель);
    Запрос.УстановитьПараметр("СкладПолучатель", СкладПолучатель);
    
    
    сделать просто
    Код:
    Запрос.УстановитьПараметр("Склады", Склады);
    
    
  3. TopicStarter Overlay
    smrtdrv
    Offline

    smrtdrv

    Регистрация:
    25 мар 2010
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    спасибо!
    а какие изменения при этом следует внести в форму?
    изначально склад-отправитель выбирается через поле ввода с типом значения СправочникСсылка.Склады
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Никаких. Выбрали оба склада - будет движение товаров, либо между ними, либо с них и на все остальные - зависит от условия....
    Если не выбрать склад получатель, то ничего не будет в отчете.

    Если нужно, чтобы оба склада были получателями, то нужно менять условие

    | И Товары.Ссылка.СкладПолучатель В ИЕРАРХИИ(&;СкладПолучатель)

    на

    | И Товары.Ссылка.СкладПолучатель В ИЕРАРХИИ(&Склады)

    и убрать условие

    | И Товары.Ссылка.СкладОтправитель В ИЕРАРХИИ(&Склады)
  5. TopicStarter Overlay
    smrtdrv
    Offline

    smrtdrv

    Регистрация:
    25 мар 2010
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Наверно я не совсем точно расписал что нужно.
    По складу-отправителю возможность выбрать из справочника Склады: склад№1 или склад№2 или оба эти склада вместе.
    По складу-получателю возможность выбрать из справочника Склады: склад№3 или склад№4 или оба этих склада вместе.
    Склады-отправители и получатели разные. склад №1 и№2 являются только отправителями, №3 и №4 - только получателями. Но все склады находятся в одном справочнике Склады.
    Как выбрать оба склада если в форме при выборе склада открывается справочник Склады - ну выбрал я там значение, поставилось оно в форму. Второе то значение не указать.
  6. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Вообще хорошо бы это сделать при помощи построителя отчета.
    Но если уж захотел вручную, то вот тебе обработочка для примера. См. процедуру формы "ПриОткрытии", там устанавливается тип значения.

    Если не получится - выкладывай свою обработку, поправлю чуток.

    Вложения:

  7. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    В этом случае необходимо поле ввода для складов заменить на СписокЗначений и сохранять два условия, но оба - "В (&Склады)"

    Я поддерживаю Stack_G - лучше(проще) сделать это в построителе отчета, даже в Схеме Компоновки Данных, ибо вручную

Поделиться этой страницей