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