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

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

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

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

$результат = $текЗапрос->Выполнить();

foreach ($результат as $стр) {
	echo("Наименование: {$стр->Наименование}; Артикул: {$стр->Артикул} <br/>");
}
$текЗапрос = $клиент->СоздатьЗапрос();

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

$результат = $текЗапрос->Выполнить();

foreach ($результат as $стр) {
	echo($стр->Ссылка);
}

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

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

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

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

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

$текЗапрос->УстановитьПараметр("Артикул", "Т-0001");

$результат = $текЗапрос->Выполнить();

foreach ($результат as $стр) {
	echo("Наименование: {$стр->Наименование} <br/>");
}
$текЗапрос = $клиент->СоздатьЗапрос("
	ВЫБРАТЬ
		Номенклатура.Код КАК Код,
		Номенклатура.Наименование КАК Наименование
	ИЗ
		Справочник.Номенклатура КАК Номенклатура
	ГДЕ
		Номенклатура.Ссылка В ИЕРАРХИИ(&Группы)
		И Номенклатура.ЭтоГруппа = ЛОЖЬ
");

$текЗапрос->УстановитьПараметр("Группы", array(
	$клиент->Справочники->Номенклатура->НайтиПоНаименованию("Бытовая техника"),
	$клиент->Справочники->Номенклатура->НайтиПоНаименованию("Мебель")
));

$результат = $текЗапрос->Выполнить();

foreach ($результат as $стр) {
	echo("Наименование: {$стр->Наименование} <br/>");
}

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

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

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

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

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

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

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

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

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

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

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

$результат = $текЗапрос->Выполнить();

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

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

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

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

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

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

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

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

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

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

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

foreach ($массивРезультатов as $текДерево) {
	// TODO...
}