7.7 Спр. НайтиПоРеквизиту()

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем man37, 20 окт 2015.

  1. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Нарисовал такой кодик:
    Код:
    Спр = СоздатьОбъект ("Справочник.Номенклатура");
    Спр.ИспользоватьДату(ТекущаяДата());
    
    Спр.ВыбратьЭлементы();
    
    Пока Спр.ПолучитьЭлемент()=1 Цикл  
    
    Если Спр. НайтиПоРеквизиту("T", T,1)=1    Тогда   
    
        Сообщить ("Наименование -  " + Спр.Наименование);
        Сообщить ("T -  " + T);
       
    КонецЕсли;
    КонецЦикла;
    Почему-то выводит только одно наименование (первое), хотя должно больше.
    Подскажите где не так?
  2. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    403
    Симпатии:
    71
    Баллы:
    54
    Здравствуйте.
    Не так организован цикл и поиск реквизита. Если уж Вы перебираете весь справочник, то обращайтесь к реквизиту напрямую через Спр.Т и сравнивайте с значением Т. Если равен, то Сообщить().
    В общем, должно получиться что-то подобное, проверьте сами:
    Код:
    Спр = СоздатьОбъект ("Справочник.Номенклатура");
    Спр.ИспользоватьДату(ТекущаяДата());
    
    Спр.ВыбратьЭлементы();
    
    Пока Спр.ПолучитьЭлемент()=1 Цикл
    
    Если Спр.T=Т    Тогда 
    
        Сообщить ("Наименование -  " + Спр.Наименование);
        Сообщить ("T -  " + T);
     
    КонецЕсли;
    КонецЦикла;
    Можно запросом тоже самое получить. Все зависит от задачи.
    Последнее редактирование: 20 окт 2015
    man37 нравится это.
  3. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Катюфка, Вы прелесть, два дня бился, оказывается все на много проще.

    Запросы писать не умею!
  4. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Продолжаем задавать глупые вопросы:
    с одним реквизитом понятно, а если два и к тому же выбирается либо 1, либо 2 или оба сразу?
  5. Mitay_D
    Offline

    Mitay_D Опытный в 1С

    Регистрация:
    16 фев 2010
    Сообщения:
    314
    Симпатии:
    0
    Баллы:
    26
    Код:
        Пока Спр.ПолучитьЭлемент()=1 Цикл 
            Если (Спр.ТекущийЭлемент() = Т) Тогда    
                Сообщить ("Наименование -  " + Спр.Наименование);
                Сообщить ("T -  " + Т); 
            ИначеЕсли  (Спр.ТекущийЭлемент() = Т1) Тогда 
                Сообщить ("Наименование -  " + Спр.Наименование);
                Сообщить ("T -  " + Т1);     
            КонецЕсли;
        КонецЦикла;
    может так?
  6. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    403
    Симпатии:
    71
    Баллы:
    54
    Можно сделать приведенный мной код отдельной процедурой и вызывать ее с разными значениями Т в качестве аргумента. Скорости работы это конечно не прибавит, но обычно все элементы справочника пробегаются быстро, зато универсальность появится.
  7. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Немного не то, Т и Т1 реквизиты.
    --- Объединение сообщений, 21 окт 2015 ---
    У нас 4G интернет - сегодня открывалась только почта, другие сайты висели.
    Спасибо за помощь!
  8. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Катюфка! Пока не понял, как можно это сделать:


    Еще нашкодил:
    Код:
    Процедура Сформировать()
      
        T = ВыбT;
        D = ВыбD;
      
        Запрос = СоздатьОбъект ("Запрос");
        ТекстЗапроса =
        "
        |Без итогов;
        |Номенклатура = Справочник.Номенклатура.ТекущийЭлемент;
        |T = Справочник.Номенклатура.T;
        |D = Справочник.Номенклатура.D;
        |Группировка Номенклатура упорядочить по Номенклатура.Наименование;
        |Условие (T = ВыбT);
        |Условие (D = ВыбD);
        |"
        ;
      
        ТЗ = СоздатьОбъект ("ТаблицаЗначений");
        ТЗ.НоваяКолонка ("Объект","Справочник.Номенклатура");
        ТЗ.НоваяКолонка ("Артикул","Строка");
      
        Спр = СоздатьОбъект ("Справочник.Номенклатура");
        Спр.ВыбратьЭлементыПоРеквизиту ("T", T,0,1);
        Спр.ВыбратьЭлементыПоРеквизиту ("D", D,0,1);
    
        Пока Спр.ПолучитьЭлемент() = 1 Цикл
            ТЗ.НоваяСтрока();
            ТЗ.Объект = Спр.ТекущийЭлемент();
            ТЗ.Артикул = Спр.Артикул;
        КонецЦикла
    КонецПроцедуры
    
    Получаю ошибку:
    Спр.ВыбратьЭлементыПоРеквизиту ("T", T,0,1);
    {Обработка.ТТТТТТ.Форма.Модуль(72)}: Неверное имя реквизита!
  9. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Стормозил на работе отбор и сортировка поставил, дома нет.

    Добавил:
    Код:
    Сообщить (Обьект);
    Сообщить (Артикул);
    
    Все работает, но только если вводишь оба реквизита, если один, то выводит всю номенклатуру.
    Как поправить чтобы искала по Т ( если не введен D) или наоборот, а если введены оба, то по двум?
  10. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    403
    Симпатии:
    71
    Баллы:
    54
    Как Вы любите все усложнять!
    Уже все есть для того, чтобы получить нужное. Если я правильно понимаю, на форме есть два реквизита ВыбТ и ВыбD.
    Код:
    Спр = СоздатьОбъект ("Справочник.Номенклатура");
    Спр.ИспользоватьДату(ТекущаяДата());
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент()=1 Цикл
    Если (ПустоеЗначение(ВыбТ)=0)
    И (Спр.T=ВыбТ)    Тогда 
        Сообщить ("Наименование -  " + Спр.Наименование);
        Сообщить ("T -  " + ВыбT);
    КонецЕсли;
    Если (ПустоеЗначение(ВыбD)=0)
    И (Спр.D=ВыбD)    Тогда 
        Сообщить ("Наименование -  " + Спр.Наименование);
        Сообщить ("D -  " +ВыбD);
    КонецЕсли;
    КонецЦикла;
    man37 нравится это.
  11. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    403
    Симпатии:
    71
    Баллы:
    54
    Запросом как-то так:
    Код:
     Запрос = СоздатьОбъект ("Запрос");
        ТекстЗапроса =
        "
        |Обрабатывать НеПомеченныеНаУдаление;
        |Без итогов;
        |Номенклатура = Справочник.Номенклатура.ТекущийЭлемент;
        |T = Справочник.Номенклатура.T;
        |D = Справочник.Номенклатура.D;
        |Группировка Номенклатура упорядочить по Номенклатура.Наименование;
        |"
        ;
    Если ПустоеЗначение(ВыбТ) = 0 Тогда
    ТекстЗапроса=ТекстЗапроса+"Условие (T = ВыбT);";
    КонецЕсли;
    Если ПустоеЗначение(ВыбD) = 0 Тогда
    ТекстЗапроса=ТекстЗапроса+"Условие (D = ВыбD);";
    КонецЕсли;
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    Пока Запрос.Группировка() = 1 Цикл
    Сообщить(Строка(Запрос.Номенклатура) + " Т - "+Строка(Запрос.T)+ " D - "+Строка(Запрос.D));
    КонецЦикла;
    
    
    Последнее редактирование: 22 окт 2015
    man37 нравится это.
  12. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Мы не ищем легких путей!
    Это проверю дома, сейчас нет времени.
    --- Объединение сообщений, 22 окт 2015 ---

    Это проверил, но получается, что работает только если введено два реквизита и выходит ответ: Т - 0 D - 0
    Т - 12 D - 23
    Т - 12 D - 23
    Где-то похоже засада.
  13. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Время появилось.
    Резюмирую - если ввести реквизит Т, то выводит 2 товара как и положено, если ввести D, то выводит 1 товар (все правильно, у второго реквизита D другой).
    Если ввести оба, то сообщает Т - 12 Товар1, Т - 12 Товар2, D - 23 Товар2, как бы хотелось получить только Товар2.
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Если в коде есть ИспользоватьДату, то, как я понимаю, реквизит периодический. А вы в курсе про "особенность" работы с периодическим реквизитами через запрос?
  15. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Реквизиты непериодические, но нужно действительно запросом (возможно, я и не прав, т.к. не программист). Об'ясню почему решил так.
    На форме 10 реквизитов и таблица для выгрузки найденных товаров. Пока пытаюсь решить задачку только с двумя реквизитами, с большим числом реквизитов проблем больших думаю не будет.
    К примеру, я знаю 3 реквизита из 10, ввожу их и в таблицу попадаю все товары, у которых есть эти 3 реквизита; ввожу 4 реквизита, в таблице товары, у которых есть эти 4 реквизита и т.д..
  16. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    И еще, написанный мною запрос, работает правильно, но с одним условием, что реквизиты должны вводится обязательно по порядку, т.е. обязательно Т (если знаешь только один реквизит), а если я знаю только D? Тогда выводит всю номенклатуру, у которой реквизит Т = 0.
    Не хватает условия, если введенный реквизит Т = 0, а D <> 0, тогда вывести номенклатуру с D<>0, а не всю номенклатуру, у которой реквизит Т = 0. Вот не знаю как это сделать!
  17. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тогда у каждого условия д.б. флаг "учитывать условие". Был бы реквизит справочника можно было использовать условие "В"
  18. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    Объясните, пожалуйста, что Вы имели ввиду!
  19. Катюфка
    Offline

    Катюфка Профессионал в 1С

    Регистрация:
    3 июн 2013
    Сообщения:
    403
    Симпатии:
    71
    Баллы:
    54
    Всем привет.
    А вот так не пробовали?

    Код:
    ОчиститьОкноСообщений();
    Спр = СоздатьОбъект ("Справочник.Номенклатура");
    Спр.ВыбратьЭлементы();
    Пока Спр.ПолучитьЭлемент()=1 Цикл
    Если (Спр.T=ВыбT) И (Спр.D=ВыбD)    Тогда
    Сообщить ("Наименование - " + Спр.Наименование+" "+"T - " +Спр.T+" "+"D - " +Спр.D);
    КонецЕсли;
    КонецЦикла;
  20. TopicStarter Overlay
    man37
    Offline

    man37 Опытный в 1С

    Регистрация:
    10 дек 2013
    Сообщения:
    197
    Симпатии:
    5
    Баллы:
    29
    ИЗВИНЯЮСЬ !!!!!
    Поправил:
    Код:
        |Группировка Номенклатура упорядочить по Номенклатура.Наименование;
    На:
    Код:
     |Группировка Номенклатура упорядочить по Номенклатура.Наименование без Групп;
    чтобы группы не выводил.

    ЗАПРОС РАБОТАЕТ ПРАВИЛЬНО, вывожу в таблицу (Артикул | Наименование), получаю в конце лишний Артикул, Артикул первого выведенного товара.
    Чтобы еще добавить в запрос чтобы избавиться от этого?

    Огромное СПАСИБО , за помощь!

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