Объектная модель схемы запроса Периодически во встроенном языке возникает необходимость изменения текста запроса в зависимости от разных алгоритмических условий. Раньше подобная задача решалась путём непосредственного формирования нужного текста запроса в виде строки. А это не всегда удобно и зачастую очень громоздко.
Теперь во встроенном языке мы реализовали объектную модель схемы запроса. Вы можете создать пустую схему запроса конструктором и загрузить в неё имеющийся текст запроса. После этого отдельные элементы текста запроса будут доступны вам как свойства объектной модели.
На рисунке ниже стрелки показывают, в каких объектах встроенного языка будут доступны те или иные элементы простого запроса, загруженного в схему:
Редактирование текста запроса с помощью объектной модели позволяет вам проще и понятнее модифицировать имеющиеся запросы. Или даже создавать их во встроенном языке «с нуля». А затем просто получать готовый текст запроса из схемы методом ПолучитьТекстЗапроса() .
Пример использования Схемы запроса Код 1C v 8.3
СхемаЗапроса = Новый СхемаЗапроса;
ЗапросВыбораИзИБ = СхемаЗапроса. ПакетЗапросов[0 ];
ЗапросВыбораИзИБ. ТаблицаДляПомещения = "ТаблицаОбороты" ;
ЗапросВыбораИзИБ. ВыбиратьРазрешенные = Истина ;
ОператорВыбораЗакупок = ЗапросВыбораИзИБ. Операторы[0 ];
ИсточникНоменклатура = ОператорВыбораЗакупок. Источники. Добавить( "Справочник.Номенклатура" , "Товары" ) ;
ИсточникЗакупки = ОператорВыбораЗакупок. Источники. Добавить( "РегистрНакопления.Закупки.Обороты" , "Закупки" ) ;
ИсточникЗакупки. Источник. Параметры[0 ]. Выражение = Новый ВыражениеСхемыЗапроса( "&Начало" ) ;
ИсточникЗакупки. Источник. Параметры[1 ]. Выражение = Новый ВыражениеСхемыЗапроса( "&Окончание" ) ;
ИсточникЗакупки. Источник. Параметры[2 ]. Выражение = Новый ВыражениеСхемыЗапроса( "Месяц" ) ;
ИсточникЗакупки. Соединения[0 ]. ТипСоединения = ТипСоединенияСхемыЗапроса. ПравоеВнешнее;
ОператорВыбораЗакупок. ВыбираемыеПоля. Добавить( "Товары.Ссылка" ) ;
ОператорВыбораЗакупок. ВыбираемыеПоля. Добавить( "Закупки.Период" ) ;
ОператорВыбораЗакупок. ВыбираемыеПоля. Добавить( "ЕСТЬNULL(Закупки.СуммаОборот, 0)" ) ;
ОператорВыбораЗакупок. ВыбираемыеПоля. Добавить( "0" ) ;
ЗапросВыбораИзИБ. Колонки[0 ]. Псевдоним = "Номенклатура" ;
ЗапросВыбораИзИБ. Колонки[1 ]. Псевдоним = "Период" ;
ЗапросВыбораИзИБ. Колонки[2 ]. Псевдоним = "СуммаЗакупок" ;
ЗапросВыбораИзИБ. Колонки[3 ]. Псевдоним = "СуммаПродаж" ;
ОператорВыбораЗакупок. Отбор. Добавить( "НЕ Товары.ЭтоГруппа" ) ;
ОператорВыбораПродаж = ЗапросВыбораИзИБ. Операторы. Добавить( ) ;
ИсточникНоменклатура = ОператорВыбораПродаж. Источники. Добавить( "Справочник.Номенклатура" , "Товары" ) ;
ОператорВыбораПродаж. ВыбираемыеПоля. Добавить( "Товары.Ссылка" ) ;
ИсточникПродажи = ОператорВыбораПродаж. Источники. Добавить( "РегистрНакопления.Продажи.Обороты" , "Продажи" ) ;
ИсточникПродажи. Источник. Параметры[0 ]. Выражение = Новый ВыражениеСхемыЗапроса( "&Начало" ) ;
ИсточникПродажи. Источник. Параметры[1 ]. Выражение = Новый ВыражениеСхемыЗапроса( "&Окончание" ) ;
ИсточникПродажи. Источник. Параметры[2 ]. Выражение = Новый ВыражениеСхемыЗапроса( "Месяц" ) ;
ИсточникПродажи. Соединения[0 ]. ТипСоединения = ТипСоединенияСхемыЗапроса. ПравоеВнешнее;
ОператорВыбораПродаж. ВыбираемыеПоля. Добавить( "Продажи.Период" ) ;
ВыражениеЗакупки = ОператорВыбораПродаж. ВыбираемыеПоля. Добавить( "0" ) ;
ВыражениеПродажи = ОператорВыбораПродаж. ВыбираемыеПоля. Добавить( "ЕСТЬNULL(Продажи.СуммаОборот, 0)" ) ;
ЗапросВыбораИзИБ. Колонки[2 ]. Поля. Установить( 1 , ВыражениеЗакупки) ;
ЗапросВыбораИзИБ. Колонки[3 ]. Поля. Установить( 1 , ВыражениеПродажи) ;
ОператорВыбораПродаж. Отбор. Добавить( "НЕ Товары.ЭтоГруппа" ) ;
ЗапросВыбораИзИБ. Индекс. Добавить( ЗапросВыбораИзИБ. Колонки[0 ]) ;
ЗапросВыбораИзИБ. Индекс. Добавить( ЗапросВыбораИзИБ. Колонки[1 ]) ;
ОператорВыбораПродаж. ВыбиратьРазличные = Истина ;
ОператорВыбораПродаж. КоличествоПолучаемыхЗаписей = 100 ;
ЗапросВыбораИзВТ = СхемаЗапроса. ПакетЗапросов. Добавить( ) ;
ОператорВыбрать = ЗапросВыбораИзВТ. Операторы[0 ];
Источник = ОператорВыбрать. Источники. Добавить( "ТаблицаОбороты" , "ТаблицаОбороты" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "ТаблицаОбороты.Номенклатура" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "ТаблицаОбороты.Период" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "СУММА(ТаблицаОбороты.СуммаЗакупок)" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "СУММА(ТаблицаОбороты.СуммаПродаж)" ) ;
ОператорВыбрать. Отбор. Добавить( "СУММА(ТаблицаОбороты.СуммаЗакупок) > 0" ) ;
ЗапросВыбораИзВТ. Колонки[0 ]. Псевдоним = "Номенклатура" ;
ЗапросВыбораИзВТ. Колонки[1 ]. Псевдоним = "Период" ;
ЗапросВыбораИзВТ. Колонки[2 ]. Псевдоним = "СуммаЗакупок" ;
ЗапросВыбораИзВТ. Колонки[3 ]. Псевдоним = "СуммаПродаж" ;
ЗапросВыбораИзВТ. Порядок. Добавить( ЗапросВыбораИзВТ. Операторы[0 ]. Источники[0 ]. Источник. ДоступныеПоля[0 ]. Поля[6 ]) ;
ЗапросВыбораИзВТ. Порядок. Добавить( ЗапросВыбораИзВТ. Колонки[1 ]) ;
ИтогНоменклатура = ЗапросВыбораИзВТ. КонтрольныеТочкиИтогов. Добавить( ЗапросВыбораИзВТ. Колонки[0 ]) ;
ИтогНоменклатура. ТипКонтрольнойТочки = ТипКонтрольнойТочкиСхемыЗапроса. ТолькоИерархия;
ЗапросВыбораИзВТ. ОбщиеИтоги = Истина ;
ЗапросВыбораИзВТ. ВыраженияИтогов. Добавить( ЗапросВыбораИзВТ. Колонки[2 ]) ;
ЗапросВыбораИзВТ. ВыраженияИтогов. Добавить( ЗапросВыбораИзВТ. Колонки[3 ]) ;
ЗапросУничтоженияВТ = СхемаЗапроса. ПакетЗапросов. Добавить( Тип( "ЗапросУничтоженияТаблицыСхемыЗапроса" ) ) ;
ЗапросУничтоженияВТ. ИмяТаблицы = "ТаблицаОбороты" ;
Если ЗначениеЗаполнено( Организация) Тогда
ОператорВыбораЗакупок. Отбор. Добавить( "Закупки.Организация = &Организация" ) ;
ОператорВыбораПродаж. Отбор. Добавить( "Продажи.Организация = &Организация" ) ;
КонецЕсли ;
Если ЗначениеЗаполнено( Склад) Тогда
ОператорВыбораЗакупок. Отбор. Добавить( "Закупки.Склад = &Склад" ) ;
ОператорВыбораПродаж. Отбор. Добавить( "Продажи.Склад = &Склад" ) ;
КонецЕсли ;
ЗапросИзРегистраЦен = СхемаЗапроса. ПакетЗапросов. Добавить( ) ;
ЗапросИзРегистраЦен. ТаблицаДляПомещения = "ВТ_ЦеныНоменклатуры" ;
ОператорВыбрать = ЗапросИзРегистраЦен. Операторы[0 ];
Источник = ОператорВыбрать. Источники. Добавить( "РегистрСведений.ЦеныНоменклатуры.СрезПоследних" , "ЦеныНоменклатурыСрезПоследних" ) ;
ОператорВыбрать. ВыбираемыеПоля. Добавить( "ЦеныНоменклатурыСрезПоследних.Номенклатура" ) ;
ОператорВыбрать. Отбор. Добавить( "ЦеныНоменклатурыСрезПоследних.Цена > &Цена" ) ;
СхемаЗапроса. ПакетЗапросов. Сдвинуть( СхемаЗапроса. ПакетЗапросов. Индекс( ЗапросИзРегистраЦен) , 0 ) ;
ОператорВыбораЗакупок. Отбор. Добавить( "Закупки.Номенклатура В (ВЫБРАТЬ ВТ_ЦеныНоменклатуры.Номенклатура ИЗ ВТ_ЦеныНоменклатуры КАК ВТ_ЦеныНоменклатуры)" ) ;
ОператорВыбораПродаж. Отбор. Добавить( "Продажи.Номенклатура В (ВЫБРАТЬ ВТ_ЦеныНоменклатуры.Номенклатура ИЗ ВТ_ЦеныНоменклатуры КАК ВТ_ЦеныНоменклатуры)" ) ;
СхемаЗапроса = Новый СхемаЗапроса;
КоллекцияОператоры = СхемаЗапроса. ПакетЗапросов[0 ]. Операторы;
Для каждого ГруппаТаблиц Из СхемаЗапроса. ПакетЗапросов[0 ]. ДоступныеТаблицы Цикл
Если ГруппаТаблиц. Представление = "Справочники"
ИЛИ ГруппаТаблиц. Представление = "ПланыСчетов"
ИЛИ ГруппаТаблиц. Представление = "ПланыВидовРасчета"
ИЛИ ГруппаТаблиц. Представление = "ПланыВидовХарактеристик" Тогда
Для каждого Таблица Из ГруппаТаблиц. Состав Цикл
Для каждого ПолеТаблицы Из Таблица. Поля Цикл
Если ПолеТаблицы. Имя = "ИмяПредопределенныхДанных" Тогда
НовыйОператор = КоллекцияОператоры. Добавить( ) ;
НовыйИсточник = НовыйОператор. Источники. Добавить( Таблица, "СправочникИмя" ) ;
НовыйОператор. ВыбираемыеПоля. Добавить( """ " + Таблица. Имя+ """ " ) ;
НовыйОператор. ВыбираемыеПоля. Добавить( "КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СправочникИмя.ИмяПредопределенныхДанных)" ) ;
НовыйОператор. Группировка. Добавить( "СправочникИмя.ИмяПредопределенныхДанных" ) ;
НовыйОператор. Отбор. Добавить( "СправочникИмя.Предопределенный" ) ;
НовыйОператор. Отбор. Добавить( "КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СправочникИмя.Ссылка) > 1" ) ;
Продолжить;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
Категория:
Запросы Сохранить файл на диске полученный из реквизита типа хранилище значения Код 1C v 8.х // Параметры
// Хранилище – ХранилищеЗначения, которое содержит объект типа
// ДвоичныеДанные с файлом для записи на диск.
// ИмяФайла – Строка, содержащая полное имя файла.
// ТолькоЧтение – Булево, признак установки записываемому файлу атрибута ТолькоЧтение.
// СпособПерезаписи – Строка. Параметр определеляет способ перезаписи существующих
// файлов на диске. В зависимости от пришедшего параметра выдается или
// не выдается запрос на перезапись файлов. Может устанавливаться в теле
// функции, если это необходимо. Принимаемые значения:
// "" (пустая строка) - это означает, что диалог еще ни разу не задавался
// и при наличии существующего файла будет выдан диалог запроса перезаписи.
// ДА - предыдущий файл был перезаписан, но перезапись текущего надо
// запросить снова
// НЕТ - предыдущий файл не был перезаписан, но перезапись текущего надо
// запросить снова
// ДАДЛЯВСЕХ - предыдущий файл был перезаписан, и все последующие тоже
// надо перезаписывать.
// НЕТДЛЯВСЕХ - предыдущий файл не был перезаписан, и все последующие тоже
// не надо перезаписывать.
//
// Возвращаемое значение:
// Булево – Истина, если каталог выбран, Ложь, если нет.
//
Функция СохранитьФайлНаДиске(Хранилище, ИмяФайла, ТолькоЧтение, СпособПерезаписи, ВопросОПерезаписи = Истина, ИмяСправочника = "удХранилище") Экспорт
Попытка
ФайлНаДиске = Новый Файл(ИмяФайла);
КаталогНаДиске = Новый Файл(ФайлНаДиске.Путь);
Если Не КаталогНаДиске.Существует() Тогда
СоздатьКаталог(ФайлНаДиске.Путь);
КонецЕсли;
Если ФайлНаДиске.Существует() И ВопросОПерезаписи = Истина Тогда
Если СпособПерезаписи = ""
ИЛИ Врег(СпособПерезаписи) = "ДА"
ИЛИ Врег(СпособПерезаписи) = "НЕТ" Тогда
ФормаЗапросаПерезаписиФайлов = Справочники[ИмяСправочника].ПолучитьФорму("ФормаЗапросаПерезаписиФайлов");
ФормаЗапросаПерезаписиФайлов.ТекстПредупреждения =
"На локальном диске уже существует файл:
|" + ИмяФайла + "
|Перезаписать имеющийся файл?";
СпособПерезаписи = ФормаЗапросаПерезаписиФайлов.ОткрытьМодально();
Если СпособПерезаписи = Неопределено
ИЛИ Врег(СпособПерезаписи) = "НЕТ"
ИЛИ Врег(СпособПерезаписи) = "НЕТДЛЯВСЕХ" Тогда
Возврат Ложь;
КонецЕсли;
ИначеЕсли Врег(СпособПерезаписи) = "НЕТДЛЯВСЕХ" Тогда
Возврат Ложь;
КонецЕсли;
// Если существующему файлу установлено ТолькоЧтение, отменим эту установку.
Если ФайлНаДиске.ПолучитьТолькоЧтение() Тогда
ФайлНаДиске.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
КонецЕсли;
// Остались случаи когда:
// - пользователь ответил Да или ДаДляВсех в текущем диалоге
// - способ перезаписи уже пришел со значением ДаДляВсех
Если ТипЗнч(Хранилище) <> Тип("ДвоичныеДанные") Тогда
ДвоичныеДанные = Хранилище.Получить();
Иначе
ДвоичныеДанные = Хранилище;
КонецЕсли;
ДвоичныеДанные.Записать(ИмяФайла);
ФайлНаДиске.УстановитьТолькоЧтение(ТолькоЧтение);
Исключение
Предупреждение(ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
Возврат Истина;
КонецФункции
Категория:
Работа с Хранилищем Значений