Запрос 2

  • автор:

Внимание! Перед вами ознакомительная версия урока, материалы которого могут быть неполными.

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: итоги

Автор уроков и преподаватель школы: Владимир Милькин

Итоги в запросах

Давайте рассмотрим запрос, выбирающий из таблицы Документ.ПрибытиеГостей номер документа, город и количество прибывших:

ВЫБРАТЬ Номер, Город, Количество ИЗ Документ.ПрибытиеГостей

Наша задача состоит в том, чтобы подвести итоги (просуммировать) количества прибывших гостей для каждого города.

Как вы помните, эту задачу можно решить при помощи группировки:

ВЫБРАТЬ Город, СУММА(Количество) ИЗ Документ.ПрибытиеГостей СГРУППИРОВАТЬ ПО Город

Обратите внимание на то, что количество записей после группировки сократилось, а информация о номере документа пропала. Так действует группировка. Вы читаете ознакомительную версию урока, полноценные уроки находятся .

Сегодня мы рассмотрим механизм формирования итогов, который решает эту задачу по-другому:

ВЫБРАТЬ Город, Номер, Количество ИЗ Документ.ПрибытиеГостей ИТОГИ СУММА(Количество) ПО Город

Обратите внимание, что после подведения итогов:

  • Количество записей наоборот увеличилось. Остались все записи, которые были до подведения итогов + к ним добавились записи самих итогов.
  • У нас есть возможность просматривать дополнительные поля (Номер), которые пропадали при группировке.

Таким образом, после группировки остаются только обобщённые записи (группы), а после подведения итогов остаются все записи что были до этого (детальные записи) + к ним добавляются обобщённые записи (итоги, выделены жёлтым цветом на рисунке).

Общий синтаксис секции итогов такой:

Подведение итогов в целом по таблице

Если необходимо подвести итоги целиком по всей таблице необходимо использовать ключевое слово ОБЩИЕ в секции ПО:

ВЫБРАТЬ Город, Номер, Количество ИЗ Документ.ПрибытиеГостей ИТОГИ СУММА(Количество) ПО ОБЩИЕ

Подведение итого по нескольким полям

Достаточно просто перечислить эти поля через запятую в секции ПО. В качестве примера подведем итоги в целом по таблице (поле ОБЩИЕ), а затем по полю Город:

ВЫБРАТЬ Город, Номер, Количество ИЗ Документ.ПрибытиеГостей ИТОГИ СУММА(Количество) ПО ОБЩИЕ, Город

Подведение итогов по иерархии

В том случае, если мы подводим итоги по полю (в данном случае Город) тип которого имеет иерархическую структуру (папки + обычные элементы) можно использовать ключевое слово ИЕРАРХИЯ, чтобы подвести итоги по всем уровням вложенности:

ВЫБРАТЬ Город, Номер, Количество ИЗ Документ.ПрибытиеГостей ИТОГИ СУММА(Количество) ПО Город ИЕРАРХИЯ

Если же необходимо вывести итоги только для групп (в данном случае папки в справочнике Города) необходимо использовать ключевое слово ТОЛЬКО ИЕРАРХИЯ:

ВЫБРАТЬ Город, Номер, Количество ИЗ Документ.ПрибытиеГостей ИТОГИ СУММА(Количество) ПО Город ТОЛЬКО ИЕРАРХИЯ

Сравните этот и предыдущий результаты запросов.

Подведение итогов без агрегатных функций

Использование агрегатных функций при подведении итогов не является обязательным. Вы читаете ознакомительную версию урока, полноценные уроки находятся .

К примеру, если бы мы захотели расположить все документы прибытия гостей по иерархии городов, то запрос был бы таким:

ВЫБРАТЬ Город, Номер, Количество ИЗ Документ.ПрибытиеГостей ИТОГИ ПО Город ИЕРАРХИЯ

Пройдите тест

Начать тест

Регистры сведений. За кулисами

На старт

Все мы используем в разработке такой объект как регистры сведений. Мы все о них знаем, все умеем. Среди регистров — это самый простой, понятный объект, в котором нет практически ничего лишнего. По крайней мере, так кажется до поры до времени.

