8.х Вопрос по запросу в 1С 8.2

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем DeniNikitin, 26 мар 2012.

  1. TopicStarter Overlay
    DeniNikitin
    Offline

    DeniNikitin Опытный в 1С

    Регистрация:
    2 июл 2008
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    Здравствуйте!

    Необходимо проверить наличие характеристики в запросе для двух характеристик запрос написал, помогите написать для 5 характеристик?
    Код:
    Запрос=Новый Запрос;
    Запрос.Текст="ВЫБРАТЬ
    | ВложенныйЗапрос.Объект
    |ИЗ
    | (ВЫБРАТЬ
    | ЗначенияСвойствОбъектов.Объект КАК Объект
    | ИЗ
    | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
    | ПО ЗначенияСвойствОбъектов.Объект = ХарактеристикиНоменклатуры.Ссылка
    | ГДЕ
    | ЗначенияСвойствОбъектов.Свойство = &Свойство2
    | И ЗначенияСвойствОбъектов.Значение = &Значение2
    | И ХарактеристикиНоменклатуры.Владелец = &Владелец) КАК ВложенныйЗапрос
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
    | ЗначенияСвойствОбъектов.Объект КАК Объект
    | ИЗ
    | РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
    | ПО ЗначенияСвойствОбъектов.Объект = ХарактеристикиНоменклатуры.Ссылка
    | ГДЕ
    | ЗначенияСвойствОбъектов.Свойство = &Свойство
    | И ЗначенияСвойствОбъектов.Значение = &Значение
    | И ХарактеристикиНоменклатуры.Владелец = &Владелец) КАК ВложенныйЗапрос1
    | ПО ВложенныйЗапрос.Объект = ВложенныйЗапрос1.Объект";
    Запрос.УстановитьПараметр("Владелец",Номенклатура);
    Запрос.УстановитьПараметр("Свойство",СвойствоРазмер);
    Запрос.УстановитьПараметр("Значение",СпрРазмер);
    Запрос.УстановитьПараметр("Свойство2",СвойствоСезон);
    Запрос.УстановитьПараметр("Значение2",СпрСезон);

    Вложения:

  2. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    опишите задачу подробнее...
  3. TopicStarter Overlay
    DeniNikitin
    Offline

    DeniNikitin Опытный в 1С

    Регистрация:
    2 июл 2008
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    К примеру:
    Есть номенклатура Блуза "11111"
    У неё характеристика Размер - 56, Стиль - Зима, Год - 2012 и.т.д.
    Необходимо запросом выбрать характеристики и значения и если есть с такими значениями, то ничего не делаем, а если нету то создаём!
  4. leemuar
    Offline

    leemuar Опытный в 1С

    Регистрация:
    21 окт 2010
    Сообщения:
    310
    Симпатии:
    0
    Баллы:
    26
    Вам нужно:

    1) Определить список обязательных свойств характеристик (и их значений, если нужно)
    2) Получить список всех характеристик для указанной номенклатуры и их свойств
    3) Если для какой-то характеристики значение свойства не задано - делать то что вам нужно (создать)
  5. TopicStarter Overlay
    DeniNikitin
    Offline

    DeniNikitin Опытный в 1С

    Регистрация:
    2 июл 2008
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    Я это понимаю, но не пойму как мой запрос модифицировать для 5-и значений! Для 2-х он работает идеально и делает всё что -нужно, а вот как для 5-и?
  6. leemuar
    Offline

    leemuar Опытный в 1С

    Регистрация:
    21 окт 2010
    Сообщения:
    310
    Симпатии:
    0
    Баллы:
    26
    Модифицируйте запрос с использованием конструкции языка запросов "В (...)". Это позволит вам получить любое количество характеристик без изменения запроса - хоть 5, хоть 100
  7. TopicStarter Overlay
    DeniNikitin
    Offline

    DeniNikitin Опытный в 1С

    Регистрация:
    2 июл 2008
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    А пример можно?
  8. leemuar
    Offline

    leemuar Опытный в 1С

    Регистрация:
    21 окт 2010
    Сообщения:
    310
    Симпатии:
    0
    Баллы:
    26
    В моем случае я получил список значений нужных мне свойств - "Формат" и "Проект" - для всех характеристик номенклатуры "Плакат MS"

    Вложения:

    • code.jpg
      code.jpg
      Размер файла:
      129,2 КБ
      Просмотров:
      399
  9. TopicStarter Overlay
    DeniNikitin
    Offline

    DeniNikitin Опытный в 1С

    Регистрация:
    2 июл 2008
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    А как сюда ещё запихать и условие на значение свойства?
  10. leemuar
    Offline

    leemuar Опытный в 1С

    Регистрация:
    21 окт 2010
    Сообщения:
    310
    Симпатии:
    0
    Баллы:
    26
    А зачем вам усложнять и запихивать это в запрос? Пройдитесь по результату запроса, там и проверяйте свойство и значение:



    Код:
    Для Каждого СтрокаРезультата ИЗ РезультатЗапроса Цикл
    ТребуемоеЗначениеСвойства = ПолучитьТребуемоеЗначениеСвойства(СтрокаРезультата.Свойство);
    Если СтрокаРезультата.ЗначениеСвойства <> ТребуемоеЗначениеСвойства Тогда
    // ... обработаем
    КонецЕсли
    КонецЦикла;
    
    Функция ПолучитьТребуемоеЗначениеСвойства(Свойство)
    // что-то вроде
    Если Свойство = "Проект"
    Возврат "1С";
    ИначеЕсли Свойство = "Размер" Тогда
    Возврат 45;
    ИначеЕсли
    // ... и т.д.
    КонецЕсли
    КонецПроцедуры
    

    Список требуемых свойств и их значений лучше определить, например, на форме, в виде таблицы Свойство - НужноеЗначение
  11. TopicStarter Overlay
    DeniNikitin
    Offline

    DeniNikitin Опытный в 1С

    Регистрация:
    2 июл 2008
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    Добил запрос! Без циклов делает,то-что надо!
    Сам запрос!


    Код:
    ВЫБРАТЬ
    ХарактеристикиНоменклатуры.Ссылка КАК Характеристика,
    СУММА(1) КАК Совпадения
    ИЗ
    Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
    ПО (ЗначенияСвойствОбъектов.Объект = ХарактеристикиНоменклатуры.Ссылка)
    И (ХарактеристикиНоменклатуры.Владелец = &Номенклатура)
    ГДЕ
    (ЗначенияСвойствОбъектов.Свойство = &Свойство1
    И ЗначенияСвойствОбъектов.Значение = &Значение1)
    ИЛИ (ЗначенияСвойствОбъектов.Свойство = &Свойство2
    И ЗначенияСвойствОбъектов.Значение = &Значение2)
    ...
    ИЛИ (ЗначенияСвойствОбъектов.Свойство = &СвойствоN
    И ЗначенияСвойствОбъектов.Значение = &ЗначениеN)
    СГРУППИРОВАТЬ ПО
    ХарактеристикиНоменклатуры.Ссылка
    ИМЕЮЩИЕ
    СУММА(1) = &КоличествоУсловий
  12. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    ИМХО - неправильно. в СКД заложена работа с характеристиками. посмотрите в книге "разработка сложных отчетов" какие настройки надо сделать, чтобы подключить свойства.
  13. TopicStarter Overlay
    DeniNikitin
    Offline

    DeniNikitin Опытный в 1С

    Регистрация:
    2 июл 2008
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26
    Как работает в СКД я знаю! А мне надо при загрузке из excel проверять есть ли характеристики или нету, поэтому СКД тут не причём!!!
  14. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.410
    Симпатии:
    316
    Баллы:
    104
    Эм. И как вы задаете для такого запроса параметры &Свойство.. и &Значение..?
  15. TopicStarter Overlay
    DeniNikitin
    Offline

    DeniNikitin Опытный в 1С

    Регистрация:
    2 июл 2008
    Сообщения:
    51
    Симпатии:
    0
    Баллы:
    26

    Код:
    //Размер
    СвойствоРазмер=ПланыВидовХарактеристик.СвойстваОбъектов.НайтиПоКоду("00000000009");
    СпрРазмер=ПолучитьЗначенияСвойствОбъектов("48",СвойствоРазмер);
    Запрос.УстановитьПараметр("Свойство",СвойствоРазмер);
    Запрос.УстановитьПараметр("Значение",СпрРазмер);
    Функция ПолучитьЗначенияСвойствОбъектов(Знач тЗнач,Свойство)
    Если НЕ ЗначениеЗаполнено(тЗнач) Тогда
    Возврат Справочники.ЗначенияСвойствОбъектов.ПустаяСсылка();
    КонецЕсли;
    Спр=Справочники.ЗначенияСвойствОбъектов.НайтиПоНаименованию(тЗнач,Истина);
    Если Спр.Пустая() Тогда
    Спр=Справочники.ЗначенияСвойствОбъектов.СоздатьЭлемент();
    Спр.Владелец=Свойство;
    Спр.Наименование= тЗнач;
    Спр.Записать();
    Возврат Спр.Ссылка;
    Иначе
    Возврат Спр;
    КонецЕсли;
    КонецФункции // ()

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