• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

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

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

NocturnalMortum

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

Добавлено:
Задача такова что на форме расположено
На форме ЧЕГО ?
с параметрами поиска
Поиска ЧЕГО ?
Нужно написать чтобы в табличную часть
В табличную часть ЧЕГО ?
 
И за позднее конечно тоже спасибо =) Форма отчета, нужно чтобы программа сверялась с отмеченными галочками контрагента, и если они совпадают то выводила в таблицу этого же отчета. Вот чего я смог добиться.. но это не дело, код слишком велик и не рационален... так идет на все 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
КонецЕсли;
КонецЕсли;
 
Код:
Для ц = ц1 по ц12 цикл //ц1 - номер Реквизита Рассылка1, ц12 - Рассылка12, подозреваю, что они расположены подряд
Ref = МетаДанные.Справочник(НомерСправочникавКонфигурации).Реквизит(ц).Идентификатор;
Я = Спр.ПолучитьАтрибут(Ref);
Если Я = 1 тогда
Аффикс = Сокрлп(Строка(ц));
Таб.ВывестиСекцию("К"+Аффикс);
НаименованиеКонтрагента = "";
ОтветственноеЛицо = "";
Город = "";
КонецЕсли
КонеЦикла
 
Спасибо с этим Вы мне тоже помогли... но основная беда у меня в коде который идет после... примерно он выглядит так:
//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 вот такой вот "красоты". Не могу написать по циклу... или еще как нибудь, ничего в голову не приходит.
 
Не могу написать по циклу... или еще как нибудь, ничего в голову не приходит
придумаешь, мысли вертятся, да вот пора на работу. Может, вечером что подскажу :welcome:

Добавлено: Родилась мысль : Помести свои галочки в Список с пометками или таблицу значений. Тогда в цикле можно будет легко сравнивать их с реквизитами справочника
 
Почему бы не сделать запросом, и добавить нужные условия
 
пробовал с ТЗ чето нифига не выходит =( не могли бы Вы подсказать как именно?
 
Попробуй через запрос - проще будет.
 
Извиняюсь за свое невежество, но, через запрос это как? Можно кусок кода или ссылку на какое нибудь чтиво... дальше попробую сам разобраться... я недавно взялся за 1С поэтому многого не знаю.
 
В начале на форме создаешь список значений с пометками и ТЗ для просмотра и отладки что получилось
в модуле

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

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

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

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

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

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


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

Добавлено: и когда я говорил галочка имел ввиду компонент "флажок"...
 
Цикла нет - на выходе из запроса получаешь сразу таблицу значений, отфильтрованную согласно запросу. Потом ТЗ можешь перебирать и выводить на печать.

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

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

по сути - это названия реквизитов справочника, как они заданы в конфигураторе. При переборе списка в текст запроса добавляется условие, что в элементе справочника, реквизит (то что ты добавил в список, поэтому важно чтобы название реквизита и то что ты добавляешь в список точно соответствовало друг-другу, иначе про ошибки орать начнет) равен 0 (пометки в списке и в справочнике нет) или 1 (пометка в списке и справочнике есть).
 
Либо лыжи не едут, либо все таки мозг отсутствует (я лично склоняюсь в сторону второго =))... Не работает =(
 
Проблема так и не решилась... я уже голову сломал. Помогите кто чем может еще...
 
Я вот пытался понять задачу и не смог.
* насчет вывода не понятно: сначала понял, что нужно отсеять строки спр-ка, удовлетворяющие галочкам. А читая текст, вижу что галочки влияют на вывод секций.
* понял так, что проблема в переборе условий, что их слишком много. puh14 совет дает мастерские, но я оцениваю как недоступные для получателя.

Резюме: надо собраться с мыслями, логику причесать
 
Проверено на произвольном справочнике с использованием списка с пометками вместо 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. Увы, в обработке не работает Форма.ПолучитьАтрибут(ИмяГалочки) - выдает НеизвестныйОбъект

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


Процедура Сформировать()
Запрос= СоздатьОбъект("Запрос");
ТекстЗапроса = "Спр = Справочник.Контрагенты.ТекущийЭлемент;
|Группировка Спр Без Групп;";
для ааа = 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. Увы, в обработке не работает Форма.ПолучитьАтрибут(ИмяГалочки) - выдает НеизвестныйОбъект

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

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


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


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

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

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

Похожие темы