Файл: Хрусталева Е. Ю. Язык запросов 1С-Предприятия 8 (2013).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.03.2019
Просмотров: 51764
Скачиваний: 8724
неоптимальный план. Это может привести к значительному падению производительности
и даже к неработоспособности запроса в отдельных случаях.
Поэтому нежелательно обращаться к реквизитам регистратора регистра (например,
ТоварыНаСкладах.Регистратор.Дата).
Например, поле Регистратор регистра ТоварыНаСкладах имеет тип ссылки на любой
документ. При выполнении следующего запроса будет выполнено соединение с
таблицами всех документов, имеющихся в конфигурации (листинг 4.18).
Листинг 4.18. Получение реквизитов регистратора из регистра накопления – неправильный вариант
Если четко известно, что поле составного типа является ссылкой на конкретную таблицу,
то настоятельно рекомендуется использовать функцию ВЫРАЗИТЬ() для ограничения
количества таблиц в запросе.
Например, по условию задачи нужно отобрать только движения регистра Товары на
складах, произведенные документом Поступление товаров. В этом случае оптимальным
будет следующий вариант (листинг 4.19).
Листинг 4.19. Получение реквизитов регистратора из регистра накопления – правильный вариант
Это позволит значительно ускорить работу запроса, ограничив количество соединений при
помощи функции приведения типа ВЫРАЗИТЬ(). В данном примере компактность и
универсальность кода пожертвована в пользу его производительности. Но в результате
будет выполнено только одно дополнительное соединение таблицы регистра с таблицей
документом Поступление товаров.
Если ограничение количества соединений в запросе таким способом некорректно, то
можно рекомендовать:
1. Избегать избыточности при создании полей составных ссылочных типов. Не следует
без необходимости использовать типы Любая ссылка или Ссылка на любой
документ и т. п. Нужно более тщательно проанализировать прикладную логику и
назначить для поля ровно те возможные типы ссылок, которые необходимы для
решения задачи.
2. Пожертвовать компактностью хранения данных ради производительности. Если в
запросе требуется значение, полученное через ссылку, то как вариант это значение
можно хранить непосредственно в самом объекте. Например, в реквизите регистра
можно хранить дополнительную информацию о дате регистратора. Это приведет к
дублированию информации и некоторому (незначительному) увеличению ее объема,
но может существенно повысить производительность и стабильность работы
запроса.
3. Если данный запрос является универсальным и используется в нескольких разных
ситуациях (где типы ссылки могут быть разными), то можно формировать запрос
динамически, подставляя в функцию ВЫРАЗИТЬ тот тип, который необходим при
данных условиях. Это увеличит объем исходного кода и, возможно, сделает его
менее универсальным, но может существенно повысить производительность и
стабильность работы запроса.
Исключить вывод ссылочных полей в отчет
Если отчет формируется не с помощью системы компоновки данных, а с помощью
встроенного языка (например, результат запроса выводится в табличный документ), то
нежелательно выводить в отчет непосредственно сами ссылочные значения, так как это
может существенно замедлить выполнение отчета.
Дело в том, что при выводе значения ссылочного поля для получения его представления
будет выполняться дополнительный запрос к той таблице, на которую ссылается это
ссылочное поле. И этот процесс будет выполняться многократно, для каждой записи
отчета.
Чтобы этого избежать, следует в запросе с помощью функции Представление() получать
текстовое представление ссылочного поля и затем уже его, а не саму ссылку, выводить в
отчет или сообщение.
подробнее
Как получить текстовое представление
Например, в демонстрационной конфигурации «Учет движения средств», прилагающейся
к книге, в обработке Продажи номенклатуры рассмотрен пример, представляющий
продажи товаров за каждую неделю в виде кросс-отчета.
Данные для отчета получаются при выполнении следующего запроса (листинг 4.20) и
выводятся затем в табличный документ.
Листинг 4.20. Запрос для получения данных
В запросе получаются как сами ссылочные значения, так и их текстовые представления.
В табличный документ выводятся представления ссылочного поля ТоварПредставление,
а значения самой ссылки Товар помещаются в ячейку расшифровки отчета, для того
чтобы затем пользователь в отчете мог открыть запись из справочника,
соответствующую этому товару