Правила запроса. Выдержки из книги "Настольная книга 1С:Эксперта по технологическим вопросам"
В данном случае имеется в виду не ошибка платформы, как заметили читатели, а следующая структура:
СсылкаНаДокумент = Документы.ЗаказПокупателя.НайтиПоКоду("0000000");
СсылкаНаДокумент.Контрагент // В данном случае тянутся все реквизиты объекта
Автор показывает, что в данном случае лучше воспользоваться запросом и получить нужный нам реквизит. Не знаю, был ли фикс в какой-то из современных платформ. Но у нас в компании до сих пор получение реквизитов не через запрос считается плохим тоном.
Пояснение к правилу 3 («ДЛЯ ИЗМЕНЕНИЯ»)
При работе в автоматическом режиме блокировок при использовании конструкции ДЛЯ ИЗМЕНЕНИЯ надо указывать, какие таблицы блокировать, если в запросе участвует больше одной таблицы.
Конструкция ДЛЯ ИЗМЕНЕНИЯ используется, чтобы вместо разделяемой блокировки S установить блокировку обновления U, совместимость которой с другими блокировками хуже, см. таблицу совместимости в конце раздела 3.7. Таким способом защищаются от взаимоблокировки которая возникает при повышении уровня блокировки в транзакциях с уровнем изоляции Repeatable Read и Serializable39.
Если не указывать, какие таблицы блокировать, то блокировка обновления U будет установлена на все таблицы, перечисленные в запросе, даже на те, в которые дальше не будет записи. Это будет мешать другим пользователям работать с ними.
ВЫБРАТЬ... ИЗ... ГДЕ <условие>
СОЕДИНЕНИЕ... ПО <усповие>
ВЫБРАТЬ... ИЗ <ВиртуальнаяТаблица>(, <условие>)
ИМЕЮЩИЕ <условие>
- индекс по уникальному идентификатору (ссылке) для всех объектных сущностей (справочники, документы и т. д.);
- индекс по регистратору (ссылке на документ) для таблиц движений регистров, подчиненных регистратору;
- индекс периоду и значениям всех измерений для итоговых таблиц регистров накопления;
- индекс периоду, счету и значениям всех измерений для итоговых таблиц регистров бухгалтерии.
Если в структуре базы данных отсутствует индекс, удовлетворяющий всем перечисленным условиям, то для получения результата СУБД будет вынуждена сканировать таблицу или один из ее индексов. Это приведет к увеличению времени выполнения запроса, а также к возможному снижению параллельности системы, поскольку возрастет количество установленных блокировок.
Требования к индексу, перечисленные в рекомендациях, связаны с физической структурой индекса в СУБД. Эта структура представляет собой дерево значений проиндексированных полей. На первом уровне дерева находятся значения первого поля индекса, на втором — второго и так далее. Такая структура позволяет достичь высокой эффективности при поиске по индексу. Кроме того, она гарантирует отсутствие деградации производительности индекса с ростом количества данных.
Однако, индекс такой структуры, очевидно, может быть использован только строго определенным образом. Сначала необходимо провести поиск по значению первого поля индекса, затем — второго и так далее. Если, например, условие по первому полю индекса не указано, то индекс уже не сможет обеспечить быстрый поиск. Если указано условие по нескольким первым полям индекса, а затем одно или несколько полей индекса не задано, то индекс может быть использован только частично.
Не относится в срезам последних/первых Регистров сведений. Так как использование параметров виртуальной таблицы могут дать не тот результат который нужен.
Пример
Кадровый учет.
Регистр сведений кадровой истории.
ПЕРИОД СОТРУДНИК ВИД ДЕЙСТВИЯ
01.01.2019 Иванов Прием
01.01.2019 Петров Прием
01.05.2019 Иванов Увольнение
При выборке среза последних на 01.06.2019 если условие запроса ВидДействия = Прием установить в параметры ВТ то в результате будут две строки от 01.01.2019 так как условие будет выполняться при формировании ВТ среза последних. В результате на 01.06.2019 попадет Иванов который уволен 01.05.2019.
А если это условие вынести в ГДЕ то сначала в ВТ выберутся строки 01.01.2019 Петров и 01.05.2019 Иванов, а затем сработает отбор и в результате останется только Петров который реально принят на 01.06.2019.
СУММА(Остатки.СУММАВзаиморасчетовОстаток) КАК СуммаВзаиморасчетовОстаток
- Крайне медленное выполнение запроса при слабой загрузке серверного оборудования. Замедление запроса может быть очень значительным (до нескольких порядков).
- Нестабильная работа запроса. При некоторых условиях запрос может работать достаточно быстро, при других — очень медленно.
- Значительная разница по времени выполнения запроса на разных СУБД.
- Повышенная чувствительность запроса к актуальности и полноте статистик. Сразу после полного обновления статистик запрос может работать быстро, но через некоторое время опять замедлиться.
ВЫБРАТЬ ...ИЗ Документ.РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ(
ВЫБРАТЬ ИЗ РегистрСведений.Лимиты
ГДЕ...
СГРУППИРОВАТЬ ПО...
) ПО...
// Создать менеджер временных таблиц
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
// Текст пакетного запроса
Запрос.Текст = "
// Заполняем временную таблицу. Запрос к регистру лимитов.
| ВЫБРАТЬ...
| ПОМЕСТИТЬ Лимиты | ИЗ РегистрСведений.Лимиты
| ГДЕ...
| СГРУППИРОВАТЬ ПО...
| ИНДЕКСИРОВАТЬ ПО...;
// Выполняем основной запрос с использованием временной таблицы
ВЫБРАТЬ...
ИЗ Документ.РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Лимиты
ПО...;“
ВЫБРАТЬ
ЗаказПациента.Ответственный,
РасчетыСКлиентамиОстатки.СуммаОстаток
ИЗ
Документ.ЗаказПациента КАК ЗаказПациента
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.РасчетыСКлиентами.Остатки(, ЗаказКлиента = &ЗаказКлиента) КАК РасчетыСКлиентамиОстатки
ПО (РасчетыСКлиентамиОстатки.ЗаказКлиента = ЗаказПациента.Ссылка)