Это информация из старого блога DevelPlatform.ru

Давным давно мной был создан блог DevelPlatform, в котором были статьи по разработке на платформе 1С, администрированию, онлайн-инструменты, а также немного о платформе .NET.

Больше года назад сайт был закрыт. Некоторые из его материалов будут реанимированы на Инфостарт.

В нескольких статьях будут представлены основные сведения о внутреннем устройстве регистров сведений, о SQL-запросах платформы при работе с ними и их изменение в зависимости от настроек регистра. Рассмотрим некоторые особенности с выходом платформы 8.3 и совсем немного об оптимизации работы с ними.

Материалы ниже не являются всеобъемлющей инструкцией или руководством. А на Инфостарт есть более полная статья с описанием множества нюансов этого типа объекта. Это публикация от Сергея Носкова — «Регистры сведений 1С. Как это устроено.». Здесь же Вы найдете самую общую информацию, а некоторые темы совсем не будут раскрыты. Однако, это может быть отличным началом к исследованию внутренних механизмов платформы.

Структура хранения

Поговорим о регистрах сведений. Но не о на настройках и их правильном использовании, а о скрытой от разработчиков стороне СУБД. Рассмотрим? как регистры сведений хранятся в базе данных.

Что там в базе

Структура таблиц, используемая для хранения данных и настроек регистра сведений, меняется в зависимости от настроек объекта метаданных в конфигураторе. Следующие настройки влияют на то, как будет платформ 1С:Предприятие 8.x хранить данные в базе:

Рассмотрим влияние этих настроек с простого примера. В тестовой базе у нас есть непериодический регистр сведений «Настройки»:

Единственное измерение «СтаутсТовара» ссылается на перечисление, все ресурсы имеют примитивные типы. Структура хранения такого регистра ограничивается только одной таблицей в базе данных:

Как видно из рисунка, структура хранения такого регистра достаточно примитивна. Каждому полю регистра в дереве метаданных конфигурации соответствует поле таблицы на стороне СУБД.

Рассмотрим еще один простой пример.

Структура метаданных этого регистра также достаточно простая: измерение «Товар», ссылающееся на справочник «Товары», и ресурс «Статус», ссылающееся на перечисление «СтатусыТоваров». Отличие настроек этого регистра от предыдущего кроется в параметре «Периодичность», которая теперь установлена в значение «В пределах дня». Структура таблицы в базе для этого регистра будет следующей:

Кроме полей измерений и ресурсов в таблицу добавлено поле «Period», в котором хранится значение даты и времени записи. Вне зависимости от значения периодичности структура таблицы регистра не изменится. Если же обратно поменять периодичность в значение «Непериодический», то из структуры таблицы будет удалено поле «Period».

Если для регистра поставить настройку «Режим записи» в «Подчиненный регистратору», то в таблицу дополнительно добавится поле «RecorderRRef», в котором будет хранится ссылка на документ-регистратор, а также поле «LineNo» (Номер строки) и «Active» (Активность). Отдельно этот пример рассматривать не будем. Давайте лучше посмотрим на структуру периодического регистра сведений с включенной опцией хранения итогов среза последних:

Регистр с такими настройками использует две таблицы в базе данных. Первая — это основная таблица регистра:

Как раньше и было сказано, в таблице содержатся поля измерений и ресурсов регистра. Т.к. регистр подчинен регистратору, то в состав полей добавлено поле «RecorderRRef», в котором хранится ссылка на документ-регистратор. Периодичность у регистра установлена в «По позиции регистратора», но поле «Period» в таблице все равно осталось. При такой настройке в этом поле хранится дата и время документа.

Вторая таблица — это таблица итогов среза последних записей:

В ней хранятся последние записи регистра в разрезе периодов. В структуру таблицы входят измерения и ресурсы регистра, период, регистратор (если регистр подчинен регистратору) и реквизиты регистра (в нашем примере их нет).

Также бы выглядела и таблица итого среза первых, только хранила бы она срез первых записей в разрезе периодов. О плюсах использования таблиц итого регистров сведений мы поговорим позже.

