Выполнение запросов

Для выполнения запросов к базе данных 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...