8.х Недопустимое значение параметра при отборе

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем akey, 23 ноя 2010.

  1. TopicStarter Overlay
    akey
    Offline

    akey

    Регистрация:
    23 ноя 2010
    Сообщения:
    3
    Симпатии:
    0
    Баллы:
    1
    Подскажите пожалуйста причину ошибки
    "Недопустимое значение параметра (параметр номер '3')"

    Код:
    Отбор = Новый Структура("НомерКаталога1, Бренд");
    Отбор.НомерКаталога1 = СОКРЛП(ТекКод1);
    Отбор.Бренд = СокрЛП(ТекБренд);
    
    Выборка = Справочники.Номенклатура.Выбрать(,,Отбор ); //<-Ошибка
    Если  Выборка.Следующий() Тогда ... 
    
  2. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    На этот параметр накладываются определенные условия.
    Вот:
  3. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    Ну вариантов решения здесь по меньшей мере два:
    1) Можно выбрать все элементы справочника, а потом путем перебора всех элементов проверять их на выполнение условий.
    Т.е. примерно так:
    Код:
    Выборка = Справочники.Номенклатура.Выбрать();
    Пока Выборка.Следующий() Цикл
    Если Найти(НРег(Выборка.НомерКаталога1), СокрЛП(ТекКод1)) > 0 
    И Найти(НРег(Выборка.Бренд), СокрЛП(ТекБренд)) > 0 Тогда
    ...
    КонецЕсли;
    КонецЦикла;
    
    Но при таком варианте выполняться это будет довольно медленно, особенно если в справочнике у вас очень много элементов.
    Поэтому более предпочтительным является вариант
    2) Использовать запрос:
    Код:
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("НомерКаталога1", СокрЛП(ТекКод1));
    Запрос.УстановитьПараметр("Бренд", СокрЛП(ТекБренд));
    Запрос.Текст = "
    |ВЫБРАТЬ
    |	Справочник.Номенклатура.Ссылка
    |ГДЕ
    |	Ссылка.НомерКаталога1 ПОДОБНО &НомерКаталога1
    |	И Ссылка.Бренд ПОДОБНО &Бренд";
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Если Выборка.Следующий() Тогда
    ...
    КонецЕсли;
    
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Комментарии к ответу выше:
    1) Перебирать все не обязательно. Можно предварительно наложить отбор по одному из реквизитов, тогда количество перебираемых элементов сократится.
    2) Немного непревычное построение текста запроса, думаю должно заработать, но все-таки, лучше так:
    Код:
    "ВЫБРАТЬ
    Номенклатура.Ссылка
    ИЗ
    Справочник.Номенклатура КАК Номенклатура
    ГДЕ
    Номенклатура.Ссылка.НомерКаталога1 ПОДОБНО &НомерКаталога1
    И Номенклатура.Ссылка.Бренд ПОДОБНО &Бренд"
    
    Быстро работать тоже не будет, поскольку идет работа с текстовыми значениями.

    akey, НомерКаталога1, Бренд - это у вас что такое и для чего используется?
  5. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    4.949
    Симпатии:
    149
    Баллы:
    104
    Согласен!!! До конца не продумал!
    Может быть... но тем не менее работает в разы быстрее, чем первый вариант!
  6. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Ну то что быстрее по сравнению с перебором - оно то так и должно быть конечно.

    Вопрос в другом - для чего это все?

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