Помогите новичку с выборкой =)

  • Автор темы NocturnalMortum
  • Дата начала
N

NocturnalMortum

Гость
#1
Доброго времени суток. Задача такова что на форме расположено (к примеру 12) галочек, с параметрами поиска. Нужно написать чтобы в табличную часть выводились только с этими параметрами(пример: отмечены - машина, ваз, 99 года. должны выводиться тока вазы 99 года, если хоть один параметр не совпадает то не выводить) пока что не получается! Описывать все галочки и возможные их пересечения через ЕСЛИ очень проблематично и трудоемко. За раннее благодарен.
 

vbs

Well-Known Member
18.02.2007
1 708
3
#2
А за позднее ?

Добавлено:
Задача такова что на форме расположено
На форме ЧЕГО ?
Поиска ЧЕГО ?
Нужно написать чтобы в табличную часть
В табличную часть ЧЕГО ?
 
N

NocturnalMortum

Гость
#3
И за позднее конечно тоже спасибо =) Форма отчета, нужно чтобы программа сверялась с отмеченными галочками контрагента, и если они совпадают то выводила в таблицу этого же отчета. Вот чего я смог добиться.. но это не дело, код слишком велик и не рационален... так идет на все 16 галочек.

Код:
НаименованиеКонтрагента = Спр.Наименование;
ОтветственноеЛицо = Спр.ОтветственноеЛицо;
Город = Спр.Город;
Если Спр.Рассылка1=1 Тогда
Таб.ВывестиСекцию("К1");
НаименованиеКонтрагента = "";
ОтветственноеЛицо = "";
Город = "";
КонецЕсли; 
Если Спр.Рассылка2=1 Тогда
Таб.ВывестиСекцию("К2");
НаименованиеКонтрагента = "";
ОтветственноеЛицо = "";
Город = "";
КонецЕсли;
Если Спр.Рассылка3=1 Тогда
Таб.ВывестиСекцию("К3");
НаименованиеКонтрагента = "";
ОтветственноеЛицо = "";
Город = "";
КонецЕсли;
Если Спр.Рассылка4=1 Тогда
Таб.ВывестиСекцию("К4");
НаименованиеКонтрагента = "";
ОтветственноеЛицо = "";
Город = "";
КонецЕсли;
Если Спр.Рассылка5=1 Тогда
Таб.ВывестиСекцию("К5");
НаименованиеКонтрагента = "";
ОтветственноеЛицо = "";
Город = "";
КонецЕсли;

КонецПроцедуры

//*******************************************
Процедура Сформировать()	 
Спр=СоздатьОбъект("Справочник.Контрагенты");
Таб=СОздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Если Лицо.Выбран()=1 Тогда
Мен="менеджер "+строка(Лицо.Наименование);
КонецЕсли;
Таб.ВывестиСекцию("Шапка");
Спр.ВЫбратьЭлементы(0);
Пока Спр.ПолучитьЭлемент()=1 Цикл
ВключатьВВыборку = 0;
Если ((галочка1=1) и (галочка2=1)) Тогда
Если ((Спр.галочка1 = 1)и(спр.галочка = 1)) Тогда
ВключатьВВыборку = 1
КонецЕсли;
КонецЕсли;
 

vbs

Well-Known Member
18.02.2007
1 708
3
#4
Код:
Для ц = ц1 по ц12 цикл //ц1 - номер Реквизита Рассылка1, ц12 - Рассылка12, подозреваю, что они расположены подряд
Ref = МетаДанные.Справочник(НомерСправочникавКонфигурации).Реквизит(ц).Идентификатор;
Я = Спр.ПолучитьАтрибут(Ref);
Если Я = 1 тогда
Аффикс = Сокрлп(Строка(ц));
Таб.ВывестиСекцию("К"+Аффикс);
НаименованиеКонтрагента = "";
ОтветственноеЛицо = "";
Город = "";
КонецЕсли
КонеЦикла
 
N

NocturnalMortum

Гость
#5
Спасибо с этим Вы мне тоже помогли... но основная беда у меня в коде который идет после... примерно он выглядит так:
//1.
Код:
Если ((Галочка1=1) и (Галочка2=1)) Тогда
//Фильтр
Если ((Спр.Галочка1= 1)и(спр.Галочка2 = 1)) Тогда
//ОК
ВключатьВВыборку = 1
КонецЕсли;
КонецЕсли;

//1.1
Если ((Галочка1=1) и (Галочка3=1))Тогда
//Фильтр
Если ((Спр.Галочка1 = 1)и(спр.Галочка3 = 1))Тогда 
//ОК
ВключатьВВыборку = 1
КонецЕсли;
КонецЕсли;

//1.2
Если ((Галочка1=1) и (Галочка4=1))Тогда
//Фильтр
Если ((Спр.Галочка1= 1)и(спр.Галочка4= 1))Тогда 
//ОК
ВключатьВВыборку = 1
КонецЕсли;
КонецЕсли;

//1.3
Если ((Галочка1=1) и (Галочка5=1))Тогда
//Фильтр
Если ((Спр.Галочка1 = 1)и(спр.Галочка5 = 1))Тогда 
//ОК
ВключатьВВыборку = 1
КонецЕсли;
КонецЕсли;
...

Там кода строк на 200 вот такой вот "красоты". Не могу написать по циклу... или еще как нибудь, ничего в голову не приходит.
 

vbs

Well-Known Member
18.02.2007
1 708
3
#6
Не могу написать по циклу... или еще как нибудь, ничего в голову не приходит
придумаешь, мысли вертятся, да вот пора на работу. Может, вечером что подскажу :welcome:

Добавлено: Родилась мысль : Помести свои галочки в Список с пометками или таблицу значений. Тогда в цикле можно будет легко сравнивать их с реквизитами справочника
 
K

kaa

Гость
#7
Почему бы не сделать запросом, и добавить нужные условия
 
N

NocturnalMortum

Гость
#8
пробовал с ТЗ чето нифига не выходит =( не могли бы Вы подсказать как именно?
 
N

NocturnalMortum

Гость
#10
Извиняюсь за свое невежество, но, через запрос это как? Можно кусок кода или ссылку на какое нибудь чтиво... дальше попробую сам разобраться... я недавно взялся за 1С поэтому многого не знаю.
 

puh14

Well-Known Member
11.07.2008
1 412
0
#11
В начале на форме создаешь список значений с пометками и ТЗ для просмотра и отладки что получилось
в модуле

Код:
Процедура Сформировать()
Запрос = СоздатьОбъект("Запрос");
\\это если у тебя нет перодических реквизитов - иначе период надо указывать и то значения будут считаться только на конц периода
ТекстЗапроса ="
|Спр = Справочник.ТМЦ.ТекущийЭлемент();
|Группировка Спр БезГрупп;";

для ааа = 1 По Спс.РазмерСписка() Цикл
ТекстЗапроса = ТекстЗапроса + "Условие (Спр."+Спс.ПолучитьЗначение(ааа)+" в "+ Спс.Пометка(ааа) +");";
КонецЦикла;

Запрос.Выполнить(текстЗапроса);

Запрос.Выгрузить(ТЗ);

КонецПроцедуры

Спс.ДобавитьЗначение("ТАЗ");
Спс.ДобавитьЗначение("99");

этот случай если у тебя твои двенадцать галочек представлены двенадцатью числовыми реквизитами (флажок в справочнике). Если тебе надо текст в наименовании искать - тогда список формировать по другому. По твоему объяснению не очень понятно как фильтрация происходит - по ссылочным данным, числовым реквизитам справочника или по вхождению в наименование.
 
N

NocturnalMortum

Гость
#12
я окончательно запутался... Не могли бы Вы дать более точные комментарии? Где какая переменная и как строиться цикл... программа должна работать так: если отмечено на отчете и такая же галочка отмечена на контрагентах тогда добавляем в выборку. Надо полагать по числовым реквизитам.

Добавлено: и когда я говорил галочка имел ввиду компонент "флажок"...
 

puh14

Well-Known Member
11.07.2008
1 412
0
#13
Цикла нет - на выходе из запроса получаешь сразу таблицу значений, отфильтрованную согласно запросу. Потом ТЗ можешь перебирать и выводить на печать.

переменных по сути тоже нет - в конце модуля строчки добавляют строковое название реквизита в список значений (спс), по значению которого (0 или1) в справочнике надо отбирать записи.

Спс.ДобавитьЗначение("ТАЗ");
Спс.ДобавитьЗначение("99");

по сути - это названия реквизитов справочника, как они заданы в конфигураторе. При переборе списка в текст запроса добавляется условие, что в элементе справочника, реквизит (то что ты добавил в список, поэтому важно чтобы название реквизита и то что ты добавляешь в список точно соответствовало друг-другу, иначе про ошибки орать начнет) равен 0 (пометки в списке и в справочнике нет) или 1 (пометка в списке и справочнике есть).
 
N

NocturnalMortum

Гость
#14
Либо лыжи не едут, либо все таки мозг отсутствует (я лично склоняюсь в сторону второго =))... Не работает =(
 
N

NocturnalMortum

Гость
#16
Проблема так и не решилась... я уже голову сломал. Помогите кто чем может еще...
 

Дайнеко

Well-Known Member
19.11.2009
951
0
#17
Я вот пытался понять задачу и не смог.
* насчет вывода не понятно: сначала понял, что нужно отсеять строки спр-ка, удовлетворяющие галочкам. А читая текст, вижу что галочки влияют на вывод секций.
* понял так, что проблема в переборе условий, что их слишком много. puh14 совет дает мастерские, но я оцениваю как недоступные для получателя.

Резюме: надо собраться с мыслями, логику причесать
 

vbs

Well-Known Member
18.02.2007
1 708
3
#18
Проверено на произвольном справочнике с использованием списка с пометками вместо 16 "галочек"

Procedure Exec()
Ref = CreateObject("Reference.ОКСМ");
Ref.SelectItems();
While Ref.GetItem() = 1 do
for i = 1 to N do
Flag1 = F.Check(i);
Banner1 = Ref.GetAttrib("Галочка"+String(i));
for k = 1 to N do
Flag2 = F.Check(k);
Banner2 = Ref.GetAttrib("Галочка"+String(k));
if Flag1*Flag2 = 1 then
if Banner1*Banner2 = 1 then
Message(String(i)+ " "+String(k)+ " Включить в выборку "+Ref.Description)
endif;
endif;
enddo
enddo
enddo
EndProcedure
//********************************************************
N = 3; //количество "галочек"
for i = 1 to N do
F.AddValue("Галочка"+String(i)) // F- список с пометками на форме
enddo

PS. Увы, в обработке не работает Форма.ПолучитьАтрибут(ИмяГалочки) - выдает НеизвестныйОбъект

Добавлено: Ну и надо еще добавить, не надо ли прекратить проверку, если условие уже соблюдено
 

puh14

Well-Known Member
11.07.2008
1 412
0
#19
Ну извини что не быстро, на мыло тебе скинул обработку, текст модуля выкидываю сюда для обсуждения, мож где накосячил


Процедура Сформировать()
Запрос= СоздатьОбъект("Запрос");
ТекстЗапроса = "Спр = Справочник.Контрагенты.ТекущийЭлемент;
|Группировка Спр Без Групп;";
для ааа = 1 По Спс.РазмерСписка() Цикл
ТекстЗапроса = ТекстЗапроса + "Условие (Спр."+Спс.ПолучитьЗначение(ааа)+" в "+ Спс.Пометка(ааа) +");";//Тут можно и "=" вместо "в"
КонецЦикла;

Если Лицо.Выбран() = 1 ТОгда
ТекстЗапроса = ТекстЗапроса + "Условие(Спр.ОтветственноеЛицо в Лицо);";
КонецЕсли;

Запрос.Выполнить=(ТекстЗапроса);
Запрос.Выгрузить(ТЗ);
Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("Таблица");
Таб.Вывестисекцию("Шапка");
Тз.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() = 1 Цикл
Для К = 1 По 5 Цикл
Если ТЗ.Спр.ПолучитьАтрибут("Рассылка"+К) = 1 Тогда//Тут может понадобится создать объект с поиском по Тз.Спр, а может и так прокатить
Таб.ВывестиСекцию("К"+К);
КонецЕсли;
КонецЦикла;

КонецЦикла;
Таб.Опции(0,0,0,0);
Таб.Показать("Отчет","");

КонецПроцедуры


Спс.ДобавитьЗначение("AMP Netconnect");
Спс.ДобавитьЗначение("Mutlusan");
Спс.ДобавитьЗначение("Shaefer");
Спс.ДобавитьЗначение("EatonMGE");
Спс.ДобавитьЗначение("EatonPowerware");
Спс.ДобавитьЗначение("TYAN");
Спс.ДобавитьЗначение("Chenbro");

Добавлено:
Проверено на произвольном справочнике с использованием списка с пометками вместо 16 "галочек"

Procedure Exec()
Ref = CreateObject("Reference.ОКСМ");
Ref.SelectItems();
While Ref.GetItem() = 1 do
for i = 1 to N do
Flag1 = F.Check(i);
Banner1 = Ref.GetAttrib("Галочка"+String(i));
for k = 1 to N do
Flag2 = F.Check(k);
Banner2 = Ref.GetAttrib("Галочка"+String(k));
if Flag1*Flag2 = 1 then
if Banner1*Banner2 = 1 then
Message(String(i)+ " "+String(k)+ " Включить в выборку "+Ref.Description)
endif;
endif;
enddo
enddo
enddo
EndProcedure
//********************************************************
N = 3; //количество "галочек"
for i = 1 to N do
F.AddValue("Галочка"+String(i)) // F- список с пометками на форме
enddo

PS. Увы, в обработке не работает Форма.ПолучитьАтрибут(ИмяГалочки) - выдает НеизвестныйОбъект

Добавлено: Ну и надо еще добавить, не надо ли прекратить проверку, если условие уже соблюдено
Точно-точно, список гораздо лучше тучи галок. Ну у меня то-же самое, только запросом.


а вот до такого я бы не додумался


Кстати - в моем написании будут выводится контрагенты ТОЛЬКО с таким набором галочек, то есть если например нв отчете помечены пять галок, а в элементе шесть, то фильтр его отсечет.
 

vbs

Well-Known Member
18.02.2007
1 708
3
#20
а вот до такого я бы не додумался
Издеваешься, что ли ? :D

Алгоритм анализа на признак включатьВвыборку я не совсем понял, то ли одного совпадения уже достаточно и надо прерывать 2 внутренних цикла
и продолжать внешний, то ли все до конца проверять (до полного совпадения)