Просто получение категории было здесь
http://www.1cpp.ru/forum/YaBB.pl?num=1290435272Усложняем задачу
В стандартных конфигах для Украины есть спр.КатегорииКонтрагентов подчинен спр.Контрагенты.
В карточке контрагента может быть пусто или 1 или несколько категорий.
То же и для спр.Товары/ТМЦ.
Стандартные отчеты позволяют отбирать одиночный или множественный фильтр.
Во множественном фильтре есть доп. функция "одна из" категория или "одновременно все".
Вот чудо код в отчете
Если глФильтрПоСправочнику("Контрагенты",
),
СписокПокупателей,
ТекстЗапроса,Заг,Язык,
ателям,покупцю,покупцях")=0 Тогда
Возврат;
КонецЕсли;
а вот код фунции из глобальника
// ===============================
// Отбирает товары или контрагентов в соответствии с фильтрами по их категориям.
// Если ВидСправочника - вид справочника, из которого отбираются позиции
// Отбирает все позиции номенклатуры или контрагентов такие, что:
// - если Категория.Выбран()>0, то у позиция принадлежит категории "Категория"
// - если МФКатегории.РазмерСписка()>0, то
// а) если ТипМФКатегории=1, то позиция принадлежит одной из категорий из списка "МФКатегории"
// б) если ТипМФКатегории=2, то позиция принадлежит сразу всем категориям из списка "МФКатегории"
// Помещает список отобранных позиций в список значений "Результат" и формирует заголовок для отчета "Заголовок"
Процедура ,Результат,ЗаголовокРус,ЗаголовокУкр) Экспорт
Перем НазвСправочникаКатегорий;
Перем ТекстЗапроса, Запрос;
Перем ЧислоКатегорийВСписке,ЧислоКатегорий;
Перем ПозицияСправочника;
Перем ЕстьМножественныйФильтр;
ЕстьМножественныйФильтр=0;
Если ТипМФКатегории>0 Тогда
Если МФКатегории.РазмерСписка()>0 Тогда
ЕстьМножественныйФильтр=1;
КонецЕсли;
КонецЕсли;
НазвСправочникаКатегорий = ?(ВРег(ВидСправочника)="ТМЦ","КатегорииТоваров",
?(ВРег(ВидСправочника)="КОНТРАГЕНТЫ","КатегорииКонтрагентов",
"КатегорииКонтрагентов"));
Результат.УдалитьВсе();
Заголовок = "";
Если (Категория.Выбран()>0)ИЛИ(ЕстьМножественныйФильтр=1) Тогда
ТекстЗапроса = "
|Обрабатывать НеПомеченныеНаУдаление;
|КатегорияПозиции = Справочник."+НазвСправочникаКатегорий+".ТекущийЭлемент;
|Позиция = Справочник."+НазвСправочникаКатегорий+".Владелец;
|КатегорияПоз = Справочник."+НазвСправочникаКатегорий+".Категория;
|Группировка Позиция Без Групп;
|";
Если (ЕстьМножественныйФильтр=1)И(ТипМФКатегории=2) Тогда
// одновременно все категории должны быть в списке ТипМФКатегории
ТекстЗапроса = ТекстЗапроса + "Группировка КатегорияПоз Без Групп;";
КонецЕсли;
Если (Категория.Выбран()>0) Тогда
ТекстЗапроса = ТекстЗапроса + "Условие (КатегорияПоз в Категория);";
ЗаголовокРус = ЗаголовокРус + " из категории """+ СокрЛП(Категория.Наименование)+"""";
ЗаголовокУкр = ЗаголовокУкр + " із категорії """+ СокрЛП(Категория.Наименование)+"""";
КонецЕсли;
Если (ЕстьМножественныйФильтр=1) Тогда
ТекстЗапроса = ТекстЗапроса + "Условие (КатегорияПоз в МФКатегории);";
Если ТипМФКатегории=1 Тогда
ЗаголовокРус = ЗаголовокРус + " из одной из категорий: "+МФКатегории.ВСтрокуСРазделителями();
ЗаголовокУкр = ЗаголовокУкр + " із однієї з категорій: "+МФКатегории.ВСтрокуСРазделителями();
ИначеЕсли ТипМФКатегории=2 Тогда
ЗаголовокРус = ЗаголовокРус + " одновременно из категорий: "+МФКатегории.ВСтрокуСРазделителями();
ЗаголовокУкр = ЗаголовокУкр + " одночасно із категорій: "+МФКатегории.ВСтрокуСРазделителями();
КонецЕсли;
КонецЕсли;
// выполняем запрос
Запрос = СоздатьОбъект("Запрос");
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Возврат;
КонецЕсли;
Если ЕстьМножественныйФильтр=1 Тогда
ЧислоКатегорийВСписке = МФКатегории.РазмерСписка();
КонецЕсли;
// выгружаем все отобранные товары в список
Запрос.ВНачалоВыборки();
Пока Запрос.Группировка("Позиция")>0 Цикл
Если Запрос.Позиция.Выбран()=1 Тогда
Если (ЕстьМножественныйФильтр=1)И(ТипМФКатегории=2) Тогда
// одновременно все категории должны быть в списке МФКатегории
ПозицияСправочника = Запрос.Позиция.ТекущийЭлемент();
// ячитаем число категорий
ЧислоКатегорий = 0;
Пока Запрос.Группировка("КатегорияПоз")>0 Цикл
Если Запрос.КатегорияПоз.Выбран()=1 Тогда
ЧислоКатегорий = ЧислоКатегорий + 1;
КонецЕсли;
КонецЦикла;
// все категории будут тогда и только тогда, когда число отобранных
// категорий будет не меньше размера списка МФКатегории
Если ЧислоКатегорий>=ЧислоКатегорийВСписке Тогда
Результат.ДобавитьЗначение(ПозицияСправочника.ТекущийЭлемент());
КонецЕсли;
Иначе
Результат.ДобавитьЗначение(Запрос.Позиция.ТекущийЭлемент());
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
То есть перебирается весь спр.Контрагенты на соответсвие фильтрам.
Теперь вопрос: как сие чудо переложить на скл-запрос?