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