Отдельно стоит упомянуть о таблице настроек хранения итогов регистра сведений. Для последнего примера эта таблица выглядит так (см. след. скриншот).

В таблице только одно поле, хранящее флаг включения итогов. Изменить эту настройку можно в режиме предприятия в управлении итогами:

Таблица настроек хранения итогов добавляется для регистра сведений, если значение периодичности регистра отличается от значения «Непериодический».

Рассмотрим пример формирования платформой таблиц итогов среза первых и среза последних.

Пример формирования таблиц итогов

Например, таблица движений регистра «Цены номенклатуры», который мы рассматривали в предыдущем примере, содержит следующие записи:

Тогда таблица итогов среза последних записей будет выглядеть так:

То есть в таблицу попали последние по периоду записи в разрезе измерений регистра. По такому же принципу формируется таблица итогов среза первых, только берутся самые первые записи в таблице движений:

Таким образом, таблицы итогов позволяют значительно ускорить выполнения запросов получения срезов последних / первых записей регистров. Подробнее об этом мы поговорим в следующей части статьи.

Пойдем дальше

Мы рассмотрели варианты хранения регистров сведений на стороне СУБД в зависимости от их настроек, а также познакомились со служебными таблицами регистра для хранения итогов и настроек хранения итогов. Стоит отметить, что возможность хранения итогов для регистров сведений появилась только в версии 8.3.

Далее мы отловим SQL Profiler’ом запросы, которые формирует платформа 1С:Предприятие к СУБД при работе с регистрами сведений.

Запросы платформы

Все запросы, которые формирует платформа для регистров сведений, можно разделить на два типа: для периодических регистров и непериодических. Начнем с простого примера запроса для непериодических регистров.

Непериодический регистр

В тестовой конфигурации у нас есть простой непериодический регистр «Настройки»:

Если мы сделаем запрос к таблице регистра с отбором по полю «УчитыватьВДокументахПоступления», то получаем простейший SQL-запрос:

SELECT T1._Fld33RRef, T1._Fld34, T1._Fld35, T1._Fld36 FROM dbo._InfoRg32 T1 WHERE (T1._Fld34 = 0x00)

В запросе выбираются поля регистра, а в секции WHERE устанавливается отбор по полю. Рассмотрим примеры с периодическим регистром.

Периодический регистр

Тестовая база содержит периодический регистр:

Как было сказано ранее, такие регистры могут иметь на стороне СУБД несколько таблиц:

  • Основная таблица регистра
  • Таблицы итогов (одна или две, в зависимости от настроек итогов для регистра: итоги для среза первых и итоги для среза последних).

SQL-запрос к основной таблице итогов ничем не будет отличаться от запроса к таблице непериодического регистра. Другое дело запрос для получения среза последних/первых записей периодического регистра. Вот так, например, выглядит SQL-запрос для получения среза последних записей без установки параметра «Период»:

Этот запрос используется платформой для получения среза последних записей. Принцип его работы прост: получаем макс. значение периода для записей в разрезе всех измерений, а дальше к этой таблице присоединяем записи из основной таблицы регистра. В результате мы получаем срез последних записей.

Аналогично выглядит запрос для получения среза первых, только в первом подзапросе получают не максимальное значение периода, а минимальное.

Из-за того, что в запросе присутствует несколько подзапросов и соединение с ними, оптимизатор СУБД не всегда может подобрать оптимальный план запроса, поэтому гарантировать стабильность выполнения этого запроса нельзя.

В версии 8.3 появились новые настройки, позволяющие избежать проблем с производительностью.

Особенности платформы 8.3

Версия 8.3 позволяет включить использование итогов среза первых и среза последних. Давайте рассмотрим какой запрос будет сформирован платформой для получения среза последних по итоговой таблице регистра сведений:

Как мы видим, для получения среза последних используется таблица итого. Вычисление макс./мин. значения периода для записей не выполняется. Такой запрос будет выполняться стабильней.

