[РЕШЕНО] Как параметры отбора сделать не обязательными для заполнения?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Kas-tet, 2 ноя 2018.

  1. TopicStarter Overlay
    Kas-tet
    Offline

    Kas-tet Опытный в 1С

    Регистрация:
    30 сен 2016
    Сообщения:
    59
    Симпатии:
    1
    Баллы:
    29
    Отчет то я создал↓↓↓ Данные выводит как надо, осталось решить вопрос по отбору. При формировании отчета если не заполнены реквизиты, то ничего не выводит, если заполнен хоть один, то работает как надо. Вопрос как сделать так, чтобы если не заполнен ни один реквизит, то выводило все данные??

    Отчет должен формироваться на указанную пользователем дату, с возможностью отбора по материалам и складам.

    Отчет должен быть разработан БЕЗ использования СКД (системы компоновки данных).

    Примерный вид отчета:

    Материал/склад Склад №1 Склад №3
    Стулья....................10................2

    Столы.....................0.................3

    Телефоны..............20................0

    Табуретки .............5..................1

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

    Вложения:

    Последнее редактирование: 7 ноя 2018
  2. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.052
    Симпатии:
    187
    Баллы:
    104
    У Вас реквизит на форме называется "Склад". И Вы точно так же называете переменную в коде:
    Код:
    Для Каждого Склад Из Склады Цикл
    Назовите переменную как-то по-другому, чтобы имена не пересекались.
    Kas-tet нравится это.
  3. TopicStarter Overlay
    Kas-tet
    Offline

    Kas-tet Опытный в 1С

    Регистрация:
    30 сен 2016
    Сообщения:
    59
    Симпатии:
    1
    Баллы:
    29
    Спасибо!! Теперь работает, правда нашел другой косяк, на изменение даты отбор не реагирует)
  4. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.052
    Симпатии:
    187
    Баллы:
    104
    Условия в запросе, вероятно, должны соединяться не по "ИЛИ", а по "И".
    --- Объединение сообщений, 6 ноя 2018 ---
    И еще Вы Номенклатуру сравниваете с периодом.
    Код:
    ТоварыНаСкладахОстатки.Номенклатура МЕЖДУ &НачПериода И &КонПериода
    Kas-tet нравится это.
  5. TopicStarter Overlay
    Kas-tet
    Offline

    Kas-tet Опытный в 1С

    Регистрация:
    30 сен 2016
    Сообщения:
    59
    Симпатии:
    1
    Баллы:
    29
    Нашел я вроде как это сделать, только не понимаю как параметры сделать не обязательные....
    Последнее редактирование: 7 ноя 2018
  6. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.052
    Симпатии:
    187
    Баллы:
    104
    Вы чет все свои сообщения поредактировали)
    Логичнее было бы новыми сообщениями писать.

    Теперь вообще непонятно.
    Какой все-таки у Вас сейчас итоговый вариант?
    И что осталось нерешенным?
    Или все решено (как написано в заголовке темы)?
    Kas-tet нравится это.
  7. TopicStarter Overlay
    Kas-tet
    Offline

    Kas-tet Опытный в 1С

    Регистрация:
    30 сен 2016
    Сообщения:
    59
    Симпатии:
    1
    Баллы:
    29
    Все решил) Спасибо за помощь)))
    А итоговый вариант вот такой↓ и все работает
    Код:
    Процедура КнопкаСформироватьНажатие(Кнопка)
     
        Результат = ЭлементыФормы.Результат;
     
        Результат.Очистить();
        ИмяТовара= 0;
        КоличествоТовара = 0;
        НаименованиеСклада = 0;
     
        Макет = ПолучитьМакет("Макет");
        Область = Макет.ПолучитьОбласть("Шапка|Начало");
        Результат.Вывести(Область);
        Дата = ?(ЗначениеЗаполнено(Дата),Дата, ТекущаяДата());
     
        Запрос = Новый Запрос;
        Запрос.Текст =
        ("ВЫБРАТЬ
         |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
         |    ТоварыНаСкладахОстатки.Склад КАК Склад,
         |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
         |ИЗ
         |    РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата) КАК ТоварыНаСкладахОстатки
         |ИТОГИ
         |    СУММА(Остаток)
         |ПО
         |    ОБЩИЕ,
         |    Номенклатура ИЕРАРХИЯ,
         |    Склад");
    
        Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
        Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
        Запрос.УстановитьПараметр("СкладН", СкладН);
        РезультатВыборки1 = Запрос.Выполнить();
    
     
        Запрос = Новый Запрос;
        Запрос.Текст =
        ("ВЫБРАТЬ
         |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
         |    ТоварыНаСкладахОстатки.Склад КАК Склад,
         |    ТоварыНаСкладахОстатки.КоличествоОстаток КАК Остаток
         |ИЗ
         |    РегистрНакопления.ТоварыНаСкладах.Остатки(
         |            &Дата,
         |            Номенклатура = &Номенклатура
         |                ИЛИ Склад = &СкладН) КАК ТоварыНаСкладахОстатки
         |ИТОГИ
         |    СУММА(Остаток)
         |ПО
         |    ОБЩИЕ,
         |    Номенклатура ИЕРАРХИЯ,
         |    Склад");
     
        Запрос.УстановитьПараметр("Дата", КонецДня(Дата));
        Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
        Запрос.УстановитьПараметр("СкладН", СкладН);
        РезультатВыборки = Запрос.Выполнить();
     
        Склады = Новый Массив;
        РезультатВыборки =?(ЗначениеЗаполнено(Номенклатура) ИЛИ ЗначениеЗаполнено(СкладН),РезультатВыборки,РезультатВыборки1);
        ВыбСклад = РезультатВыборки.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Склад");
        Пока ВыбСклад.Следующий() Цикл
         
            Склады.Добавить(ВыбСклад.Склад);
            Область = Макет.ПолучитьОбласть("Шапка|Склад");
            Область.Параметры.НаименованиеСклада = ВыбСклад.Склад;
            Результат.Присоединить(Область);
         
        КонецЦикла;
     
        Результат.НачатьАвтогруппировкуСтрок();
     
        ВыбОбщ = РезультатВыборки.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
        Если ВыбОбщ.Следующий() Тогда
         
            ВыбНом = ВыбОбщ.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Номенклатура");
            Пока ВыбНом.Следующий() Цикл
                Область = Макет.ПолучитьОбласть("Подвал|Начало");
                Область.Параметры.ИмяТовара = ВыбНом.Номенклатура;
                Результат.Вывести(Область, ВыбНом.Уровень());
             
                ВыбЗнач = ВыбНом.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Склад", "Все");
                Для Каждого Склад Из Склады Цикл
                    Область = Макет.ПолучитьОбласть("Подвал|Склад");
                    ВыбЗнач.Сбросить();
                    Если ВыбЗнач.НайтиСледующий(Новый Структура("Склад", Склад)) Тогда
                        Область.Параметры.КоличествоТовара = ВыбЗнач.Остаток;
                    КонецЕсли;
                    Результат.Присоединить(Область);
                КонецЦикла;
            КонецЦикла;
        КонецЕсли;
     
        Результат.ЗакончитьАвтогруппировкуСтрок();
    
    КонецПроцедуры
    
    

    Вложения:

    Последнее редактирование: 8 ноя 2018

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