Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.03.2019

Просмотров: 50370

Скачиваний: 8599

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

В качестве измерений основного и базового регистра мы передаем массив Измерения,
содержащий имена измерений этих регистров ФизЛицо и Организация. Так как состав
измерений у основного и базового регистра идентичен, то в первые два параметра
виртуальной таблицы мы передаем одно и то же значение. В результате при получении
базы по основным начислениям, например, для премии, начисленной сотруднику Иванов в
организации Ромашка, в виртуальную таблицу базовых данных попадут только базовые
записи с аналогичными значениями измерений.

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

В параметр Условие мы передаем условие отбора конкретной записи из определенного
документа-регистратора.

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

В результате для записи №1 документа Начисление зарплаты №5, в котором
содержится запись о начислении премии сотруднику Иванов, мы получим базу для
расчета этой премии в разрезе видов расчета и периодов регистрации (рис. 3.89).

Рис. 3.89. Получение базовых данных для записи документа

Этот фрагмент можно посмотреть в обработке ДанныеРегистраРасчета в
демонстрационной конфигурации «Сложные периодические расчеты», которая находится
на прилагаемом компакт-диске.


background image

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

Например, в следующем запросе получаются базовые данные из регистра расчета
ОсновныеНачисленияРегл для регистров расчета ДополнительныеНачисленияРегл и
ОсновныеНачисленияРегл (листинг 3.85).

Листинг 3.85. Получение базовых данных для нескольких регистров расчета


background image

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

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

Таблица перерасчета в информационной базе содержит следующий состав полей:

<Имя измерения> – поле, содержащее значения измерения перерасчета с именем,
заданным в конфигурации;
ВидРасчета – имеет тип ПланВидовРасчетаСсылка.<имя>. Содержит ссылку на
вид расчета, который необходимо перерассчитать для объекта перерасчета
(документа);
ОбъектПерерасчета – имеет тип ДокументСсылка.<имя>. Содержит ссылку на
документ, который необходимо перерассчитать.

В нашей демонстрационной конфигурации созданы два объекта перерасчета:
ПерерасчетОсновныхНачислений с измерениями ФизЛицо и Организация, который
хранит информацию о том, какие записи нужно перерассчитать в регистре расчета
ОсновныеНачисленияРегл, и ПерерасчетДополнительныхНачислений с измерениями
ФизЛицо и Организация, который хранит информацию о том, какие записи нужно
перерассчитать в регистре расчета ДополнительныеНачисленияРегл.

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


background image

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

Листинг 3.86. Получение списка записей, которые требуется перерассчитать

Результат выполнения запроса представлен на рис. 3.90.

Рис. 3.90. Получение списка записей, которые требуется перерассчитать

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


background image

Глава 4. Оптимизация запросов

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

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

Напомним, что информация, получаемая с помощью запросов, хранится в базе данных –
файловой базе «1С:Предприятия» или в базах под управлением сторонних СУБД: SQL
Server, PostgreSQL, IBM DB2, Oracle Database. Для получения нужных данных платформа
транслирует запрос, созданный разработчиком, с учетом параметров, заданных
пользователем, в запрос к базе данных на языке SQL.

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

Как сделать так, чтобы СУБД выбирала оптимальный план запроса для получения
информации из базы данных? Как сделать текст запроса наиболее эффективным для
выполнения? Этим вопросам и будет посвящена данная глава.

Индексирование таблиц

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

Если провести аналогию с адресом проживания человека, то понятно, что, зная полный
адрес (улицу, дом, подъезд, этаж, квартиру), можно легко и довольно быстро до него
добраться. Но если вы не знаете квартиру, придется обходить весь этаж. Если вы не
знаете этаж, придется обходить весь подъезд. Если вы не знаете подъезд, придется
обходить весь дом и т. д. А если вы знаете только улицу и квартиру, но не знаете дом, то
тут вообще «комментарии излишни».

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