Всем привет. 1С .7.7 Торговля.
Есть Справочник Контрагенты и есть подчиненный ему справочник КатегорииКонтрагентов с реквизитом "категория" (тип: СправочникКатегории).
Выбрать запросом Контрагентов, которые являются Владельцами этих категорий я могу.
Реально ли Запросом отобрать Контрагентов которые не являются Владельцами?Т.е. у которых вообще нет катгорий?
Я в 8-ке это сделал за 5 минут.В 7-ке над этой задачей сижу уже 3 день.
Заранее Спасибо.
А попробовать в запросе выбрать Контрагент=Справочник.Контрагенты.ТекущийЭлемент и поставить условие только те у которых пустоезначение(КатегорииКонтрагентов).. может так,,?
Если сходу, то можно так:
//*******************************************
Функция КвоКатегорий(ТекКонтрагент)
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(ПроверкаКатегорий)
|КатегорииКонтрагентов = Справочник.КатегорииКонтрагентов.ТекущийЭлемент;
|Владелец = Справочник.КатегорииКонтрагентов.Владелец;
|Группировка КатегорииКонтрагентов;
|Условие(Владелец = ТекКонтрагент);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат -1;
КонецЕсли;
Если Запрос.Группировка(1) = 0 Тогда
Возврат 0;
КонецЕсли;
Возврат 1;
КонецФункции
//*******************************************
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Контрагент = Справочник.Контрагенты.ТекущийЭлемент;
|Группировка Контрагент Без групп;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Пока Запрос.Группировка(1) = 1 Цикл
Если КвоКатегорий(Запрос.Контрагент)=0 Тогда
Таб.ВывестиСекцию("Контрагенты");
КонецЕсли; // КвоКатегорий(Запрос.Контрагент)=0
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецПроцедуры
//*******************************************
Функция КвоКатегорий(ТекКонтрагент)
Перем Запрос, ТекстЗапроса, Таб;
//Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(ПроверкаКатегорий)
|КатегорииКонтрагентов = Справочник.КатегорииКонтрагентов.ТекущийЭлемент;
|Владелец = Справочник.КатегорииКонтрагентов.Владелец;
|Группировка КатегорииКонтрагентов;
|Условие(Владелец = ТекКонтрагент);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат -1;
КонецЕсли;
Если Запрос.Группировка(1) = 0 Тогда
Возврат 0;
КонецЕсли;
Возврат 1;
КонецФункции
//*******************************************
Процедура Сформировать()
Перем Запрос, ТекстЗапроса, Таб;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Контрагент = Справочник.Контрагенты.ТекущийЭлемент;
|Группировка Контрагент Без групп;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Пока Запрос.Группировка(1) = 1 Цикл
Если КвоКатегорий(Запрос.Контрагент)=0 Тогда
Таб.ВывестиСекцию("Контрагенты");
КонецЕсли; // КвоКатегорий(Запрос.Контрагент)=0
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецПроцедуры
предлагаю свой вариант, потратила конечно не 5мин, а где-то 10-15
проверен на аналогичном справочнике и подчиненном ему - работает
первый запрос - выдает тех Контрагентов, у которых есть подчиненные КатегорииКонтрагентов, но реквизит Категории пустой,
а второй - тех Контрагентов, у которых НЕТ подчиненных КатегорииКонтрагентов
Перем СпрПодч;
//*******************************************
Функция НаличиеПодчСпр(Владелец)
СпрПодч.ИспользоватьВладельца(Владелец);
Возврат СпрПодч.ВыбратьЭлементы();
КонецФункции //НаличиеПодчСпр
//*******************************************
Процедура Сформировать()
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Владелец = Справочник.КатегорииКонтрагентов.Владелец;
|Категории = Справочник.КатегорииКонтрагентов.Категории;
|Группировка Владелец без групп;
|Условие(ПустоеЗначение(Категории)=1);
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Пока Запрос.Группировка(1) = 1 Цикл
пВладелец = Запрос.Владелец;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
СпрПодч = СоздатьОбъект("Справочник.КатегорииКонтрагентов");
Запрос2 = СоздатьОбъект("Запрос");
ТекстЗапроса2 =
"//{{ЗАПРОС(Сформировать2)
|Владелец = Справочник.Контрагенты.ТекущийЭлемент;
|Группировка Владелец без групп;
|Условие(НаличиеПодчСпр(Владелец)=0);
|"//}}ЗАПРОС
;
Если Запрос2.Выполнить(ТекстЗапроса2) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Пока Запрос2.Группировка(1) = 1 Цикл
пВладелец = Запрос2.Владелец;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецПроцедуры
Перем СпрПодч;
//*******************************************
Функция НаличиеПодчСпр(Владелец)
СпрПодч.ИспользоватьВладельца(Владелец);
Возврат СпрПодч.ВыбратьЭлементы();
КонецФункции //НаличиеПодчСпр
//*******************************************
Процедура Сформировать()
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Владелец = Справочник.КатегорииКонтрагентов.Владелец;
|Категории = Справочник.КатегорииКонтрагентов.Категории;
|Группировка Владелец без групп;
|Условие(ПустоеЗначение(Категории)=1);
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Пока Запрос.Группировка(1) = 1 Цикл
пВладелец = Запрос.Владелец;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
СпрПодч = СоздатьОбъект("Справочник.КатегорииКонтрагентов");
Запрос2 = СоздатьОбъект("Запрос");
ТекстЗапроса2 =
"//{{ЗАПРОС(Сформировать2)
|Владелец = Справочник.Контрагенты.ТекущийЭлемент;
|Группировка Владелец без групп;
|Условие(НаличиеПодчСпр(Владелец)=0);
|"//}}ЗАПРОС
;
Если Запрос2.Выполнить(ТекстЗапроса2) = 0 Тогда
Возврат;
КонецЕсли;
Таб = СоздатьОбъект("Таблица");
Пока Запрос2.Группировка(1) = 1 Цикл
пВладелец = Запрос2.Владелец;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ТолькоПросмотр(1);
Таб.Показать("Сформировать", "");
КонецПроцедуры
МиллиCек0 = _GetPerformanceCounter(); //в начале процедуры сформировать
Сообщить("выполнено за "+окр((_GetPerformanceCounter()-МиллиCек0)*0.001)+"сек"); //в конце процедуры
МиллиCек0 = _GetPerformanceCounter(); //в начале процедуры сформировать
Сообщить("выполнено за "+окр((_GetPerformanceCounter()-МиллиCек0)*0.001)+"сек"); //в конце процедуры
Процедура Сформировать()
МиллиCек0 = _GetPerformanceCounter(); //в начале процедуры сформировать
Запрос=СоздатьОбъект("Запрос");
ТекстЗапроса="
|Обрабатывать НеПомеченныеНаУдаление;
|Контрагент=Справочник.АгентыКлиента.Владелец;
|Группировка Контрагент без групп;
|Без Итогов;";
Запрос.Выполнить(ТекстЗапроса);
ТЗ_=СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ_);
Список=СоздатьОбъект("СписокЗначений");
ТЗ_.Выгрузить(Список,,,"Контрагент");
ТекстЗапроса="
|Обрабатывать НеПомеченныеНаУдаление;
|Контрагент=Справочник.Контрагенты.ТекущийЭлемент;
|Группировка Контрагент без групп;
|Условие (Список.Принадлежит(Контрагент)=0);
|Без Итогов;";
Запрос.Выполнить(ТекстЗапроса);
ТЗ=СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ);
//ТЗ.ВыбратьСтроку();
Сообщить("выполнено за "+окр((_GetPerformanceCounter()-МиллиCек0)*0.001)+"сек"); //в конце процедуры
КонецПроцедуры
время выполнения 3 сек.Количество элементов в справочнике "Контрагенты" - 5500.
Процедура Сформировать()
МиллиCек0 = _GetPerformanceCounter(); //в начале процедуры сформировать
СпрКонтрагенты=СоздатьОбъект("Справочник.Контрагенты");
СпрАгенты=СоздатьОбъект("Справочник.АгентыКлиента");
СписокКонтрагентов=СоздатьОбъект("СписокЗначений");
СпрКонтрагенты.ВыбратьЭлементы();
Пока СпрКонтрагенты.ПолучитьЭлемент()=1 Цикл
Если (СпрКонтрагенты.ЭтоГруппа()=1) или (СпрКонтрагенты.ПометкаУдаления()=1) Тогда
Продолжить;
КонецЕсли;
СпрАгенты.ИспользоватьВладельца(СпрКонтрагенты.ТекущийЭлемент());
Если СпрАгенты.ВыбратьЭлементы(1)=0 Тогда
СписокКонтрагентов.ДобавитьЗначение(СпрКонтрагенты.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
Сообщить("выполнено за "+окр((_GetPerformanceCounter()-МиллиCек0)*0.001)+"сек"); //в конце процедуры
КонецПроцедуры
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|КатегорииКонтрагентов = Справочник.КатегорииКонтрагентов.ТекущийЭлемент;
|Владелец = Справочник.КатегорииКонтрагентов.Владелец;
|Контрагенты = Справочник.Контрагенты .ТекущийЭлемент;
|Группировка Контрагенты без групп;
|Условие(Контрагенты <> Владелец);
|"//}}ЗАПРОС
;
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|КатегорииКонтрагентов = Справочник.КатегорииКонтрагентов.ТекущийЭлемент;
|Владелец = Справочник.КатегорииКонтрагентов.Владелец;
|Контрагенты = Справочник.Контрагенты .ТекущийЭлемент;
|Группировка Контрагенты без групп;
|Условие(Контрагенты <> Владелец);
|"//}}ЗАПРОС
;
тогда так, только долго.
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Влад = Справочник.Контрагенты.ТекущийЭлемент, Справочник.КатегорииКонтрагентов .Владелец;
|категория= Справочник.КатегорииКонтрагентов .категория;
|Функция СК = Счётчик();
|Группировка Влад без групп;
|Группировка категория без групп;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
// Заполнение полей Влад
Если Запрос.СК = 1 Тогда
Таб.ВывестиСекцию("Влад");
КонецЕсли;
КонецЦикла;
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Влад = Справочник.Контрагенты.ТекущийЭлемент, Справочник.КатегорииКонтрагентов .Владелец;
|категория= Справочник.КатегорииКонтрагентов .категория;
|Функция СК = Счётчик();
|Группировка Влад без групп;
|Группировка категория без групп;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
// Подготовка к заполнению выходных форм данными запроса
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Сформировать");
// Заполнение полей "Заголовок"
Таб.ВывестиСекцию("Заголовок");
Состояние("Заполнение выходной таблицы...");
Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
Пока Запрос.Группировка(1) = 1 Цикл
// Заполнение полей Влад
Если Запрос.СК = 1 Тогда
Таб.ВывестиСекцию("Влад");
КонецЕсли;
КонецЦикла;
Flexy, найдете оптимальное решение - похвастайтесь.
(тоже стало интересно)
|Обрабатывать НеПомеченныеНаУдаление;
|Влад = Справочник.Контрагенты.ТекущийЭлемент, Справочник.АгентыКлиента.Владелец;
|Агент= Справочник.АгентыКлиента.ТекущийЭлемент;
|Функция СК = Счётчик();
|Группировка Влад без групп;
|Группировка Агент без групп;
|Без Итогов;";
Запрос.Выполнить(ТекстЗапроса);
ТЗ=СоздатьОбъект("ТаблицаЗначений");
Запрос.Выгрузить(ТЗ);
ТЗ.ВыбратьСтроку();
|Обрабатывать НеПомеченныеНаУдаление;
|Влад = Справочник.Контрагенты.ТекущийЭлемент, Справочник.АгентыКлиента.Владелец;
|Агент= Справочник.АгентыКлиента.ТекущийЭлемент;
|Функция СК = Счётчик();
|Группировка Влад без групп;
|Группировка Агент без групп;
|Без Итогов;";
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua