Read professional hostgator reviews wrote by customers. Also check out these great inmotion reviews web hosting.

Использование параметров в запросах

Автор: Дмитрий Котельников

Запросы в какой то степени абстрагированы от основного кода 1С, для того чтобы придать им гибкость существуют параметры. Параметр в запросе объявляется через аперсанд &, следующая за ним последовательность символов до пробела считается именем параметра. Передача параметра в запрос происходит путем конструкции

УстановитьПараметр("<ИмяПараметра>", <ЗначениеПараметра>):

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТД", ТекущаяДата());
    Запрос.Текст =
        "ВЫБРАТЬ
        |    РАЗНОСТЬДАТ(ДАТАВРЕМЯ(2013, 2, 28), &ТД, ДЕНЬ) КАК ДнейДоКонцаЗимы,
        |    &ТД КАК ТекущаяДата";

Раздувать эту тему я не вижу смысла, надеюсь с передачей примитивных типов в запрос у вас проблем не возникнет. Лучше рассмотрим более интересные ситуации...

Операторы В/В ИЕРАРХИИ и параметры

На самом деле в запрос можно передать и списочные параметры, как массив, так и список значений подходят для этих целей идеально:

    МассивМебели = Новый Массив();
    МассивМебели.Добавить("Стол");
    МассивМебели.Добавить("Стул");
    
    СписокМебели = Новый СписокЗначений;
    СписокМебели.Добавить("Диван");
    СписокМебели.Добавить("Шкаф");
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("МассивМебели", МассивМебели);
    Запрос.УстановитьПараметр("СписокМебели", СписокМебели);
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Товары.Ссылка КАК СсылкаНаТовар
        |ИЗ
        |    Справочник.Товары КАК Товары
        |ГДЕ
        |    (Товары.Наименование В (&МассивМебели)
        |            ИЛИ Товары.Наименование В ИЕРАРХИИ (&СписокМебели))";

Чем отличается оператор В от В ИЕРАРХИИ рассматривалось в разделе Функции языка запросов 1С 8.

Передача таблицы в запрос

В запрос можно передать таблицу значений для двух целей:

  • использование ее в качестве операнда сравнения;
  • использования в качестве источника данных;

В первом случае все просто мы также можем использовать таблицу в связке с операторами В/В ИЕРАРХИИ по такому шаблону: (ПолеЗапроса1, ПолеЗапроса2, ... ,ПолеЗапросаN) В/В ИЕРАРХИИ (&ТЗ). Но передаваемая таблица должна иметь N и больше полей, а также имена колонок таблицы должны совпадать с именами полей запроса, остальные колонки таблицы игнорируются. Пример:

    ТаблицаМебели = новый ТаблицаЗначений;
    ТаблицаМебели.Колонки.Добавить("Наименование");
    ТаблицаМебели.Колонки.Добавить("Артикул");
    ТаблицаМебели.Колонки.Добавить("Цена");
    //--
    Стр = ТаблицаМебели.Добавить();
    Стр.Наименование = "Стул";
    Стр.Артикул = "00001";
    Стр.Цена = 1000;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТаблицаМебели", ТаблицаМебели);
    Запрос.Текст =
        "ВЫБРАТЬ
        |    Товары.Ссылка КАК СсылкаНаТовар
        |ИЗ
        |    Справочник.Товары КАК Товары
        |ГДЕ
        //колонка Цена игнорируется
        |    (Товары.Наименование, Товары.Артикул) В (&ТаблицаМебели)";

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

    ТаблицаМебели = новый ТаблицаЗначений;
    ТаблицаМебели.Колонки.Добавить("Наименование" ,Новый ОписаниеТипов("Строка"));
    ТаблицаМебели.Колонки.Добавить("Артикул"      ,Новый ОписаниеТипов("Строка"));
    ТаблицаМебели.Колонки.Добавить("Цена"         ,Новый ОписаниеТипов("Число"));
    //--
    Стр = ТаблицаМебели.Добавить();
    Стр.Наименование = "Стул";
    Стр.Артикул = "00001";
    Стр.Цена = 1000;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ТаблицаМебели", ТаблицаМебели);
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ТаблицаМебели.Наименование,
        |    ТаблицаМебели.Артикул,
        |    ТаблицаМебели.Цена
        |ПОМЕСТИТЬ ВТ_ТаблицаМебели
        |ИЗ
        |    &ТаблицаМебели КАК ТаблицаМебели
        |;
        //после того как сформировали временную таблицу
        //можем работать с ней как с обычной таблицей БД (базы данных)
        |ВЫБРАТЬ
        |    ВТ_ТаблицаМебели.Наименование КАК Наименование,
        |    ВТ_ТаблицаМебели.Артикул КАК Артикул,
        |    ВТ_ТаблицаМебели.Цена КАК Цена
        |ИЗ
        |    ВТ_ТаблицаМебели КАК ВТ_ТаблицаМебели";

Важно! Если Вы передаете в запрос таблицу значений сформированную программно, как в примере, то обязательно указывайте типы колонок, иначе запрос вылетит с ошибкой.

 

← Объединение запросов | Работа с запросами 1С 8 из встроенного языка →

 

Добавить комментарий


Защитный код
Обновить

© 2012, Котельников Дмитрий. При любом копировании материалов ссылка на сайт-источник zapros-1c-8.ru обязательна.