Представленный в статье запрос используется точечно для ручной переотправки документов и не предполагался к работе с высокой нагрузкой. Конечно есть пути для ускорения данного динамического списка, но в статье рассматривается проблема ключа, а не самого запроса как такового.
При написании произвольных запросов динамического списка c включенным динамическим получением данных можно столкнуться c данной ошибкой, даже если вы гарантировано написали запрос без дубликатов по ключевому полю.
Пример исходного запроса:
ВЫБРАТЬ
ДополнительныеРеквизитыИСведения.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВтДополнительноеСведение
ИЗ
ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения КАК ДополнительныеРеквизитыИСведения
ГДЕ
ДополнительныеРеквизитыИСведения.ИдентификаторДляФормул = "ДСПоЭДО"
И НЕ ДополнительныеРеквизитыИСведения.ПометкаУдаления
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗЛИЧНЫЕ
ДополнительныеРеквизитыПартнеров.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВтПартнеры
ИЗ
Справочник.Партнеры.ДополнительныеРеквизиты КАК ДополнительныеРеквизитыПартнеров
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтДополнительноеСведение КАК ВтДополнительноеСведение
ПО ДополнительныеРеквизитыПартнеров.Свойство = ВтДополнительноеСведение.Ссылка
ГДЕ
ДополнительныеРеквизитыПартнеров.Значение = ИСТИНА
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Акт.Ссылка КАК Ссылка,
Акт.Дата КАК Дата,
Акт.Номер КАК Номер,
Акт.Партнер КАК ПартнерДокумента,
ЕСТЬNULL(ДополнительныеСведенияСтатус.Значение, 0) КАК СтатусЗадания,
ЕСТЬNULL(ДополнительныеСведенияНомер.Значение, "") КАК НомерЗадания
ИЗ
Документ.АктОРасхожденияхПослеПриемки КАК Акт
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтПартнеры КАК ВтПартнеры
ПО Акт.Партнер = ВтПартнеры.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведенияСтатус
ПО Акт.Ссылка = ДополнительныеСведенияСтатус.Объект
И (ДополнительныеСведенияСтатус.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.СтатусЗадания))
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведенияНомер
ПО Акт.Ссылка = ДополнительныеСведенияНомер.Объект
И (ДополнительныеСведенияНомер.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.НомерЗадания))
1) Первое, что надо попробовать, это использовать символы {} для указания списку, что соединения не обязательны и не будут являться составляющим авто поля ключа.
{ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВтПартнеры КАК ВтПартнеры
ПО Акт.Партнер = ВтПартнеры.Ссылка
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведенияСтатус
ПО Акт.Ссылка = ДополнительныеСведенияСтатус.Объект
И (ДополнительныеСведенияСтатус.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.СтатусЗадания))
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведенияНомер
ПО Акт.Ссылка = ДополнительныеСведенияНомер.Объект
И (ДополнительныеСведенияНомер.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения.НомерЗадания))}
2) Если первый способ не помог и у вас платформа не ниже 8.3.10, можно воспользоваться событием ПриПолученииДанныхНаСервере, выведя таким образом получение дополнительных данных в отдельный запрос, это хорошо описано тут:
https://wonderland.v8.1c.ru/blog/obrabotka-i-oformlenie-dannykh-dinamicheskogo-spiska/
3) Иногда может помочь использование конструкции "В", хоть и она не рекомендуется в плане оптимизации
ГДЕ
Акт.Партнер В
(ВЫБРАТЬ
ВтПартнеры.Партнер
ИЗ
ВтПартнеры)
Вступайте в нашу телеграмм-группу Инфостарт