Имя: Пароль:
1C
1C 7.7
v7: создание текста запроса
0 Ar-Bus
 
26.04.12
13:20
Доброго времени суток, господа. Помогите, пожалуйста, разобраться со следующей ситуацией.

Есть справочник "Контрагенты", ему подчинен справочник "АналитикаКонтрагентов". У справочника "АналитикаКонтрагентов" есть два реквизита - ВидАналитики(берется из независимого справочника АналитическийПризнак) и ЗначениеАналитики(периодический, берется из справочника "ЗначенияАналитикиКонтрагентов", который подчинен справочнику "АналитическийПризнак"). Необходимо создать внешний отчет, чтобы пользователь задавал условия отбора (аналитический признак и его значения), и выходила печатная форма только с теми контрагентами, реквизиты подчиненных справочников которых удовлетворяют указанным пользователем условиям отбора.

Каков должен быть текст запроса? Какие должны происходить группировки?
1 andrewks
 
26.04.12
13:20
конструктор в зубы, и вперёд
2 ДенисЧ
 
26.04.12
13:22
Контра = Справочник.АналитикаКонтрагентов.Владелец;
Аналитика = Справочник.АналитикаКонтрагентов.ТекущийЭлемент;
ВидАналитики = Справочник.АналитикаКонтрагентов.ВидАналитики;
ЗначениеАналитики = Справочник.АналитикаКонтрагентов.ЗначениеАналитики;
Условие(ВидАналитики = ВыбВидАналитики);
Условие(ЗначениеАналитики = ВыбЗначениеАналитики);
Группировка Контра Без Групп;
Группировка Аналитика.;
3 Mikeware
 
26.04.12
13:25
Уже и конструктор освоить не могут...
хотя, конструктор с полнотекстовым управлением - оригинально...
4 Ar-Bus
 
26.04.12
13:28
(2) уточнение - ЗначениеАналитики - ПЕРИОДИЧЕСКИЙ РЕКВИЗИТ. Как в запросе это будет выглядеть?
5 ДенисЧ
 
26.04.12
13:29
(4) Период добавь... Значение на конец оного будет браться.
6 Boroda
 
26.04.12
13:36
В типовой ТиС есть отчет "Ведомость по контрагентам" - почти один в один, только значение свойства непериодическое.
7 Ar-Bus
 
26.04.12
13:44
(5) сейчас попробую, спасибо
8 Ar-Bus
 
26.04.12
14:08
(2) а если у меня несколько значений выбранных? Ну, например, несколько ВыбВидАналитики, несколько ВыбЗначениеАналитики? Если создать список значений ВыбВидАналитики? Условие(ВидАналитики в ВыбВидАналитики) - это согласен. Но еще же есть одно - условие(ЗначениеАналитики в ВыбЗначениеАналитики) - здесь есть один момент. Значение аналитики привязано к виду аналитики, т.е. непосредственно является подчиненным справочником спр. "АналитическийПризнак". Ну вот такой пример:

   ВидАналитики          ЗначениеАналитики
1.  наличие юриста                 да
2.  наличие бухгалтера             да

в данном случае значение "да" в строке №1 не равно значению "да" в строке №2, т.к. это значения разных видов аналитик... Как-то запутанно получилось, но все же...
9 Ar-Bus
 
26.04.12
19:25
Посмотрите код моего запроса, что здесь не так?

