← К оглавлению
Данная вкладка содержит различные стандартные ограничения или возможности выборки:
- Выборка данных:
• Первые — позволяет выбрать определенное количество записей. В текстовом представлении запроса определяется оператором «ПЕРВЫЕ N»;
• Без повторяющихся — исключает попадание в конечную выборку повторяющихся строк. В тексте отражается, как «РАЗЛИЧНЫЕ»;
• Разрешенные — включает учет настроенных прав доступа при выполнении запроса и выбирает только записи из таблицы, на которые есть права у текущего пользователя (оператор «РАЗРЕШЕННЫЕ»); - Тип запроса — определение типа запроса из трех вариантов:
• Выборка данных — обычная выборка;
• Создание временной таблицы — создание временной таблицы из выборки;
• Уничтожение временной таблицы — уничтожение ранее созданной временной таблицы; - Блокировать получаемые данные для последующего изменения — предназначена для автоматического режима блокировок записей таблицы, чтобы сохранить целостность данных на время транзакции от чтения до записи (не актуально для управляемых блокировок).
Первые
Данная опция применяется для ограничения возвращаемых в выборке строк. Наиболее часто применяется для выборки минимальных и максимальных значений.
Пример
Необходимо выбрать товар с минимальной ценой закупки.
Для этого:
1. Выберем из таблицы «Номенклатура» следующие поля:
2. На вкладке «Условия» установим, чтобы в выборку попадали все элементы (не группы), кроме услуг:
3. На вкладке «Порядок» установим сортировку по возрастанию значений поля «ЦенаЗакупки»:
4. И наконец на вкладке «Дополнительно» установим выборку данных: «Первые 1»:
5. Получим следующий результат:
Найти минимальное значение можно также и с помощью агрегатной функции «МИНИМУМ», но в таком случае мы сможем получить только минимальную цену, но при этом не сможем увидеть, к какому товару она относится:
Без повторяющихся
Данная опция предназначена для исключения дублирующихся записей в выборке.
Пример
Выбрать какие варианты сумм закупок производились по определенной номенклатуре.
Для этого:
1. Выберем регистр «Закупки» со следующими полями:
2. На вкладке «Условия» зададим отбор по определенной номенклатуре:
3. Установим значение параметра «Номенклатура»:
4. И выполним запрос:
Как видим, вернулось 3 строки, 2 из которых абсолютно идентичные.
5. Снова зайдем в конструктор запросов и на вкладке «Дополнительно» установим флаг «Без повторяющихся»:
6. Теперь выполнив запрос увидим следующий результат:
Все повторяющиеся строки были убраны.
При этом такого же эффекта можно было бы добиться и с помощью группировок:
Но группировки в основном предназначены для вычисления агрегатных значений, а не просто устранения дублей. Плюсом использования оператора «РАЗЛИЧНЫЕ» является более короткая запись и отсутствие необходимости указывать все группируемые поля, как это нужно было бы делать при использовании оператора «СГРУППИРОВАТЬ ПО». С точки зрения производительности оба варианта +/− одинаковы.
Создание временной таблицы
Временная таблица — таблица, создаваемая по результатам запроса и хранящаяся на сервере пока существует объект «МенеджерВременныхТаблиц», содержащий эту временную таблицу. Когда этот объект уничтожается, уничтожаются и временные таблицы.
Временные таблицы позволяют значительно упрощать сложные запросы.
Для создания временной таблицы, используется оператор «ПОМЕСТИТЬ В».
Пример
Необходимо выбрать всех контрагентов, купивших книги, но при этом не покупавших тетради.
По внесенным первоначальным данным у нас есть 2 покупателя, купивших книги, но только 1 из них при этом не покупал тетрадь:
Для этого:
1. Выберем из регистра «Продажи» всех клиентов и номенклатуру, которую они покупали:
2. Далее на вкладке «Условия» сделаем отбор только тех случаев, когда покупались книги или тетради:
3. А теперь на вкладке «Дополнительно» укажем, чтоб выборка производилась без дублей (ведь один клиент мог несколько раз купить книги или тетради, следовательно будут повторы), а ее результат был помещен во временную таблицу «ВТ_КнигиТетради»:
Теперь к этим покупателям можно обращаться простым запросом ко временной таблице, а не составлять каждый раз один и тот же запрос к регистру со всеми условиями и пр. Запрос же ко временной таблице будет рассмотрен позже при описании вкладки «Пакет запросов».
4. Зададим значение параметра «СписокНоменклатуры». Данный параметр должен быть параметром списочного типа, т.е. содержать в себе несколько значений, в нашем случае это ссылки на товары Книги и Тетради. Для этого нужно произвести несколько действий:
- Указать тип параметра «Список»:
- В поле значения параметра нажать «Выбрать»:
Т.к. значение параметра не было ничем заполнено, то возможно получим следующее предупреждение:
Просто нажмите «ОК».
- В окне списка значений нажмите «Добавить» и в новой строке списка «Выбрать»:
- Т.к. мы хотим указать список товаров, то выбираем тип данных «Номенклатура»:
- После выбора типа данных «Номенклатура» появляется соответствующее окно выбора номенклатуры:
Если бы мы выбрали другой тип данных, то появилось бы окно соответствующее этому типу либо, в случае чисел или строк, значение можно было ввести прямо в окне списка.
- Таким же образом добавляем в список тетради. Должно получиться так:
- Нажимаем «ОК» и получаем заполненный параметр списочного типа:
5. Выполнив запрос получим следующий результат:
Как видите, вернулось поле «Количество» со значением 4, означающее, что во временную таблицу было помещено 4 записи. Для того, чтобы вывести сами записи из временной таблицы, необходимо выполнить еще один запрос уже к ней, но эта тема будет рассмотрена позже при описании вкладки «Пакет запросов».
Уничтожение временной таблицы
Пример
Для уничтожения временной таблицы достаточно просто зайти на вкладку «Дополнительно» и выбрать этот вариант, указам имя уничтожаемой таблицы:
После уничтожения временной таблицы обращаться к ней, естественно, будет уже невозможно.
Блокировка записей
Зачем нужна блокировка записей?
«Контроль остатков» при проведении документа — нормальная операция для учетной системы. Однако у неопытного разработчика может возникнуть ситуация, когда система не сможет верно оценить количество товаров на складе, что приведет к ошибкам в учете.
Рассмотрим пример возможной ошибки списания в минус:
Рассмотрим хронологическую последовательность:
- На складе 10 карандашей.
- Пользователь №1 начинает проводить документ и спрашивает у системы: есть ли в наличии 8 карандашей? Система отвечает — да.
- Пользователь №2 начинает проводить документ и спрашивает у системы: есть ли в наличии 7 единиц товара? Система отвечает — да.
- Так как пользователь №1 получил одобрение от системы, документ списывает со склада 8 карандашей. На складе остаётся 2 штуки.
- Пользователь №2 тоже получил одобрение от системы, и документ, ничего не подозревая, списывает со склада еще 7 единиц.
- На складе возникает отрицательный остаток — минус 5.
Блокировка записей предотвращает отрицательные остатки, т.к. устанавливает блокировку на читаемые данные до конца транзакции (например, обработку проведения). И в вышепоказанном примере пользователь №2 встанет в очередь, пока пользователь №1 не закончит операцию с ресурсом.
Когда нужно использовать блокировку записей?
Если вы используете её, платформа устанавливает блокировку U-типа (блокировка для изменения (update)) до конца транзакции и не позволяет изменять данные другим пользователям. Т.о. данную опцию необходимо использовать для данных, которые планируется изменять в рамках текущей транзакции, в результате чего полученные данные будут захвачены до тех пор, пока транзакция не завершится.
Важные примечания
- Данная опция:
• игнорируется вне транзакции;
• актуальна ТОЛЬКО для автоматического режима управления блокировок (в режиме управляемых блокировок следует использовать объект БлокировкаДанных). - В случае если в области таблиц для изменений (внизу справа) отсутствуют какие-либо таблицы, блокироваться будут данные из всех таблиц, задействованных в запросе.
- В случае указания конкретных таблиц будут блокироваться только данные из перечисленных таблиц.
- Для блокировки можно указывать только таблицы верхнего уровня (т.е. не табличные части), участвующие в запросе.
- Должны приводиться именно имена таблиц, а не их псевдонимы, определенные в запросе.
- В случае указания виртуальной таблицы будут блокированы данные из всех таблиц, задействованных в виртуальной таблице.
- При указании виртуальной таблицы следует записывать ее имя без параметров.
Пример
← К оглавлению