Язык запросов
Хранение данных в 1С.
Реляционная схема.
Для ссылочных данных набор реквизитов хранится в основной таблице. В ней есть поле Ссылка, это ключ. Для табличной части создается подчиненная таблица со стандартными полями Ссылка, НомерСтроки и реквизитами табличной части. Связь с основной таблицей реализовано через поле Ссылка подчиненной таблицы. Кол-во подчиненных таблиц равно количеству табличных частей.
Для нессылочных данных (например регистр сведений), ключом является совокупность измерений (и периода в случае периодического регистра).
Есть реальные и виртуальные таблицы, виртуальные создаются динамически автоматическими запросами. Также есть реальные и виртуальные поля. Важно: поле Представление – виртуальное, генерируется в момент выполнения запроса.
Состав и описание таблиц в синтаксис-помощнике в разделе Работа с запросами - Таблицы запросов.
Запросы
Пример работы с запросом:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Наименование
|ИЗ
| Справочник.Товары";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаЗапроса = РезультатЗапроса.Выбрать();
Пока ВыборкаЗапроса.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ВыборкаЗапроса.Наименование;
Сообщение.Сообщить();
КонецЦикла;
Запрос состоит из следующих секций:
- описание запроса,
- объединение запросов,
- упорядочивание результатов,
- автоупорядочивание,
- описание итогов.
Для реальных полей поддерживается * для выбора всех полей. Виртуальные поля нужно задавать явно.
ВЫБРАТЬ
Справочник.Клиенты.*
Полный текст с получением столбцов в запросе:
&НаСервереБезКонтекста
Процедура ПолучитьВсюТаблицуНаСервере()
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| Справочник.Филиалы.*";
Результат = Запрос.Выполнить();
Если не Результат.Пустой() Тогда
ВыборкаДетальныеЗаписи = Результат.Выбрать();
РезультатЗапроса = ВыборкаДетальныеЗаписи.Владелец();
ПолнаяСтрокаОтвета = "";
Для Каждого Кол ИЗ РезультатЗапроса.Колонки Цикл
ПолнаяСтрокаОтвета = ПолнаяСтрокаОтвета + Кол.Имя + " ";
КонецЦикла;
Сообщить(ПолнаяСтрокаОтвета);
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
ПолнаяСтрокаОтвета = "";
Для Каждого Кол ИЗ РезультатЗапроса.Колонки Цикл
ПолнаяСтрокаОтвета = ПолнаяСтрокаОтвета + ВыборкаДетальныеЗаписи[Кол.Имя] + " ";
КонецЦикла;
Сообщить(ПолнаяСтрокаОтвета);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Упорядочивание результата.
Раздел УПОРЯДОЧИТЬ ПО, обязательно добавлять для определенности. Есть ВОЗР (по умолчанию, можно не указывать) и УБЫВ. Можно использовать поля вне блока ВЫБРАТЬ.
ВЫБРАТЬ
Цены.Товар КАК Товар,
Цены.Цена КАК Цена
ИЗ
РегистрСведений.Цены КАК Цены
УПОРЯДОЧИТЬ ПО
Цены.Период УБЫВ,
Цена
По типу Ссылка управляемо упорядочить нельзя. Однако с помощью автоупорядочивания можно вывести записи таблицы в наиболее естественном (ожидаемом пользователем) порядке. Для этого нужно упорядочить записи таблицы непосредственно по ссылочному полю, а затем использовать конструкцию АВТОУПОРЯДОЧИВАНИЕ
ВЫБРАТЬ
ЗаказТовара.Дата,
ЗаказТовара.Номер,
ЗаказТовара.Клиент,
ЗаказТовара.СуммаЗаказа
ИЗ
Документ.ЗаказТовара КАК ЗаказТовара
УПОРЯДОЧИТЬ ПО
ЗаказТовара.Ссылка
АВТОУПОРЯДОЧИВАНИЕ
Текстовое представление ссылочного поля
При выводе значения ссылочного поля для получения его представления выполняется дополнительный запрос к той таблице, на которую ссылается это ссылочное поле. В результате процесс замедляется. Для ускорения, нужно в запросе сразу получить текстовое представление ссылочного поля и затем уже его, а не саму ссылку, выводить в отчет или сообщение.
Каждая объектная таблица в информационной базе имеет виртуальное поле Представление. Это текстовое представление объекта. При получении данного поля запрос получает несколько полей, которые соответствуют прикладной сущности
объекта, а при получении значения поля из результата запроса преобразовывает полученные значения в строку. Варианты ПРЕДСТАВЛЕНИЕ(Товар) аналогично Товар.Представление, но лучше первый.
ВЫБРАТЬ
ОстаткиТоваров.Период,
ПРЕДСТАВЛЕНИЕ(ОстаткиТоваров.Регистратор) КАК Регистратор,
ОстаткиТоваров.Количество,
ОстаткиТоваров.Сумма
ИЗ
РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
Но результат функции ПРЕДСТАВЛЕНИЕ() не может быть использован в выражении языка запросов, в условиях сравнения
в предложении ГДЕ, в любых операциях.
Ограничение по количеству записей
ВЫБРАТЬ ПЕРВЫЕ 3
Непересекающаяся выборка
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЗаказТовара.Клиент,
ЗаказТовара.Дата
ИЗ
Документ.ЗаказТовара КАК ЗаказТовара
Если в запросе указано ключевое слово РАЗЛИЧНЫЕ и в предложении УПОРЯДОЧИТЬ ПО указано поле, отсутствующее в списке выборки, то при выполнении такого запроса будет выдана ошибка.
Получение данных табличной части
ВЫБРАТЬ
СоставЗаказа.Товар,
СоставЗаказа.Количество,
СоставЗаказа.Сумма
ИЗ
Документ.ЗаказТовара.Состав КАК СоставЗаказа
Этот запрос выведет все табличные части всех документов Заказ товара. Для получения также информации о реквизитах документа используется ссылка. Можно также установить условие.
ВЫБРАТЬ
СоставЗаказа.Ссылка.Номер,
СоставЗаказа.Ссылка.Клиент,
СоставЗаказа.Товар,
СоставЗаказа.Количество,
СоставЗаказа.Сумма
ИЗ
Документ.ЗаказТовара.Состав КАК СоставЗаказа
ГДЕ
СоставЗаказа.Ссылка = &Документ
Можно получить табличную часть в виде ссылки и затем обойти ее в цикле:
Ограничения на выборку
ВЫБРАТЬ
Накладная.Дата КАК Дата,
Накладная.Номер КАК Номер,
Накладная.Поставщик
ИЗ
Документ.ПриходнаяНакладная КАК Накладная
ГДЕ
Дата >= ДАТАВРЕМЯ(2012, 11, 01)
ВЫБРАТЬ
Клиенты.Наименование КАК Наименование,
Клиенты.Адрес,
Клиенты.Телефон
ИЗ
Справочник.Клиенты КАК Клиенты
ГДЕ
Наименование ПОДОБНО "%Иван%"
В функции ПОДОБНО % - любое кол-во символов, _ - один символ,
Агрегатные функции
ВЫБРАТЬ
КОЛИЧЕСТВО(*) КАК Всего,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ЗаказТовара.Клиент) КАК РазныеКлиенты
ИЗ
Документ.ЗаказТовара КАК ЗаказТовара
Конструктор запросов вызывается ПКМ на поле для написания кода - Конструктор запроса.