В примере, к подзапросу присоединяется левым соединением таблица справочника «Товары» для получения представления товара (Наименования).

Стоит заметить, что если срез последних получается в запросе без установки отбора по периоду (то есть текущий срез), то используется запрос выше. Если же поставить параметр «Период» для таблицы среза последних, то платформа будет использовать запрос аналогично запросы платформы 8.2. То есть таблица итогов не будет использоваться.

Далее будет рассмотрен пример написания собственного запроса получения среза последних / первых. Его можно использовать для ситуаций, когда нужно повысить стабильность выполнения запросов.

Свой запрос для среза последних

Написание собственного запроса для получения среза последних записей для 1С:Предприятия.

О чем идет речь

Ранее мы рассмотрели SQL-запросы, которые формирует платформа 1С:Предприятие при работе с регистрами сведений в зависимости от их настроек. Особый интерес вызывает запрос для получения среза первых / последних записей без использования таблицы итогов.

Как мы видим, в запросе используется соединение с подзапросом, что может стать причиной проблемы с производительностью из-за не оптимального плана запроса, который выберет оптимизатор СУБД. Это будет происходить не всегда, но 100% гарантии стабильности дать нельзя (подробнее о причинах неоптимальной работы с подзапросами будет идти речь в одной из следующих статей).

Поскольку мы не можем вмешиваться во внутренние механизмы платформы, то для решения этой проблемы самым простым ее вариантом будет написание собственного запроса на языке запросов платформы с использованием временных таблиц.

Пример запроса среза последних

Для получения среза последних записей напишем следующий запрос:

Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ЦеныНоменклатуры.Товар КАК Товар, | МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период |ПОМЕСТИТЬ ПоследниеЗаписи |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры |СГРУППИРОВАТЬ ПО | ЦеныНоменклатуры.Товар |ИНДЕКСИРОВАТЬ ПО | Товар, | Период |; |ВЫБРАТЬ | ПоследниеЗаписи.Товар, | ЦеныНоменклатуры.Цена |ИЗ | ПоследниеЗаписи КАК ПоследниеЗаписи | ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры | ПО ПоследниеЗаписи.Товар = ЦеныНоменклатуры.Товар | И ПоследниеЗаписи.Период = ЦеныНоменклатуры.Период»;

Во временную таблицу «ПоследниеЗаписи» мы получаем максимальные периоды с группировкой по необходимым измерениям (в нашем случае по изменению «Товар»). Во втором запросе, используя полученную таблицу максимальных периодов, мы находим записи в основной таблице движений по заданному измерению и периоду.

Если нужно поставить отбор, например, по товару, то запрос будет такой:

Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ЦеныНоменклатуры.Товар КАК Товар, | МАКСИМУМ(ЦеныНоменклатуры.Период) КАК Период |ПОМЕСТИТЬ ПоследниеЗаписи |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры // Устанавливаем отборы по периоду среза // последних записей и по товару |ГДЕ | ЦеныНоменклатуры.Товар = &Товар | И ЦеныНоменклатуры.Период <= &Период |…»;

Отборы устанавливаются в той части запроса, где идет получение максимальных периодов по разрезам регистра сведений. Если мы посмотрим на SQL-запрос платформы в этом случае, то соединений с подзапросами мы не увидим:

1. Запрос получения макс. периодов

INSERT INTO #tt2 WITH(TABLOCK) (_Q_000_F_000RRef, _Q_000_F_001) SELECT T1._Fld27RRef, MAX(T1._Period) FROM dbo._InfoRg26 T1 WHERE (T1._Fld27RRef = @P1) AND (T1._Period <= @P2) GROUP BY T1._Fld27RRef

2. Получение значений ресурсов регистра для найденных периодов и измерений с использованием сформированной ранее временной таблицы

SELECT T1._Q_000_F_000RRef, T2._Fld37 FROM #tt2 T1 WITH(NOLOCK) LEFT OUTER JOIN dbo._InfoRg26 T2 ON ((T1._Q_000_F_000RRef = T2._Fld27RRef) AND (T1._Q_000_F_001 = T2._Period))

