Довідковий матеріал

Отримання полів через крапку від інших полів

У мові запитів реалізовано можливість отримання поля через крапку від іншого поля. З одного боку, ця можливість дає змогу створювати компактні запити, проте, з іншого боку, завжди слід розуміти, що стоїть за кожною такою дією. У цьому розділі буде розказано, що відбувається під час отримання поля через крапку, і буде надано рекомендації щодо оптимізації доступу до полів.Отримання поля через крапку. Отримання поля Посилання через крапку. Отримання полів через крапку від полів, що посилаються на кілька об'єктів. Використання конструкції ВИРАЗИТИ для обмеження кількості з'єднань під час отримання полів через крапку

Редакційна сцена про доступ до даних через крапку: центральний вузол-посилання веде до кількох таблиць, а виділений синій шлях обмежує з’єднання однією потрібною гілкою.

Отримання поля через крапку

Отримання поля Посилання через крапку

Отримання полів через крапку від полів, що посилаються на кілька об'єктів

Використання конструкції ВИРАЗИТИ для обмеження кількості з'єднань під час отримання полів через крапку

 

У мові запитів реалізовано можливість отримання поля через крапку від іншого поля. З одного боку, ця можливість дає змогу створювати компактні запити, проте, з іншого боку, завжди слід розуміти, що стоїть за кожною такою дією. У цьому розділі буде розказано, що відбувається під час отримання поля через крапку, і буде надано рекомендації щодо оптимізації доступу до полів.

Отримання поля через крапку

Розглянемо наступний запит:

ВИБРАТИ
Номенклатура.Найменування, 
КількістьОборот 
З 
РегістрНакопичення.ОблікНоменклатури.Обороти ЯК ОблікНоменклатуриОбороти

У цьому запиті поле «Найменування» отримується через крапку від поля «Номенклатура». Під час виконання такого запиту мова запитів 1С:Підприємства створить неявне з'єднання з довідником «Номенклатура» і отримуватиме поле «Найменування» з нього. Таким чином, реальний запит, який буде виконуватися, буде аналогічний наступному:

ВИБРАТИ 
ДовідникНоменклатура.Найменування, 
КількістьОборот 
З 
РегістрНакопичення.ОблікНоменклатури.Обороти ЯК ОблікНоменклатуриОбороти 
ЛІВЕ З'ЄДНАННЯ Довідник.Номенклатура ЯК ДовідникНоменклатура 
ЗА ОблікНоменклатуриОбороти.Номенклатура = ДовідникНоменклатура.Посилання

Слід зазначити, що якщо в запиті відбувається отримання кількох полів через крапку від одного поля, то з'єднання з таблицею, на яку посилаються поля через крапку, буде створено одне. Наприклад, якщо в першому прикладі ми отримуватимемо не тільки поле «Найменування», а й поле «Код» через крапку від поля «Номенклатура», буде створено одне, а не два з'єднання з таблицею «Номенклатура».

Отримання поля Посилання через крапку

Не слід отримувати поле «Посилання» через крапку від іншого поля. За такого способу отримання поля «Посилання» буде створюватися додаткове з'єднання, яке, найімовірніше, уповільнить виконання запиту.

Наприклад, у наступному запиті поле «Посилання» отримується через крапку від поля «Контрагент»:

ВИБРАТИ 
ВидатковаНакладна.Дата, 
ВидатковаНакладна.Номер 
З 
Документ.ВидатковаНакладна ЯК ВидатковаНакладна 
ДЕ 
ВидатковаНакладна.Контрагент.Посилання = &Контрагент

У результаті буде створено абсолютно непотрібне в цьому випадку з'єднання з таблицею «Контрагенти» і, як наслідок, виконання запиту, найімовірніше, уповільниться. Такий запит слід переписати наступним чином:

ВИБРАТИ 
ВидатковаНакладна.Дата, 
ВидатковаНакладна.Номер 
З 
Документ.ВидатковаНакладна ЯК ВидатковаНакладна 
ДЕ 
ВидатковаНакладна.Контрагент = &Контрагент

Отримання полів через крапку від полів, що посилаються на кілька об'єктів