ВЫБРАТЬ
РасчетыСКлиентамиОстатки.СуммаОстаток КАК СуммаОстаток,
ВЫРАЗИТЬ(РасчетыСКлиентамиОстатки.ЗаказКлиента КАК Документ.ЗаказПациента) КАК ЗаказКлиента
ПОМЕСТИТЬ ВТ_РасчетыСКлиентамиОстатки
ИЗ
РегистрНакопления.РасчетыСКлиентами.Остатки(, ЗаказКлиента = &ЗаказКпиента) КАК РасчетыСКлиентамиОстатки
ИНДЕКСИРОВАТЬ ПО
ЗаказКлиента
;
////////////////////////////////////////////////
ВЫБРАТЬ
ЗаказПациента.Ответственный,
ВТ_РасчетыСКпиентамиОстатки.СуммаОстаток
ИЗ
Документ.ЗаказПациента КАК ЗаказПациента
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_РасчетыСКлиентамиОстатки КАК ВТ_РасчетыСКлиентамиОстатки
ПО (ВТ_РасчетыСКлиентамиОстатки.ЗаказКлиента = ЗаказПациента.Ссылка)
-
Совершенно точно не пользоваться для получения данных от полей составного типа (при возникновении проблем на данном участке кода).
-
Для сравнения ссылок сравнивать только ссылки, если от этого не страдает логика (при возникновении проблем на данном участке кода менять логику).
ПО ФИО.ФизЛицо = ФизЛица.Ссылка
а не
ПО ФИО.ФизЛицо.Наименование = ФизЛица.Ссылка.Наименование
-
Не получать еще раз Ссылка
ПО ФИО.ФизЛицо = ФизЛица.Ссылка
а не
ПО ФИО.ФизЛицо.Ссылка = ФизЛица.Ссылка
-
Никогда не использовать конструкцию Ссылка.Ссылка. Это всегда ошибка
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
См. также
Инструментарий разработчика Роли и права Запросы СКД Разработчик Руководитель проекта 1С:Предприятие 8 Платные (руб)
Инструменты для разработчиков 1С 8.3 и 8.5: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.
16500 руб.
02.09.2020 285543 1606 423
Инструментарий разработчика Запросы Разработчик 1С 8.3 1С:Бухгалтерия 3.0 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)
Структура запроса. Обработка визуально показывает, из какого количества подзапросов состоит запрос.
2 стартмани
06.07.2026 4940 65 XSlava 20
Запросы Разработчик 1С 8.3 Россия Бесплатно (free)
Визуальный «Конструктор запроса» 1С, встроенный прямо в VS Code, — аналог конструктора из Конфигуратора и EDT, но без запуска платформы. Расширение читает конфигурацию, выгруженную в файлы, позволяет собрать запрос мышью и генерирует корректный текст на языке запросов 1С (SDBL). Открывает уже существующий текст запроса из кода для правки и — что особенно ценно — сохраняет комментарии при цикле «открыть - править - сохранить». Подходит тем, кто пишет код 1С в VS Code, держит под рукой множество проектов и не хочет ради одного запроса запускать тяжёлый Конфигуратор или EDT.
26.06.2026 10656 Alex_YAM 7
Нейросети Инструментарий разработчика Запросы Разработчик 1С:Предприятие 8 Абонемент ($m)
Консоль запросов 1.0: добавлен ИИ-помощник (запрос в DeepSeek), который помогает быстрее получать каркас Запроса 1С Сформулируйте простое описание; нажмите кнопку – получите результат прямо в консоли. Где дальше его можно дорабатывать и тестировать. 28.5.2026 Добавил "Консоль запросов 2.0" (запрос в DeepSeek + Claude) 4.10.2026 Обновил "Консоль запросов 2.0"
3 стартмани
20.05.2026 9560 46 German4739 72
WEB-интеграция Запросы Разработчик 1С 8.3 Абонемент ($m)
Post1C - это внешняя обработка, которая превращает 1С в полноценный инструмент для тестирования REST API. Всё управление сосредоточено в одном окне: настройка запроса, выполнение, просмотр ответа и генерация кода - без переключения между формами. Аналог Postman, но работающий в привычной среде 1С.
1 стартмани
02.04.2026 4635 105 priem_nv 27
Запросы Механизмы типовых конфигураций Разработчик 1С:Предприятие 8 1С:Управление торговлей 11 Россия Бесплатно (free)
Предлагается обзор работы с объектной моделью запроса по схемам запросов типовым функционалом УТ 11.5.
09.10.2025 13394 aximo 18
Инструментарий разработчика Запросы Разработчик 1С:Предприятие 8 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)
QueryConsole1C — расширение, включающее консоль запросов с поддержкой исполняемых представлений — аналогов виртуальных таблиц, основанных на методах программного интерфейса ЗУП. Оно позволяет выполнять запросы с учётом встроенной бизнес-логики, отлаживать алгоритмы получения данных и автоматически генерировать код на встроенном языке 1С.
1 стартмани
16.05.2025 13655 168 zup_dev 32
Инструментарий разработчика Запросы Разработчик 1С:Предприятие 8 1С:ERP Управление предприятием 2 Абонемент ($m)
В данной публикации рассказывается о решении, которое позволяет находить сразу все ошибки в тексте запроса за раз, а не только самую первую.
2 стартмани
05.03.2025 7712 25 XilDen 12
2. Нельзя писать код с учетом косяка конкретной версии платформы. Так же не раскрыто правило на которое ссылается абцаз.
4. От запроса до плана запроса в SQL-базе пройдет много шагов, включая оптимизацию (упорядочивание условий по существующим индексам). Кроме того для выборки используются не только индексы, но и статистика - все это нелинейно. Совет может вселить ложную уверенность.
9. Неоднократно оптимизировал куски функцию путем убирания временных таблиц в пользу подзапроса. Получалось существенно быстрее.
10. Индексирование по полям временной таблицы - не серебряная пуля. Особенно есть ВТ используется в запросе один раз.
4. С 4 не могу согласиться, так как при создании объектов конфигурации в SQL базе создаются индексы поиск по которым, независимо от статистики будет происходить быстрее, исходя из документации к SQL. Поэтому выборка по индексам изначально выполняется быстрее. Под статистикой Вы подразумеваете оптимизацию запроса средствами SQL? Если да, то независимо от набранной статистики запрос по индексам выполняется быстрее.
9. Я лишь единожды встречал, чтобы подзапрос работал быстрее временной таблицы. В данном случае я посчитал это исключением из правил и не стал делать на это акцент.
10. Тут, пожалуй, нужно сделать оговорку, что в некоторых случаях лучше индексировать. Поправлю статью, как только появится свободное время.
Кадровый учет.
Регистр сведений кадровой истории.
ПЕРИОД СОТРУДНИК ВИД ДЕЙСТВИЯ
01.01.2019 Иванов Прием
01.01.2019 Петров Прием
01.05.2019 Иванов Увольнение
При выборке среза последних на 01.06.2019 если условие запроса ВидДействия = Прием установить в параметры ВТ то в результате будут две строки от 01.01.2019 так как условие будет выполняться при формировании ВТ среза последних. В результате на 01.06.2019 попадет Иванов который уволен 01.05.2019.
А если это условие вынести в ГДЕ то сначала в ВТ выберутся строки 01.01.2019 Петров и 01.05.2019 Иванов, а затем сработает отбор и в результате останется только Петров который реально принят на 01.06.2019.
Если условие находится в параметрах виртуальной таблицы, как я понимаю, сначала идет выборка из реальной таблицы всех записей с учетом этих условий, а затем последние записи по периоду.
Если условия установить в ГДЕ то сначала идет выборка из реальной таблицы последних значений по периоду, а потом накладывается условие.
Применительно к моему примеру.
В первом варианте выборка делается с учетом условия в параметрах виртуальной таблицы ВидДействия - Прием. т.е. результат ВТ до выборки последних уже равен первым двум строкам.
01.01.2019 Иванов Прием
01.01.2019 Петров Прием
А во втором случае выбираются последние записи по измерениям.
01.01.2019 Иванов Прием
01.05.2019 Иванов Увольнение
Затем срабатывает условие ВидДействия - Прием и вторая строка исключается.
Как я понимаю это касаемо тех случаев когда нам нужно делать условия по ресурсам. Если в условии присутствуют только измерения, то их можно указывать только в параметрах виртуальной таблицы, так как двух строк с одинаковыми измерениями в этом случае не будет.
Недавно где-то в статье тут на инфостарте увидел, что Период в периодическом регистре сведений в платформе 8.3 стоит после измерений в индексе, так что непонятно почему должна производительность упасть.
Что-то может вам(нам) показаться логически верным только здесь и сейчас.
Вчера, завтра и где-то там доказанное вами утверждение вероятно будет абсурдом.
Вчера, завтра и где-то там доказанное вами утверждение вероятно будет абсурдом.
А еще теория далека от практики :) Взять например те же нормальные формы из теории БД.
p.s. Кто знает, возможно после получения автором книги этих дополнений - автора статьи пригласят из обыденной компании на интересную ему работу в фирму "1С" с кратным повышением оклада, а далее возможно поднимется и до уровня руководителя какого-нибудь отдела. Да и приятно будет видеть свои дополнения в книге, выпускаемой под редакцией фирмы "1С" - это также и очень хорошая рекомендация для потенциальных работодателей автора статьи (тем более в книге, касающейся производительности систем 1С, специалистов которых на рынке и так "раз, два и обсчитался")
только ради личной материальной выгодыа крайняя категоричность
говорит о незрелости автора и прогрессирующем снобизме.
с чего он взял что не любят читать и не знакомы - сделал опрос старшеклассников в своем дворе и
сразу такой вывод?
Причем, идей от автора так и не поступило. Посему говорить о том, что из него выйдет что-то путное, в контексте профессионализма, преждевременно.
Вам не стоит пытаться увидеть в людях только плохое.
мне лично больно видеть в вас то, на что вы сами махнули рукой. (36)
Ведь можно оперировать элементарной логикой и практикой без звоночков из детства: "А вот Марь Ивановна сказала, что так нельзя..."
ИЛИ - это ключевое слово языка запросов и его использование является нормальным без всяких доказательств.
А вот вопрос эффективности использования ИЛИ зависит от множества факторов и диспут по этому поводу мне напоминает кваканье жаб, каждая из которых хвалит свое болото.
(43)
Ссылаться на человека, который знает явно больше моего в 1с, считаю вполне нормальным. Вообще, применять рекомендации, которые написаны в рамках методической поддержки пользователю является хорошим тоном.
"ИЛИ - это ключевое слово языка запросов и его использование является нормальным без всяких доказательств." Только вот как раз об этом и говорится, что не всегда это является нормальным. В большинстве случаев это несет потерю производительности.
То, что Вы называете "практикой без звоночков из детства" в научных кругах называется "ссылка на авторитетный источник".
(51) Не вижу ничего зазорного чего-то не знать. Это дайджест - "публикация наиболее интересных материалов из разных областей знаний, появившиеся в печати в последнее время". В данном случае я на тематическом портале делаю выдержку наиболее интересных материалов в определенной области.
По поводу "не знания" Вы так и не ответили мне на свой комментарий (31) в котором указали, что ВЫБОР КОГДА тоже условие по которому накладывается индекс, хотя практика показывает, что это не так.
Интересна позиция администрации ИС, потому как, напомню, "полное или частичное копирование материалов книги без письменного разрешения фирмы "1С-Паблишинг" запрещается". У вас есть такое разрешение?)
А так да, следуя вашей логике, и в воровстве ничего плохого нет - ворованное многие охотно скупают и пользуются)
Потому что, например, в п.4 совершенно не освещена такая прелесть, как ВЫБОР КОГДА, а это тоже условие. И мне доводилось видеть феерическое несоответствие производительности в этой части казалось бы подходящим индексам СУБД.
(31) Проверил на практике. По полям ВЫБОР КОГДА индекс не строится. Автор в 4 пункте раскрыл все имеющиеся поля для связи по индексам. Скорее всего, ВЫБОР КОГДА начинает работать после обращения к SQL базе. То есть, мы получаем результаты запроса из SQL и потом начинается перебор значений подходящих под условия ВЫБОР КОГДА.
4. Я бы сказал так - доп-индексы следует создавать только тогда, когда это действительно решает проблему производительности (зафиксирован реальный профит). Даже эффективные на первый взгляд индексы могут по факту оказываться неэффективными с точки зрения оптимизатора запросов и использоваться не будут.
9,10 - хорошо, что оговорки написали :) На том же MSSQL я практически не сталкивался с ситуациями, когда вынос подзапросов (особенно тяжелых) во временные таблицы улучшал производительность. когда ухудшало - сталкивался. Хотя тут, конечно, очень многое зависит от того, как именно используется подзапрос. Возможно, это особенность моего стиля написания запросов. Индексация временных таблиц тоже никогда не приводила к заметному улучшению производительности в моей практике. Опять же, речь про MSSQL и мою личную практику. При работе с Postgresql работа оптимизатора вызывала гораздо больше wtf. Он там судя по всему гораздо более "деревянный". Поэтому там разбиение запроса на этапы может быть оправдано, чтобы не давать оптимизатору много шансов на ошибку.
Создание доп-индексов - это обычно уже оптимизация и она не бесплатна. Хотя бывают конечно случаи, когда уже на этапе проектирования необходимость доп-индекса совершенно очевидна. Ну, то есть заранее известно что таблица будет очень большая, условия по этому полю будут применяться в критичных по времени выполнения запросах, а индекс по этому полю будет иметь очень высокую селективность. Другими словами, оптимизатор этим индексом точно пренебрегать не станет.
(43) В статье же написано, что заморачиваться отказом от ИЛИ стоит только при решении задач оптимизации. И это вполне разумный совет. Потому что наличие ИЛИ сразу делает невозможным применение эффективных алгоритмов с использованием хэш-таблиц. И если переписать запрос, то вполне можно получить существенную оптимизацию. Или не получить, если бутылочное горлышко было в другом месте :)
Я читал, что в MS SQL так и получается, то есть подзапросы обрабатываются как служебные временные таблицы, разве что индексирования там не происходит.
У меня ровно те же наблюдения в части работы с MS SQL Server - чаще подзапросы работают быстрее чем ВТ. Ну и индексация ВТ в небольшом запросе чаще роняет перформанс.
Для постгрес могу сказать только одно - если можно не использовать его как сторадж для 1с, лучше не использовать.
В том случае, если в запросе используется оператор В с подзапросом, то вместо подзапроса будет использоваться соединение с таблицей, которая используется в операторе В. Данная замена применяется только в том случае, если в результате замены не изменяется результат запроса.
В режиме совместимости с версией 8.3.12 поведение не изменилось.
Источник:
Более того, изменилось дефолтное поведение. Теперь CTE-подзапрос по умолчанию будет инлайниться, если его результат используется один раз. В противном случае будет как раньше материализовываться.
Важные изменения в работе CTE в PostgreSQL 12
так же при выводе результатов запроса еще бывают моменты, когда платформа строит дополнительный запрос (например, когда требуется вывести пользователю информацию) для получения представления. Напр. при выводе сообщения типа .ссылка, платформа строит доп. запрос к субд для получения преставления ссылки. Конечно, это милисекунды в 3-4 знаке после запятой, но при больших числах и массовом работе, могут быть и задержки посерьезнее ))
Еще запросы в цикле - дебилизм, за который надо бить лопатой.
Еще неявные запросы в цикле, напр:
Для каждого стр из Товары цикл
стр.чтотам = стр.коечто.коегде.коекак;
КонецЦикла;
Конструкция стр.коечто.коегде.коекак в данном случае работает как дополнительный запрос с подзапросом.
Табличная часть документа содержит Номенклатуру и Количество. Запросом нужно получить таблицу, где кроме этих полей будет КоличествоОстаток. Остатки хранятся в регистре остатков с измерением Номенклатура и ресурсом Количество. Естественно первая мысль - делаем левое соединение по Номенклатуре:
без условия в параметрах виртуальной таблицы
"ВЫБРАТЬ
| ПродажаТоваровТовары.Номенклатура КАК Номенклатура,
| ПродажаТоваровТовары.Количество КАК Количество,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
|ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(&ПозицияДокумента) КАК ОстаткиНоменклатурыОстатки
| ПО ПродажаТоваровТовары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
|ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка";[/spoiler]
Но вспоминаем, как важно использовать параметры виртуальной таблицы. В нашем случае напрашивается условие на наличие Номенклатуры регистра в списке Номенклатуры из табличной части. Однако для того, чтобы выполнить это требование приходится в параметры виртуальной таблицы вставлять вложенный запрос. А чтобы этот вложенный запрос не дублировал получение данных табличной части - напрашивается временная таблица. Вобщем получается что-то такое:
с условием в параметрах виртуальной таблицы
[1C-CODE]"ВЫБРАТЬ
| ПродажаТоваровТовары.Номенклатура КАК Номенклатура,
| ПродажаТоваровТовары.Количество КАК Количество
|ПОМЕСТИТЬ втТовары
|ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
|ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| втТовары.Номенклатура КАК Номенклатура,
| втТовары.Количество КАК Количество,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
|ИЗ
| втТовары КАК втТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &ПозицияДокумента,
| Номенклатура В
| (ВЫБРАТЬ
| втТовары.Номенклатура КАК втТоварыНоменклатура
| ИЗ
| втТовары)) КАК ОстаткиНоменклатурыОстатки
| ПО втТовары.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура";
ПоказатьТеперь в свете рекомендаций из статьи топика возникает желание уйти от соединения с виртуальной таблицей. Как следствие, временных таблиц в запросе становится аж две, и примитивный запрос превращается вот в такого переростка:
избавляемся от соединения с виртуальной таблицей
"ВЫБРАТЬ
| ПродажаТоваровТовары.Номенклатура КАК Номенклатура,
| ПродажаТоваровТовары.Количество КАК Количество
|ПОМЕСТИТЬ втТовары
|ИЗ
| Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
|ГДЕ
| ПродажаТоваровТовары.Ссылка = &Ссылка
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
| ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток
|ПОМЕСТИТЬ втОстатки
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &ПозицияДокумента,
| Номенклатура В
| (ВЫБРАТЬ
| втТовары.Номенклатура КАК втТоварыНоменклатура
| ИЗ
| втТовары)) КАК ОстаткиНоменклатурыОстатки
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|//////////////////////////////////////////////////////////// ////////////////////
|ВЫБРАТЬ
| втТовары.Номенклатура КАК Номенклатура,
| втТовары.Количество КАК Количество,
| втОстатки.КоличествоОстаток КАК КоличествоОстаток
|ИЗ
| втТовары КАК втТовары
| ЛЕВОЕ СОЕДИНЕНИЕ втОстатки КАК втОстатки
| ПО втТовары.Номенклатура = втОстатки.Номенклатура"; ПоказатьРезультат получаем тот же.
Правильно ли я понимаю, что на экзамене нужно использовать третий вариант, чтобы не рисковать оценкой?
Во второй части запроса при указании параметров виртуальной таблицы можно обратиться подзапросом к ТЧ документа точно так же, как ко временной таблице.
В общем, я бы убрал втТовары.
При левом соединении если временная таблица находится слева, индексировать ее не нужно. Все равно будет чтение всех записей таблицы.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 1078667
Создание 17.06.19 23:52
Обновление 17.06.19 23:52
Просмотры 27279
Загрузки 0
Рейтинг
95
Комментарии 73
Код открыт Да
Рубрики Запросы
Кому Разработчик
Тип файла Нет файла
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)