Выполнение запросов
Для выполнения запросов к базе данных 1С необходимо создать объект класса "Запорос". Длы создания нового запроса воспользуйтесь методом "СоздатьЗапрос()" объекта "БромКлиент". Для выполнения запроса воспользуйтесь методом "Выполнить()".
текЗапрос = клиент.СоздатьЗапрос("""
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.ЭтоГруппа = ЛОЖЬ
УПОРЯДОЧИТЬ ПО
Наименование
""")
результат = текЗапрос.Выполнить()
for стр in результат:
print("Наименование: {0}; Артикул: {1}".format(стр.Наименование, стр.Артикул))
текЗапрос = клиент.СоздатьЗапрос()
запрос.Текст = """
ВЫБРАТЬ
СтавкиНДС.Ссылка КАК Ссылка
ИЗ
Перечисление.СтавкиНДС КАК СтавкиНДС
""")
результат = текЗапрос.Выполнить()
for стр in результат:
print(стр.Ссылка)
Метод "Выполнить()" принимает опциональный параметр "типОбхода". В зависимости от указанного типа обхода результатов возвращается либо "ТаблицаЗначений", либо "ДеревоЗначений". Тип обхода может принимать следующие значения:
- Прямой;
- ПоГруппировкам;
- ПоГруппировкамСИерархией.
Параметризованные запросы
Текст запроса может содержать параметры. Для передачи значения параметров воспользуйтесь методом "УстановитьПараметр()" объекта "Запрос". В качетсве значения параметра может передаваться любое значение сериализуемого типа, в том числе ссылки и массивы. В следующих примерах демонстрируется выполнение параметризованных запросов:
текЗапрос = клиент.СоздатьЗапрос("""
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Артикул = &Артикул
""")
текЗапрос.УстановитьПараметр("Артикул", "Т-0001")
результат = текЗапрос.Выполнить()
for стр in результат:
print("Наименование: {0}".format(стр.Наименование))
текЗапрос = клиент.СоздатьЗапрос("""
ВЫБРАТЬ
Номенклатура.Код КАК Код,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
Номенклатура.Ссылка В ИЕРАРХИИ(&Группы)
И Номенклатура.ЭтоГруппа = ЛОЖЬ
""")
текЗапрос.УстановитьПараметр("Группы", [
клиент.Справочники.Номенклатура.НайтиПоНаименованию("Бытовая техника"),
клиент.Справочники.Номенклатура.НайтиПоНаименованию("Мебель")
])
результат = текЗапрос.Выполнить()
for стр in результат:
print("Наименование: {0}".format(стр.Наименование))
Шаблонизированные запросы с допостроением
Формирование и выполнение запросов на стороне 1С происходит с использованием построителя запросов. По этой причине в качестве текста запроса может быть передан шаблон запроса с разметкой для построителя.
При формировании конечного текста запроса учитываются:
- дополнительные поля запроса, установленные через метод "ДобавитьПоле()";
- дополнительные условия отбора, установленные через метод "ДобавитьУсловиеОтбора()";
- дополнительные поля сортировки, установленные через метод "ДобавитьУпорядочение()".
# Передаем шаблон запроса
текЗапрос = клиент.СоздатьЗапрос("""
ВЫБРАТЬ ПЕРВЫЕ 5
ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
{ВЫБРАТЬ
Номенклатура.*}
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
{(&Период)},
{ (Номенклатура).*, (Характеристика).*}
) КАК ЦеныНоменклатурыСрезПоследних
{ГДЕ
ЦеныНоменклатурыСрезПоследних.Цена}
{УПОРЯДОЧИТЬ ПО
Номенклатура.*,
Характеристика.*}
""");
# Добавляем дополнительное поле запроса с указанием синонима поля
текЗапрос.ДобавитьПоле("Номенклатура.Производитель.Наименование", "Бренд")
# Добавляем дополнительный отбор по цене
текЗапрос.ДобавитьУсловиеОтбора("Цена", 100, ВидСравнения.БольшеИлиРавно)
# Указываем дополнительное упорядочение по двум полям
текЗапрос.ДобавитьУпорядочение("Номенклатура.Производитель")
текЗапрос.ДобавитьУпорядочение("Характеристика", НаправлениеСортировки.Убывание)
результат = текЗапрос.Выполнить()
# Передаем шаблон запроса
текЗапрос = клиент.СоздатьЗапрос("""
ВЫБРАТЬ
ЗаказКлиентаТовары.Ссылка КАК Заказ,
ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
ЗаказКлиентаТовары.Количество КАК Количество
{ВЫБРАТЬ
Ссылка.* КАК Заказ,
Номенклатура.*}
ИЗ
Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
{ГДЕ
ЗаказКлиентаТовары.Ссылка.* КАК Заказ,
ЗаказКлиентаТовары.Номенклатура.*}
{УПОРЯДОЧИТЬ ПО
ЗаказКлиентаТовары.Ссылка.* КАК Заказ,
ЗаказКлиентаТовары.Номенклатура.*}
""")
# Добавляем дополнительные поля
текЗапрос.ДобавитьПоле("Заказ.Номер", "НомерЗаказа")
текЗапрос.ДобавитьПоле("Заказ.Дата", "ДатаЗаказа")
текЗапрос.ДобавитьПоле("Номенклатура.Производитель", "Производитель")
# Добавляем дополнительные условия отбора
текЗапрос.ДобавитьУсловиеОтбора("Заказ.Проведен", True)
текЗапрос.ДобавитьУсловиеОтбора("Заказ.Дата", datetime.date(2019, 1, 1), ВидСравнения.БольшеИлиРавно)
текЗапрос.ДобавитьУсловиеОтбора("Номенклатура.Родитель.Наименование", "Мебель")
# Добавляем дополнительные поля сортировки
текЗапрос.ДобавитьУпорядочение("Заказ.Дата", НаправлениеСортирвки.Убывание)
текЗапрос.ДобавитьУпорядочение("Номенклатура.Наименование")
результат = текЗапрос.Выполнить()
Пакетные запросы
Для получения результатов пакета запросов необходимо вызвать метод "ВыполинтьПакет()". Результатом выполнения пакетного запроса будет массив таблиц или массив деревьев в зависимости от типа обхода результатов.
текЗапрос = клиент.СоздатьЗапрос("""
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ПОМЕСТИТЬ тНомеклатура
ИЗ
Справочник.Номенклатура КАК Номенклатура
ИНДЕКСИРОВАТЬ ПО
Ссылка
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
тНомеклатура.Ссылка КАК Ссылка,
тНомеклатура.Наименование КАК Наименование,
тНомеклатура.Артикул КАК Артикул,
ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
ИЗ
тНомеклатура КАК тНомеклатура
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
ПО тНомеклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
""")
массивРезультатов = текЗапрос.ВыполнитьПакет(ОбходРезультатаЗапроса.Прямой)
for текТабл in массивРезультатов:
# TODO...
текЗапрос = клиент.СоздатьЗапрос("""
ВЫБРАТЬ
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Номенклатура.Ссылка ИЕРАРХИЯ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Контрагенты.Наименование КАК Наименование,
Контрагенты.ИНН КАК ИНН
ИЗ
Справочник.Контрагенты КАК Контрагенты
УПОРЯДОЧИТЬ ПО
Контрагенты.Ссылка ИЕРАРХИЯ
""")
массивРезультатов = текЗапрос.ВыполнитьПакет(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией)
for текДерево in массивРезультатов:
# TODO...