Якщо поле, через яке отримується інше поле, є посиланням на кілька таблиць, то під час виконання запиту буде здійснено стільки з'єднань, у скількох таблицях, на які є посилання, буде знайдено потрібне поле.

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

ВИБРАТИ
ОблікНоменклатури.Реєстратор.Номер,
ОблікНоменклатури.Кількість 
З 
РегістрНакопичення.ОблікНоменклатури ЯК ОблікНоменклатури

дасть неявне з'єднання з обома таблицями документів, тобто буде виконано два з'єднання. Виконуваний запит матиме приблизно такий вигляд:

ВИБРАТИ
ВИБІР 
КОЛИ ОблікНоменклатури.Реєстратор ПОСИЛАННЯ Документ.ПрибутковаНакладна 
ТОДІ ПрибутковаНакладна.Номер 
КОЛИ ОблікНоменклатури.Реєстратор ПОСИЛАННЯ Документ.ВидатковаНакладна 
ТОДІ ВидатковаНакладна.Номер 
КІНЕЦЬ, 
ОблікНоменклатури.Кількість 
З 
РегістрНакопичення.ОблікНоменклатури ЯК ОблікНоменклатури 
ЛІВЕ З'ЄДНАННЯ Документ.ПрибутковаНакладна ЯК ПрибутковаНакладна 
ЗА ОблікНоменклатури.Реєстратор = ПрибутковаНакладна.Посилання 
ЛІВЕ З'ЄДНАННЯ Документ.ВидатковаНакладна ЯК ВидатковаНакладна 
ЗА ОблікНоменклатури.Реєстратор = ВидатковаНакладна.Посилання

Якщо ж поле, через яке отримується інше поле, є будь-яким посиланням, то можливі ситуації, за яких відбуватиметься неявне з'єднання з усіма об'єктними таблицями конфігурації. Так, наприклад, якщо ми отримуємо від поля типу «будь-яке посилання» поле «Подання», а в нашій конфігурації є 50 довідників і 100 документів, то буде виконано 150 з'єднань із різними таблицями.

На це варто звертати увагу під час розробки структури даних, також про це слід пам'ятати під час складання запитів.

Використання конструкції ВИРАЗИТИ для обмеження кількості з'єднань під час отримання полів через крапку

Іноді під час складання запиту відомо, яке посилання буде міститися в тому чи іншому полі, що посилається на кілька таблиць. У цьому разі можна явно зазначити в запиті потрібну таблицю для того, щоб неявне з'єднання виконувалося тільки із зазначеною таблицею, а не з усіма таблицями, на які посилається це поле.

Приклад. Нехай поле «Реєстратор» регістру накопичення посилається на два документи: «ВидатковаНакладна» і «ПрибутковаНакладна», і в реченні «ДЕ» вибірка обмежується тільки значеннями реєстратора, що посилаються на «ВидатковаНакладна»:

ВИБРАТИ 
ОблікНоменклатури.Реєстратор.Номер, 
ОблікНоменклатури.Кількість 
З 
РегістрНакопичення.ОблікНоменклатури ЯК ОблікНоменклатури 
ДЕ 
ОблікНоменклатури.Реєстратор ПОСИЛАННЯ Документ.ВидатковаНакладна

Оскільки в цьому запиті ми чітко знаємо, що до результату потраплять лише документи, у яких реєстратор посилається на таблицю видаткових накладних, ми можемо дещо доопрацювати запит, щоб він виконувався ефективніше:

ВИБРАТИ 
ВИРАЗИТИ(ОблікНоменклатури.Реєстратор ЯК Документ.ВидатковаНакладна).Номер, 
ОблікНоменклатури.Кількість 
З 
РегістрНакопичення.ОблікНоменклатури ЯК ОблікНоменклатури 
ДЕ 
ОблікНоменклатури.Реєстратор ПОСИЛАННЯ Документ.ВидатковаНакладна

Під час виконання такого запиту буде створено з'єднання лише з таблицею «Документ.ВидатковаНакладна» замість з'єднання з обома таблицями, на які посилається поле «Реєстратор». Це позитивно вплине на швидкість виконання запиту.

Записатися телефоном