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

Для выполнения запросов к базе данных 1С необходимо создать объект класса "ITworks.Brom.Запорос". Длы создания нового запроса воспользуйтесь методом "СоздатьЗапрос()" объекта "БромКлиент". Для выполнения запроса воспользуйтесь методом "Выполнить()".

Запрос запрос = клиент.СоздатьЗапрос(@"
	ВЫБРАТЬ
		Номенклатура.Ссылка КАК Ссылка,
		Номенклатура.Код КАК Код,
		Номенклатура.Наименование КАК Наименование,
		Номенклатура.Артикул КАК Артикул
	ИЗ
		Справочник.Номенклатура КАК Номенклатура
	ГДЕ
		Номенклатура.ЭтоГруппа = ЛОЖЬ

	УПОРЯДОЧИТЬ ПО
		Наименование			
");

ТаблицаЗначений результат = (ТаблицаЗначений)запрос.Выполнить();

foreach (dynamic стр in результат) {
	Console.WriteLine("Наименование: {0}; Артикул: {1}", стр.Наименование, стр.Артикул);
}
Запрос запрос = клиент.СоздатьЗапрос();

запрос.Текст = @"
	ВЫБРАТЬ
		СтавкиНДС.Ссылка КАК Ссылка
	ИЗ
		Перечисление.СтавкиНДС КАК СтавкиНДС			
");

ТаблицаЗначений результат = (ТаблицаЗначений)запрос.Выполнить();

foreach (dynamic стр in результат) {
	Console.WriteLine(стр.Ссылка);
}

Метод "Выполнить()" принимает опциональный параметр "типОбхода". В зависимости от указанного типа обхода результатов возвращается либо "ТаблицаЗначений", либо "ДеревоЗначений". Тип обхода может принимать следующие значения:

  • Прямой;
  • ПоГруппировкам;
  • ПоГруппировкамСИерархией.

Параметризованные запросы

Текст запроса может содержать параметры. Для передачи значения параметров воспользуйтесь методом "УстановитьПараметр" объекта "Запрос". В качетсве значения параметра может передаваться любое значение сериализуемого типа, в том числе ссылки и массивы. В следующих примерах демонстрируется выполнение параметризованных запросов:

Запрос запрос = клиент.СоздатьЗапрос(@"
	ВЫБРАТЬ
		Номенклатура.Ссылка КАК Ссылка,
		Номенклатура.Код КАК Код,
		Номенклатура.Наименование КАК Наименование
	ИЗ
		Справочник.Номенклатура КАК Номенклатура
	ГДЕ
		Номенклатура.Артикул = &Артикул			
");
запрос.УстановитьПараметр("Артикул", "Т-0001");

ТаблицаЗначений результат = (ТаблицаЗначений)запрос.Выполнить();

foreach (dynamic стр in результат) {
	Console.WriteLine("Наименование: {0}", стр.Наименование);
}
Запрос запрос = клиент.СоздатьЗапрос(@"
	ВЫБРАТЬ
		Номенклатура.Код КАК Код,
		Номенклатура.Наименование КАК Наименование
	ИЗ
		Справочник.Номенклатура КАК Номенклатура
	ГДЕ
		Номенклатура.Ссылка В ИЕРАРХИИ(&Группы)
		И Номенклатура.ЭтоГруппа = ЛОЖЬ
");
запрос.УстановитьПараметр("Группы", new object[] {
	клиент.Справочники.Номенклатура.НайтиПоНаименованию("Бытовая техника"),
	клиент.Справочники.Номенклатура.НайтиПоНаименованию("Мебель")
});

ТаблицаЗначений результат = (ТаблицаЗначений)запрос.Выполнить();

foreach (dynamic стр in результат) {
	Console.WriteLine("Наименование: {0}", стр.Наименование);
}

Шаблонизированные запросы с допостроением

Формирование и выполнение запросов на стороне 1С происходит с использованием построителя запросов. По этой причине в качестве текста запроса может быть передан шаблон запроса с разметкой для построителя.

При формировании конечного текста запроса учитываются:

  • дополнительные поля запроса, установленные через метод "ДобавитьПоле()";
  • дополнительные условия отбора, установленные через метод "ДобавитьУсловиеОтбора()";
  • дополнительные поля сортировки, установленные через метод "ДобавитьУпорядочение()".
// Передаем шаблон запроса
Запрос текЗапрос = клиент.СоздатьЗапрос(@"
	ВЫБРАТЬ ПЕРВЫЕ 5
		ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура,
		ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика,
		ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
	{ВЫБРАТЬ
		Номенклатура.*}
	ИЗ
		РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
			{(&Период)}, 
			{ (Номенклатура).*, (Характеристика).*}
		) КАК ЦеныНоменклатурыСрезПоследних
	{ГДЕ
		ЦеныНоменклатурыСрезПоследних.Цена}
	{УПОРЯДОЧИТЬ ПО
		Номенклатура.*,
		Характеристика.*}
");

// Добавляем дополнительное поле запроса с указанием синонима поля
текЗапрос.ДобавитьПоле("Номенклатура.Производитель.Наименование", "Бренд");

// Добавляем дополнительный отбор по цене
текЗапрос.ДобавитьУсловиеОтбора("Цена", 100, ВидСравнения.БольшеИлиРавно);

// Указываем дополнительное упорядочение по двум полям
текЗапрос.ДобавитьУпорядочение("Номенклатура.Производитель");
текЗапрос.ДобавитьУпорядочение("Характеристика", НаправлениеСортировки.Убывание);

ТаблицаЗначений результат = (ТаблицаЗначений)текЗапрос.Выполнить();
// Передаем шаблон запроса
Запрос текЗапрос = клиент.СоздатьЗапрос(@"
	ВЫБРАТЬ
		ЗаказКлиентаТовары.Ссылка КАК Заказ,
		ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
		ЗаказКлиентаТовары.Количество КАК Количество
	{ВЫБРАТЬ
		Ссылка.* КАК Заказ,
		Номенклатура.*}
	ИЗ
		Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
	{ГДЕ
		ЗаказКлиентаТовары.Ссылка.* КАК Заказ,
		ЗаказКлиентаТовары.Номенклатура.*}
	{УПОРЯДОЧИТЬ ПО
		ЗаказКлиентаТовары.Ссылка.* КАК Заказ,
		ЗаказКлиентаТовары.Номенклатура.*}
");

// Добавляем дополнительные поля
текЗапрос.ДобавитьПоле("Заказ.Номер", "НомерЗаказа");
текЗапрос.ДобавитьПоле("Заказ.Дата", "ДатаЗаказа");
текЗапрос.ДобавитьПоле("Номенклатура.Производитель", "Производитель");

// Добавляем дополнительные условия отбора
текЗапрос.ДобавитьУсловиеОтбора("Заказ.Проведен", true);
текЗапрос.ДобавитьУсловиеОтбора("Заказ.Дата", new DateTime(2019, 1, 1), ВидСравнения.БольшеИлиРавно);
текЗапрос.ДобавитьУсловиеОтбора("Номенклатура.Родитель.Наименование", "Мебель");

// Добавляем дополнительные поля сортировки
текЗапрос.ДобавитьУпорядочение("Заказ.Дата", НаправлениеСортирвки.Убывание);
текЗапрос.ДобавитьУпорядочение("Номенклатура.Наименование");

ТаблицаЗначений результат = (ТаблицаЗначений)текЗапрос.Выполнить();

Пакетные запросы

Для получения результатов пакета запросов необходимо вызвать метод "ВыполинтьПакет()". Результатом выполнения пакетного запроса будет массив таблиц или массив деревьев в зависимости от типа обхода результатов.

Запрос текЗапрос = клиент.СоздатьЗапрос(@"
	ВЫБРАТЬ
		Номенклатура.Ссылка КАК Ссылка,
		Номенклатура.Наименование КАК Наименование,
		Номенклатура.Артикул КАК Артикул
	ПОМЕСТИТЬ тНомеклатура
	ИЗ
		Справочник.Номенклатура КАК Номенклатура

	ИНДЕКСИРОВАТЬ ПО
		Ссылка
	;

	////////////////////////////////////////////////////////////////////////////////
	ВЫБРАТЬ
		тНомеклатура.Ссылка КАК Ссылка,
		тНомеклатура.Наименование КАК Наименование,
		тНомеклатура.Артикул КАК Артикул,
		ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
	ИЗ
		тНомеклатура КАК тНомеклатура
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
			ПО тНомеклатура.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
");

dynamic массивРезультатов = текЗапрос.ВыполнитьПакет(ОбходРезультатаЗапроса.Прямой);

foreach (ТаблицаЗначений текТабл in массивРезультатов) {
	// TODO...
}
Запрос текЗапрос = клиент.СоздатьЗапрос(@"
	ВЫБРАТЬ
		Номенклатура.Наименование КАК Наименование,
		Номенклатура.Артикул КАК Артикул
	ИЗ
		Справочник.Номенклатура КАК Номенклатура

	УПОРЯДОЧИТЬ ПО
		Номенклатура.Ссылка ИЕРАРХИЯ
	;

	////////////////////////////////////////////////////////////////////////////////
	ВЫБРАТЬ
		Контрагенты.Наименование КАК Наименование,
		Контрагенты.ИНН КАК ИНН
	ИЗ
		Справочник.Контрагенты КАК Контрагенты

	УПОРЯДОЧИТЬ ПО
		Контрагенты.Ссылка ИЕРАРХИЯ
");

dynamic массивРезультатов = текЗапрос.ВыполнитьПакет(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

foreach (ДеревоЗначений текДерево in массивРезультатов) {
	// TODO...
}