Имя: Пароль:
1C
1C 7.7
v7: Как получить элементы справочника принадлежащие группам из списка значений?
,
0 MathaiShung
 
04.03.16
14:24
Есть форма отчёта в которой выбранные пользователем группы справочника Номенклатура попадают в список значений этой формы.

Процедура ВыборГрупп()
    Перем КонтФормы;
    ОткрытьПодбор("Справочник.Номенклатура","ФормаСписка",КонтФормы,1);
    КонтФормы.ВыборГруппы(1);
КонецПроцедуры

Процедура ОбработкаПодбора(Элемент,КонтФормы)
    ВыбГруппы.ДобавитьЗначение(Элемент); //ВыбГруппы - идентификатор списка значений
    ВыбГруппы.ТекущаяСтрока(ВыбГруппы.РазмерСписка());
    Форма.УдалитьСтрокуТовара.Доступность(1);
    Форма.УдалитьВсеСтроки.Доступность(1);
КонецПроцедуры

Теперь нужно как-то отобрать из всего справочника только те элементы, которые принадлежат группам из Списка Значений и сами эти группы тоже, для последующей обработки этих значений процедурой Сформировать.
Что делать после перебора списка?

    Для ТекГруппа=1 По ВыбГруппы.РазмерСписка () Цикл
            ВыбГруппы.ПолучитьЗначение(ВыбГруппы.ТекущаяСтрока());

Или может вообще по-другому?
1 Kondarat
 
04.03.16
14:26
Зачем? Наложить условие в запросе?
2 MathaiShung
 
04.03.16
14:35
(1) Что зачем?
3 palpetrovich
 
04.03.16
14:38
(2) зачем перебирать список?
4 MathaiShung
 
04.03.16
14:40
Не знаю, первое, что пришло в голову, может и не надо. А как тогда?
5 HardBall
 
04.03.16
14:41
(4) Пиши запрос.
6 HardBall
 
04.03.16
14:42
(5) Попутал, это клюшки.
7 НЕА123
 
04.03.16
14:42
можно и запрос.
я бы через выбрать(), использоватьродителя().
8 palpetrovich
 
04.03.16
14:43
(6)  и че? думаешь в клюшках запросов еще не бьло? :)
9 MathaiShung
 
04.03.16
14:43
(5) Как условие прописать в запросе?
10 Kondarat
 
04.03.16
14:44
Условие Товар В ВыбГруппы
11 Davalebor
 
04.03.16
14:44
Перебор не нужен. Напиши запрос (черный) к справочнику. В нем можно в условии написать принадлежность элементов к списку состоящему из групп.
12 Масянька
 
04.03.16
14:44
(9)
    Спр.ПорядокКодов();
    Спр.ИспользоватьРодителя(ВыбЗнач);
    Спр.ВыбратьЭлементы(1);  
ВыбЗнач - указанная папка.
13 palpetrovich
 
04.03.16
14:46
(12) пятница?  :)
14 Масянька
 
04.03.16
14:47
+(12)
Пока Спр.ПолучитьЭлемент() = 1 Цикл  
// выбираешь, делаешь, что надо
КонецЦикла
15 Масянька
 
04.03.16
14:47
(13) А что - нет?
16 НЕА123
 
04.03.16
14:48
элспр.ПринадлежитГруппе(г1) или  элспр.ПринадлежитГруппе(г2) или...
17 MathaiShung
 
04.03.16
14:49
Всем спасибо, уже стало яснее... Буду пробовать.
18 HardBall
 
04.03.16
14:51
(8) Сервер положу :-)
19 palpetrovich
 
04.03.16
14:52
(17) не надо так пробовать, дяди и тети шутят, так делай

    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = "
    |Товар = Справочник.Номенклатура.ТекущийЭлемент;
    |Условие(Товар В СписокТоваровНаФорме);
    |Группировка Товар;
    |";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    Пока Запрос.Группировка(1) = 1 Цикл
        // БлаБлаБла
    КонецЦикла;
20 Mikeware
 
04.03.16
14:54
народ открывает для себя черные запросы клюшек. и это в 2016 году....
21 palpetrovich
 
04.03.16
14:54
(20) клюшки - вечны!
22 Mikeware
 
04.03.16
14:55
(21) "хрен продашь"? :-)
23 MathaiShung
 
04.03.16
19:48
(19) Так не работает - формирует пустой прайс. По-моему дело в условии - сейчас в выборку попадают только группы, а мне надо получить все элементы принадлежащие группам из Списка Значений. Как прописать такое условие?
24 Это_mike
 
04.03.16
20:21
(23) все работает. В конце концов, воспользуйтесь конструктором. Мне ,честно говоря, даже лениво запускать конфигуратор...
25 MathaiShung
 
04.03.16
20:23
(24) В конструкторе всё равно условие вручную прописывать придётся - элементарным условием тут не получится
26 MathaiShung
 
04.03.16
20:24
Сдела вот так:

      Пока Тов.ПолучитьЭлемент("Номенклатура")>0 Цикл
      Товар=Тов.ТекущийЭлемент();
      Если ВыбГруппы.Принадлежит(Товар)=1 Тогда
//И дальше процедура Сформировать...

Теперь выдаёт только группы без элементов
27 MathaiShung
 
04.03.16
20:28
(26) Сам увидел ошибку. Теперь получилось. И без всяких запросов.
28 Mikeware
 
04.03.16
20:44
(25) Оторвал задницу, дошел до компа. сделпл тупо конструктором, и дописал руками 4 строчки. на форме - три поля ввода. все работает как надо.

    Перем Запрос, ТекстЗапроса, Таб;
сз=СоздатьОбъект("СписокЗначений");
сз.ДобавитьЗначение(выбГруппа1);
сз.ДобавитьЗначение(выбГруппа2);
сз.ДобавитьЗначение(выбГруппа3);
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать1)
    |ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
    |Группировка ТекущийЭлемент Без Групп;
    |Условие(ТекущийЭлемент в сз);
    |"//}}ЗАПРОС
    ;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать1");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей ТекущийЭлемент
        Таб.ВывестиСекцию("ТекущийЭлемент");
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать1", "");
29 Злопчинский
 
05.03.16
00:50
(0) Код в (0) - "кривой", ибо помимо групп (как заявленно нужное) - могут быть подобраны элементы (это может и не приведет к ошибке, но это - "быдлокод").

Модифицируем:
Процедура ОбработкаПодбора(Элемент,КонтФормы)
   Если Элемент.ЭтоГруппа()=0 Тогда Возврат; КонецЕсли;
30 Злопчинский
 
05.03.16
00:53
(0) Код в (0) - "кривой", ибо одна группа будет внесена нескольо раз (это может и не приведет к ошибке, но это - "быдлокод").

Модифицируем:
Процедура ОбработкаПодбора(Элемент,КонтФормы)
   Если Элемент.ЭтоГруппа()=0 Тогда Возврат; КонецЕсли;
   Если ВыбГруппы.Принадлежит(Элемент)=1 Тогда Возврат; КонецЕсли;