В результат мы получили запрос без использования подзапросов, вместо которых создается временная таблица. Конечно, на ее создание тратятся дополнительные ресурсы, но стабильность выполнения запроса гарантирована.

Срез первых записей

Отдельно рассматривать ситуацию с получением среза первых записей смысла нет, так как запрос будет практически один в один с предыдущим. Единственное отличие — получать нужно не максимальное значение периода в первом запросе, а минимальное значение.

Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ЦеныНоменклатуры.Товар КАК Товар, | МИНИМУМ(ЦеныНоменклатуры.Период) КАК Период |ПОМЕСТИТЬ ПоследниеЗаписи |…»;

Попробуйте самостоятельно написать такой запрос и поэкспериментировать с результатом.

Финиш

На этом небольшая заметка по внутреннему устройству регистров сведений подошла к концу. За бортом осталось множество вопросов:

  • Устройство индексов регистра и их зависимость от настроек
  • Как происходит запись в таблицы регистров
  • Как работают управляемые блокировки для этого типа объектов
  • Проблемы производительности при использовании итогов для среза первых / последних записей
  • и другое.

Официальная документация, публикация от Сергея Носкова и Ваши собственные эксперименты всегда помогут ответить на все возникшие вопросы.

Спасибо за внимание!

Другие ссылки

  • Регистры сведений 1С. Как это устроено.

  • Регистры накопления. Структура хранения в базе данных

  • Регистры накопления. Виртуальные таблицы. Часть №1: Обороты

  • Регистры накопления. Виртуальные таблицы. Часть №2: «Остатки» и «Остатки и обороты»

  • Регистры накопления. Агрегаты в оборотных регистрах

  • Устройство регистра сведений

Запросы в 1С

Запросы в 1С предназначены для получения данных из базы данных. Рассмотрим на что способен данный механизм.

Что такое запрос и язык запросов
Схема работы с запросом
Состав текста запроса
Временные таблицы и пакетные запросы
Виртуальные таблицы
Конструктор запроса
Объект СхемаЗапроса

Что такое запрос и язык запросов

Запросы предназначены для извлечения и обработки информации из базы данных для предоставления пользователю в требуемом виде. Под обработкой здесь подразумевается группировка полей, сортировка строк, расчет итогов и т.д. Изменять данные с помощью запросов в 1С нельзя!

Запрос выполняется в соответствии с заданными инструкциями — текстом запроса. Текст запроса составляется в соответствии с синтаксисом и правилами языка запросов. Язык запросов 1С:Предприятие 8 основан на базе стандартного SQL, но имеет некоторые отличия и расширения.

Схема работы с запросом

Общая схема работы с запросом состоит из нескольких последовательных этапов:

  1. Создание объекта Запрос и установка текста запроса;
  2. Установка параметров запроса;
  3. Выполнение запроса и получение результата;
  4. Обход результата запроса и обработка полученных данных.

1. Объект Запрос имеет свойство Текст, которому необходимо присвоить текст запроса.

2. Установка значений параметров осуществляется методом УстановитьПараметр(<Имя>, <Значение>). Параметры в тексте запроса обозначаются символом «&» и обычно используются в условиях отбора (секция ГДЕ) и в параметрах виртуальных таблиц.

Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);

3. После присвоения текста и установки параметров запрос необходимо выполнить и получить результат выполнения. Выполнение производится методом Выполнить(), который возвращает объект РезультатЗапроса. Из результата запроса можно:

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

// Получение выборки
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

// Получение таблицы значений
РезультатЗапроса = Запрос.Выполнить();
Таблица = РезультатЗапроса.Выгрузить();

4. Обойти выборку результата запроса можно с помощью цикла:

Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Курс);
КонецЦикла;

Полный пример работы с запросом может выглядеть так:

// Этап 2. Установка параметров
Запрос.УстановитьПараметр(«Валюта», ВыбраннаяВалюта);

// Этап 3. Выполнение запроса и получение выборки
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

// Обход выборки
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.Курс);
КонецЦикла;

Состав текста запроса

Текст запроса состоит из нескольких секций:

  1. Описание запроса — перечень выбираемых полей и источников данных;
  2. Объединение запросов — выражения «ОБЪЕДИНИТЬ» и «ОБЪЕДИНИТЬ ВСЕ»;
  3. Упорядочивание результатов — выражение «УПОРЯДОЧИТЬ ПО …»;
  4. Автоупорядочивание — выражение «АВТОУПОРЯДОЧИВАНИЕ»;
  5. Описание итогов — выражение «ИТОГИ … ПО …».

Обязательной является только первая секция.

Временные таблицы и пакетные запросы

Язык запросов 1С поддерживает использование временных таблиц — таблиц, полученных в результате выполнения запроса и сохраненных на временной основе.

Часто можно столкнуться с ситуацией, когда в качестве источника запроса нужно использовать не таблицы базы данных, а результат выполнения другого запроса. Эту задачу можно решить с помощью вложенных запросов или временных таблиц. Применение временных таблиц позволяет упростить текст сложного запроса, разделив его на составные части, а также, в некоторых случаях, ускорить выполнение запроса и уменьшить количество блокировок. Для работы с временными таблицами используется объект МенеджерВременныхТаблиц. Создание временной таблицы производится при помощи ключевого слова ПОМЕСТИТЬ, за которым следует наименование временной таблицы.

МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;

Запрос.Текст =
«ВЫБРАТЬ
| Валюты.Код,
| Валюты.Наименование
|ПОМЕСТИТЬ ВТВалюты
|ИЗ
| Справочник.Валюты КАК Валюты»;

РезультатЗапроса = Запрос.Выполнить();

Для использования временной таблицы ВТВалюты в других запросах необходимо этим запросам присвоить общий менеджер временных таблиц — МенеджерВТ.

Пакетный запрос — это запрос, в котором содержится несколько запросов, разделенных символом «;». При выполнении пакетного запроса все входящие в него запросы выполняются последовательно, причем результаты всех временных таблиц доступны всем последующим запросам. Явное присвоение менеджера временных таблиц пакетным запросам не обязательно. Если менеджер временных таблиц не присвоен, то все временные таблицы удалятся сразу после выполнения запроса.

Для пакетных запросов доступен метод ВыполнитьПакет(), который выполняет все запросы и возвращает массив результатов. Временные таблицы в пакетном запросе будут представлены таблицей с одной строкой и одной колонкой «Количество», в которой хранится количество записей. Для отладки пакетных запросов можно использовать метод ВыполнитьПакетСПромежуточнымиДанными(): он возвращает реальное содержимое временных таблиц, а не количество записей.

РезультатПакета = Запрос.ВыполнитьПакет();

ТЗВалюты = РезультатПакета.Выгрузить();
ТЗНоменклатура = РезультатПакета.Выгрузить();

Запрос.УстановитьПараметр(«Производитель», Производитель);

РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();

Пока Выборка.Следующий() Цикл

КонецЦикла;

Виртуальные таблицы

Виртуальные таблицы — это таблицы, которые не хранятся в базе данных, а формируются платформой. По своей сути это вложенные запросы к одной или нескольким физическим таблицам, выполняемые платформой. Виртуальные таблицы получают информацию только из регистров и, в основном, предназначены для решения узкоспециализированных задач.

Существуют следующие виртуальные таблицы (в скобках указаны возможные параметры):

При работе с виртуальными таблицами следует накладывать отборы в параметрах виртуальных таблиц, а не в условии ГДЕ. От этого сильно зависит время выполнения запроса.

Конструктор запроса

Для ускорения ввода текстов запросов платформа имеет специальные инструменты: Конструктор запроса и Конструктор запроса с обработкой результата. Для вызова конструкторов необходимо щелкнуть правой кнопкой мыши и выбрать требуемый пункт:

Также конструкторы можно вызвать из главного меню Текст.

При помощи конструктора запроса программист может интерактивно сконструировать текст запроса. Для этого мышкой выбираются нужные таблицы и поля, устанавливаются связи, группировки, итоги и т.д. Данный подход позволяет экономить время и избавиться от возможных ошибок. В результате своей работы конструктор запроса формирует текст запроса.

Конструктор запроса с обработкой результата кроме формирования текста запроса создает готовый фрагмент кода для получения и обработки данных.

Объект СхемаЗапроса

Платформа позволяет программно создавать и редактировать текст запроса при помощи объекта СхемаЗапроса. Объект имеет единственное свойство ПакетЗапросов, в котором объекта хранятся свойства всех запросов, редактируемых в данный момент. Объект СхемаЗапроса поддерживает следующие методы:

  • УстановитьТекстЗапроса(<Текст>) — заполняет свойство ПакетЗапросов на основании переданного текста запроса;
  • ПолучитьТекстЗапроса() — возвращает сформированный на основании свойства ПакетЗапросов текст запроса;
  • НайтиПараметры() — возвращает параметры запроса.

Рассмотрим пример работы с объектом СхемаЗапроса. Для программного формирования текста запроса

ВЫБРАТЬ
Валюты.Ссылка КАК Валюта,
Валюты.Код
ИЗ
Справочник.Валюты КАК Валюты
ГДЕ
НЕ Валюты.ПометкаУдаления

УПОРЯДОЧИТЬ ПО
Валюты.Код

Код на встроенном языке может выглядеть так:

Общие вопросы

Рассмотрим параметр виртуальной таблицы Метод дополнения. Он имеет смысл только в том случае если параметр Периодичность отлична от Период. Значение ДвиженияИГраницыПериода позволяет получить запись на период начала и запись на период конца получаемых данных, если на эти периоды не было оборотов(если обороты были, то эти записи выведутся в любом случае). Рассмотрим поподробнее.

Дано:

Документы прихода и расхода

Что будет если выбрать субконто по счету Товары без установки параметров

Запрос1

ВЫБРАТЬ Счет, Субконто1, СуммаНачальныйОстаток, СуммаОборотДт, СуммаОборотКт, СуммаКонечныйОстаток ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , , , Счет = &Товары, , ) КАК УправленческийОстаткиИОбороты

Результат запроса 1

Метод дополнения Движения

Сделаем такой же запрос, но укажем метод дополнения Движения, т.к. по умолчанию был ДвиженияИГраницыПериода

Запрос 2

РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , ,Движения , Счет = &Товары, , ) КАК УправленческийОстаткиИОбороты

Результат запроса 2

Как видим разницы никакой, т.к. ключевым параметром является периодичность

Это будет хорошо видно при Периодичности — День

Периодичность — День, МетодДополнения — Движения

Добавим в запрос Периодичность «День», МетодДополнения — «Движения» и выведем в выбираемые поля Период

Запрос 3

ВЫБРАТЬ Период, Счет, Субконто1, СуммаНачальныйОстаток, СуммаОборотДт, СуммаОборотКт, СуммаКонечныйОстаток ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , День, Движения, Счет = &Товары, , ) КАК УправленческийОстаткиИОбороты

Результат запроса 3

Метод дополнения — ДвиженияИГраницыПериода

Мы видим, что у нас вывелись разные сочетания Дата и Субконто1 т.е. Движения

Изменим метод дополнения и добавим порядок по полям Субконто1 и Период

Запрос 4

ВЫБРАТЬ Период КАК Период, УправленческийОстаткиИОбороты.Счет, Субконто1 КАК Субконто1, СуммаНачальныйОстаток, СуммаОборотДт, СуммаОборотКт, СуммаКонечныйОстаток ИЗ РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , День, ДвиженияИГраницыПериода, Счет = &Товары, , ) КАК УправленческийОстаткиИОбороты УПОРЯДОЧИТЬ ПО Субконто1, Период

Результат запроса 4

У нас добавились даты актуальных итогов 01-11-3999, т.е. последняя граница. Мы ведь указали, что нам нужны движения и границы периода, хотя сами периоды мы не указывали. Почему-то не добавилась первая граница на дату 01-01-001.

Добавим даты периода

Давайте добавим параметры даты периода, в которых укажем текущий год

Запрос 5

РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(&Дата1, &Дата2, День, ДвиженияИГраницыПериода, Счет = &Товары, , ) КАК УправленческийОстаткиИОбороты

Результат запроса 5

Последняя граница изменилась с 01-11-3999 на 31-12-2017, но всё равно почему-то не выводится первая граница отдельно. Предположительно это происходит из-за того, что нет остатков на начало года.

Исправим «Дано»

Давайте проверим это, вводим приходную на 01.01.2016 12:00:00 с количеством

Номенклатура Сумма
1 Big (капилярная) 100,00
2 Bosch KGS 3760 IE 40,00

И при повторном формировании запроса 5 получаем результат

Добавились суммы на начало года для каждого субконто 1, т.е. предположение о том, что программа не выводит запись на начальную границу если нет данных подтвердилась.

Итак, метод дополнения ДвиженияИГраницыПериода работает только если периодичность отлична от Период, добавляет две строки и стоит по умолчанию. Если нужны обороты то нужно указывать «Движения» разницы в производительности не заметил, но не будет лишних строк на начало/конец периода. Стоит отметить, что сотрудники фирмы 1С рекомендуют её использовать только когда нужны сразу все 4 ресурса(Начальный остаток, Приход, Расход, Конечный остаток) в остальных случаях лучше использовать сочетания других виртуальных таблиц. Такая же виртуальная таблица есть и у регистра Накопления.

В 1С проверка на пустое значение осуществляется специальной функцией. Что бы проверить заполнен ли имеющийся у вас реквизит или переменная следует использовать функцию из глобального контекста ЗначениеЗаполнено(<Значение>).

В 1С 8 значение считается заполненным (не пустым) если оно отличается от значения по умолчанию для данного типа. Например для ссылочного типа значение по умолчанию — это Пустая ссылка (данного справочника, документа и т.п.). Также пустыми являются переменные и реквизиты содержащие значения Null и Неопределено.

1с проверка на пустое значение. Примеры

Пример 1:

Переменная = Справочники.Номенклатура.ПустаяСсылка(); Проверка = ЗначениеЗаполнено(Переменная);

В данном случае переменная Проверка будет содержать значение Ложь. Также функцию ЗначениеЗаполнено(<Значение>). можно использовать напрямую в условиях.

Пример 1.1

Если ЗначениеЗаполнено(Переменная) Тогда Сообщить(«Значение в переменной не является пустым!»); КонецЕсли;

Пример2:

Переменная = Документы.АвансовыйОтчет.НайтиПоНомеру(«000000001»); Проверка = ЗначениеЗаполнено(Переменная);

В данном примере, если документ Авансовый отчет с номером 000000001 существует, то в переменной Проверка будет содержаться значение Истина, иначе Ложь.

Использовать функцию ЗначениеЗаполнено нельзя для переменных мутабельных типов, таких как Таблица значений, Дерево значений и т.п. Функция работает для всех конфигураций.

Как же проверить, что в 1с таблица значений пустая? Для этого используется метод Количество(), с его помощью можно проверить сколько строк содержится в таблице значений.

Пример 3. Пусть МояТаблица — таблица значений определенная выше в коде.

Если МояТаблица.Количество() = 0 Тогда Возврат; КонецЕсли;

Этим же методом можно определить заполненность дерева значений и выборки результата запроса.

Пример 4. Пусть МоеДерево — дерево значений определенное выше в коде.

Если МоеДерево.Строки.Количество() = 0 Тогда Возврат; КонецЕсли;

Как видите, в дереве значений мы проверяем наличие строк первого уровня, если их нет, то дерево пустое.

Пример 5. Пусть Запрос — запрос к базе данных 1С 8, определенный выше.

Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Количество() = 0 Тогда Возврат Ложь; Иначе Выборка.Следующий(); …

На этом описание основных приемов, при помощи которых осуществляется в 1с проверка на пустое значение, закончено. Если вы хотите узнать, как сделать проверку на пустое значение в запросе, прочитайте следующие статьи: Проверка на null в запросе и Проверка на Неопределено в запросе

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *