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

Тема в разделе "1C и всё что с ней связано", создана пользователем NocturnalMortum, 14 мар 2010.

  1. NocturnalMortum

    NocturnalMortum Гость

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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    А за позднее ?

    Добавлено:
    На форме ЧЕГО ?
    Поиска ЧЕГО ?
    В табличную часть ЧЕГО ?
     
  3. NocturnalMortum

    NocturnalMortum Гость

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

    Код (Text):
    НаименованиеКонтрагента = Спр.Наименование;
    ОтветственноеЛицо = Спр.ОтветственноеЛицо;
    Город = Спр.Город;
    Если Спр.Рассылка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
    КонецЕсли;
    КонецЕсли;
     
  4. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Код (Text):
    Для ц = ц1 по ц12 цикл //ц1 - номер Реквизита Рассылка1, ц12 - Рассылка12, подозреваю, что они расположены подряд
    Ref = МетаДанные.Справочник(НомерСправочникавКонфигурации).Реквизит(ц).Идентификатор;
    Я = Спр.ПолучитьАтрибут(Ref);
    Если Я = 1 тогда
    Аффикс = Сокрлп(Строка(ц));
    Таб.ВывестиСекцию("К"+Аффикс);
    НаименованиеКонтрагента = "";
    ОтветственноеЛицо = "";
    Город = "";
    КонецЕсли
    КонеЦикла
     
  5. NocturnalMortum

    NocturnalMortum Гость

    Спасибо с этим Вы мне тоже помогли... но основная беда у меня в коде который идет после... примерно он выглядит так:
    //1.
    Код (Text):
    Если ((Галочка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 вот такой вот "красоты". Не могу написать по циклу... или еще как нибудь, ничего в голову не приходит.
     
  6. vbs

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    придумаешь, мысли вертятся, да вот пора на работу. Может, вечером что подскажу :welcome:

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

    kaa Гость

    Почему бы не сделать запросом, и добавить нужные условия
     
  8. NocturnalMortum

    NocturnalMortum Гость

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Попробуй через запрос - проще будет.
     
  10. NocturnalMortum

    NocturnalMortum Гость

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    В начале на форме создаешь список значений с пометками и ТЗ для просмотра и отладки что получилось
    в модуле

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

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

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

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

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

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

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

    NocturnalMortum Гость

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

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

    puh14 Well-Known Member
    1C Team

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

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

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

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

    NocturnalMortum Гость

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Кинь МД-шник на puh14@mail.ru
     
  16. NocturnalMortum

    NocturnalMortum Гость

    Проблема так и не решилась... я уже голову сломал. Помогите кто чем может еще...
     
  17. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Я вот пытался понять задачу и не смог.
    * насчет вывода не понятно: сначала понял, что нужно отсеять строки спр-ка, удовлетворяющие галочкам. А читая текст, вижу что галочки влияют на вывод секций.
    * понял так, что проблема в переборе условий, что их слишком много. puh14 совет дает мастерские, но я оцениваю как недоступные для получателя.

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

    vbs Well-Known Member

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

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

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Ну извини что не быстро, на мыло тебе скинул обработку, текст модуля выкидываю сюда для обсуждения, мож где накосячил


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

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

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

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

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


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

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


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


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

    vbs Well-Known Member

    Регистрация:
    18 фев 2007
    Сообщения:
    1.708
    Симпатии:
    3
    Издеваешься, что ли ? :D

    Алгоритм анализа на признак включатьВвыборку я не совсем понял, то ли одного совпадения уже достаточно и надо прерывать 2 внутренних цикла
    и продолжать внешний, то ли все до конца проверять (до полного совпадения)
     
Загрузка...
Похожие Темы - Помогите новичку выборкой
  1. rn3rjd
    Ответов:
    9
    Просмотров:
    1.230
  2. maxiik
    Ответов:
    3
    Просмотров:
    1.572
  3. zaza41rus
    Ответов:
    0
    Просмотров:
    1.054
  4. Radion2
    Ответов:
    0
    Просмотров:
    1.669
  5. forem0st
    Ответов:
    6
    Просмотров:
    3.540

Поделиться этой страницей