множественный выбор и обработка элементов справочника

1. 13.01.21 14:37 Сейчас в теме
Всем доброго дня!
Имеется древняя конфа, переписанная CRM (обычные формы).
Имеется отчет, в него нужно добавить следующее:
1) Добавить на форму поле с выбором нужных подразделений (чтобы отчет формировался только по ним) - сделано
2) Если подразделения не выбраны - формировать отчет по всем.

Кусок кода с множественным выбором:

Результат = ФормаПодбора.ОткрытьМодально();
    Если Результат <> Неопределено Тогда
        Подразделение.ЗагрузитьЗначения(Результат);
    Иначе
        Спр = Справочники.Подразделения.Выбрать();
        Пока Спр.Следующий() Цикл        
            Подразделение.ЗагрузитьЗначения(Спр.Ссылка);
        КонецЦикла; 
    КонецЕсли; 
КонецПроцедуры


Кусок кода, при нажатии "Сформировать отчет":
Запрос.УстановитьПараметр("Подразделение", Подразделение);
    Если Подразделение.Количество() > 0 Тогда    
        РезультатЗапроса = Запрос.Выполнить().Выбрать();
    Иначе
        Сообщить ("Выберите подразделения!");
        Возврат;
    КонецЕсли;
Показать


Если подразделения не выбирать, то заходит в часть Иначе и выдает "Выберите подразделения"

Всем спасибо за помощь!
Найденные решения
2. soft_wind 13.01.21 15:00 Сейчас в теме
попробуйте так
Иначе
Спр = Справочники.Подразделения.Выбрать();
мПодр = Новый Массив;
Пока Спр.Следующий() Цикл
мПодр.Добавить(Спр.Ссылка);
КонецЦикла;
Подразделение.ЗагрузитьЗначения(мПодр);
КонецЕсли;

Показать
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. soft_wind 13.01.21 15:00 Сейчас в теме
попробуйте так
Иначе
Спр = Справочники.Подразделения.Выбрать();
мПодр = Новый Массив;
Пока Спр.Следующий() Цикл
мПодр.Добавить(Спр.Ссылка);
КонецЦикла;
Подразделение.ЗагрузитьЗначения(мПодр);
КонецЕсли;

Показать
3. one_strannik 13.01.21 15:10 Сейчас в теме
(2) проверил, все равно отчет не формируется, а выдает "Выберите подразделение", т. е. заходит в блок Иначе
4. FatPanzer 9 13.01.21 15:34 Сейчас в теме
(3) Ну, а что возвращаете при закрытии модальной формы?
5. one_strannik 13.01.21 15:38 Сейчас в теме
(4)
закрытии модальной формы?
Эм, если просто открывать отчет и не выбирать подразделение, то и форма не открывалась, соответственно ничего не возвращается. Если нажать на выбор подразделения, потом закрыть форму, то выбираются все подразделения.

А в задаче нужно реализовать так, что если отчет сформировали, но не выбирали подразделений - отчет формируется по всем
6. FatPanzer 9 13.01.21 15:59 Сейчас в теме
(5)
А в задаче нужно реализовать так, что если отчет сформировали, но не выбирали подразделений - отчет формируется по всем
Так это вам надо копать в сторону установки параметров к запросу, а не к модальной форме ручного выбора подразделений...
7. one_strannik 13.01.21 16:04 Сейчас в теме
(6)
а не к модальной форме ручного выбора подразделений...


параметр в запросе есть, он отрабатывает. Еще раз задача, внимание, она состоит из 2х частей:
1) Добавить на форму поле с выбором нужных подразделений (чтобы отчет формировался только по ним) - сделано
2) Если подразделения не выбраны - формировать отчет по всем.
8. FatPanzer 9 13.01.21 16:12 Сейчас в теме
(7)
2) Если подразделения не выбраны - формировать отчет по всем.
Тебе об этом и говорят - при установке параметров запроса проверять - если параметр пустой, то его просто не надо использовать!!!
|ГДЕ ВЫБОР 
|         КОГДА &Подразделение = НЕОПРЕДЕЛЕНО 
|             ТОГДА ИСТИНА 
|         ИНАЧЕ Таблица.Подразделение В(&Подразделение)
|   КОНЕЦ
или так
|ГДЕ &Подразделение = НЕОПРЕДЕЛЕНО ИЛИ Таблица.Подразделение В(&Подразделение)
и рядом
Запрос.УстановитьПараметр("Подразделение", ?(Подразделение.Количество(), Подразделение, Неопределено));
starik-2005; user1503726; +2 Ответить
9. one_strannik 13.01.21 16:33 Сейчас в теме
(8)
Идея понятна, но как переделать мой запрос все равно не доходит.

у меня кусок условия:

| ГДЕ
|    Док.Подразделение В (&Подразделение)
|;


Также, насколько я понимаю, можно проверку заполненности реализовать не в самом запросе в просто в коде, как я и пытался сделать изначально?
10. user1503726 13.01.21 16:35 Сейчас в теме
(9) в коде проверку заполнения параметра уже не модно.
А много сообщений, вопросов и предупреждений в программе это последствия увлечения компьютерными играми, пользователей оно раздражает.
16. SlavaKron 13.01.21 16:55 Сейчас в теме
(10)
коде проверку заполнения параметра уже не модно
А по-моему, проверять заполненность параметра в запросе – как раз моветон. Зачем СУБД напрягать лишними проверками.
user1503726; +1 Ответить
17. FatPanzer 9 13.01.21 16:59 Сейчас в теме
(16) Тогда остается два варианта:
1. Вместо одного отправлять два параметра в запрос. Типа &ЕстьОтборПоПодразделениям и &ОтборПоПодразделениям
2. Динамическое/программное формирование текста запроса.
user1503726; +1 Ответить
19. SlavaKron 13.01.21 17:03 Сейчас в теме
(17) Лично для себя нашёл удобным 2-й вариант в "щадящем" режиме, чтобы запрос можно было открыть в конструкторе:
Запрос = Новый Запрос(
"ВЫБРАТЬ
|	Т.Ссылка КАК Ссылка
|ИЗ
|	Документ.ПриобретениеТоваровУслуг КАК Т
|ГДЕ
|	Т.Проведен
|	И &Условие");

МассивУсловий = Новый Массив;

Если ЗначениеЗаполнено(ОтборРеквизит1) Тогда
	МассивУсловий.Добавить("Т.Реквизит1 = &Реквизит1");
	Запрос.УстановитьПараметр("Реквизит1", ОтборРеквизит1);
КонецЕсли;

Если ЗначениеЗаполнено(ОтборРеквизит2) Тогда
	МассивУсловий.Добавить("Т.Реквизит2 = &Реквизит2");
	Запрос.УстановитьПараметр("Реквизит2", ОтборРеквизит2);
КонецЕсли;

//...

Если МассивУсловий.Количество() > 0 Тогда
	Условие = СтрСоединить(МассивУсловий, " И ");
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "&Условие", Условие);
Иначе
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "И &Условие", "");
КонецЕсли;
Показать
user1503726; +1 Ответить
21. FatPanzer 9 13.01.21 17:08 Сейчас в теме
(19) Да, но проверять визуально такие тексты на корректность - издевательство над код-ревьюерами )))
20. one_strannik 13.01.21 17:04 Сейчас в теме
(16) не подскажете, как реализовать? пытался сделать, но если выбор не открывался, то реквизит Подразделение пустой (а должны быть все подразделения)
22. user868505 14.01.21 12:12 Сейчас в теме
(20) Заполняйте реквизит Подразделение при открытии отчета всеми подразделениями.
Дальше, если выбор открывается и пользователь выбирает одно подразделение - перезаписываете реквизит Подразделение.
11. FatPanzer 9 13.01.21 16:39 Сейчас в теме
(9)
можно проверку заполненности реализовать не в самом запросе в просто в коде,
Можно. Но давать советы по говнокоду я не буду. Потому что засовывать в запрос в качестве отбора все твои 100500 подразделений - это самострел для последующего увольнения.
12. user1503726 13.01.21 16:43 Сейчас в теме
Да ладно, открыли выбор подразделений, отключили отбор по владельцу и выделили весь список, в чем проблема?
Тем более что организации в запросе нет.
13. one_strannik 13.01.21 16:44 Сейчас в теме
(12) проблема в том что так стоит задача. Я условие менять не могу.
14. FatPanzer 9 13.01.21 16:46 Сейчас в теме
(13) В условии задачи даже написано ,что нельзя проверять заполнение параметров в запросе, а надо засунуть туда именно все подразделения? А еще интересует - как в задаче приказано писать: "ЛОЖЬ" или "Ложь"?
15. one_strannik 13.01.21 16:53 Сейчас в теме
(14)
ельзя проверять заполнение параметров в запросе, а надо засуну


Вы решили блеснуть своей ироничностью? полагаю, что перепутали форум. Вопросы я задаю из-за незнания каких-то моментов. И подчеркиваю, это ВОПРОСЫ, а не наезды, ирония и тд, как в Вашем случае
18. FatPanzer 9 13.01.21 17:01 Сейчас в теме
(15) Перечитал все твои сообщения. Нашел только один вопросительный знак. Дальше сплошные утверждения, подлежащие дискуссии.
Но все равно до свидания.
23. dominatorwarr 14.01.21 13:40 Сейчас в теме
На закладке "Компоновка данных" установи отбор. Если параметр будет задан, то отбор сработает, если не будет задан, то не сработает.
Прикрепленные файлы:
Оставьте свое сообщение
Вопросы с вознаграждением