Процедура Сформировать()
   Т=СоздатьОбъект("Таблица");
   Т.ИсходнаяТаблица("Таблица");
   Запрос=СоздатьОбъект("Запрос");
   НачДата=ТекущаяДата();
   АналитикаКлиентов=СоздатьОбъект("Справочник.АналитикаКлиентов");
   
   
   ТекстЗапроса = "
       |Период С НачДата По НачДата;
       |АналитикаКлиентов = Справочник.АналитикаКлиентов.ТекущийЭлемент;
       |Контрагент = Справочник.АналитикаКлиентов.Владелец;
       |ВидАналитики = Справочник.АналитикаКлиентов.ВидАналитики;
       |ЗначениеАналитики = Справочник.АналитикаКлиентов.ЗначениеАналитики;";
       
   ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку()=1 Цикл
       Если (ПустоеЗначение(ТЗ.ЗначениеАналитики)=1) И (ПропускатьПустыеЗначения=1) Тогда
           Продолжить;
       КонецЕсли;
       ТекстЗапроса=ТекстЗапроса+"Условие(ЗначениеАналитики=ТЗ.ЗначениеАналитики);";
   КонецЦикла;
   ТекстЗапроса = ТекстЗапроса + "
       |Группировка Контрагент Упорядочить по Контрагент.Наименование;";
   
   
   Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
       Сообщить("Не выполнен текст запроса! Обработка остановлена");
       возврат;
   КонецЕсли;
   Пока Запрос.Группировка("Контрагент")=1 Цикл
       Т.ВывестиСекцию("Контрагент");
   КонецЦикла;
   Т.Показать();
КонецПроцедуры
10 Ork
 
26.04.12
19:28
(9) Все не читал.
Вот это вот :
=================
ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку()=1 Цикл
       Если (ПустоеЗначение(ТЗ.ЗначениеАналитики)=1) И (ПропускатьПустыеЗначения=1) Тогда
           Продолжить;
       КонецЕсли;
       ТекстЗапроса=ТекстЗапроса+"Условие(ЗначениеАналитики=ТЗ.ЗначениеАналитики);";
   КонецЦикла;
==============
для наглядности заменить на :
Условие(ЗначениеАналитики В СписокЗначенийАналитики)
перед этим этот самый список сформировать.
11 Ar-Bus
 
27.04.12
12:35
(10) я уже и пробовал в список значений заносить ТЗ.ЗначениеАналитики, а потом писать Условие(ЗначениеАналитики в СписокЗначенийАналитики), но тогда получается такая вещь: комп берет значениеАналитикиКонтрагента, смотрит, есть ли такое в списке значений, и, если есть, то выводит контрагента с данным значениемАналитики. Но мне, например, надо так: чтобы выводились только те контрагенты, у которых есть все ЗначенияАналитики, которые присутствуют в списке значений
12 Ar-Bus
 
27.04.12
13:53
Все оказалось гораздо проще, обошелся без использования запросов:

Процедура Сформировать()
   Контрагенты=СоздатьОбъект("Справочник.Контрагенты");
   Т=СоздатьОбъект("Таблица");
   АналитикаКлиентов=СоздатьОбъект("Справочник.АналитикаКлиентов");
   Контрагенты.ВыбратьЭлементы();
   Пока Контрагенты.ПолучитьЭлемент()=1 Цикл
       Если Контрагенты.ТекущийЭлемент().ЭтоГруппа()=1 Тогда
           Продолжить;
       КонецЕсли;
       АналитикаКлиентов.ИспользоватьВладельца(Контрагенты.ТекущийЭлемент());
       ТЗ.ВыбратьСтроки();
       Выводить=0;
       Пока ТЗ.ПолучитьСтроку()=1 Цикл
           Если (ПустоеЗначение(ТЗ.ЗначениеАналитики)=1) И (ПропускатьПустыеЗначения=1) Тогда
               Продолжить;
           КонецЕсли;
           Если АналитикаКлиентов.НайтиПоРеквизиту("ВидАналитики",ТЗ.ВидАналитики,0)=0 Тогда
               выводить=0;
               Прервать;
           ИначеЕсли АналитикаКлиентов.ЗначениеАналитики.Получить(начДата)<>ТЗ.ЗначениеАналитики Тогда
               Выводить=0;
               прервать;
           Иначе
               Выводить=1;
           КонецЕсли;
       КонецЦикла;
       Если Выводить=1 Тогда
           Т.ВывестиСекцию("Контрагент");
       КонецЕсли;
   КонецЦикла;
   Т.Показать();
КонецПроцедуры