День добрый!
Конфа БП 3.0.
Цель: Найти в остатках регистра бухгалтерии Хозрасчетный - справочники (указанные в субконто), которые помечены на удаление.
Вопрос: Как сделать это оптимально? Так как это будет обработка на регламенте.

Пока есть следующая мысль:
1. Собрать список ПВХ ВидыСубконтоХозрасчетного, типами которых являются справочники;
2. В цикле по этому списку ПВХ собрать текст следующего запроса. Пример ниже.

Подскажите, как бы вы это сделали?

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК ПомеченныйНаУдалениеСправочник
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(&ПериодРегистрации, , &ВидСубконто1, Организация В (&Организации)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ХозрасчетныйОстатки.Субконто1.ПометкаУдаления
    |
    |ОБЪЕДИНИТЬ
    |
    |ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет,
    | ХозрасчетныйОстатки.Субконто1
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(&ПериодРегистрации, , &ВидСубконто2, Организация В (&Организации)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ХозрасчетныйОстатки.Субконто1.ПометкаУдаления
    |
    ... и так далее"
```
---
(5) (6) Сделал замер, итоги следующие:

1.

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ХозрасчетныйОстатки.Субконто1.ПометкаУдаления"
```

РезультатЗапроса = Запрос.Выполнить(); 24,209429

____________________________________________________________­__________________________
2.

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.ИмяСправочника).ПометкаУдаления"
```

РезультатЗапроса = Запрос.Выполнить(); 1,802102

____________________________________________________________­__________________________
3.

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)
    | И Субконто1.ПометкаУдаления) КАК ХозрасчетныйОстатки"
```

БАЗА ВЫЛЕТАЕТ

____________________________________________________________­__________________________
4.

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)
    | И ВЫРАЗИТЬ(Субконто1 КАК Справочник.ИмяСправочника).ПометкаУдаления) КАК ХозрасчетныйОстатки"
```

РезультатЗапроса = Запрос.Выполнить(); 2,421278

____________________________________________________________­__________________________
5.

```1c
    "ВЫБРАТЬ
    | ТекСправочник.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ втИмяСправочника
    |ИЗ
    | Справочник.ИмяСправочника КАК ТекСправочник
    |ГДЕ
    | ТекСправочник.ПометкаУдаления
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Ссылка
    |;
    |
    |//////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)
    | И Субконто1 В
    | (ВЫБРАТЬ
    | втИмяСправочника.Ссылка
    | ИЗ
    | втИмяСправочника КАК втИмяСправочника)) КАК ХозрасчетныйОстатки"
```

РезультатЗапроса = Запрос.Выполнить(); 1,599885

____________________________________________________________­__________________________
6.

```1c
    "ВЫБРАТЬ
    | ТекСправочник.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ втИмяСправочника
    |ИЗ
    | Справочник.ИмяСправочника КАК ТекСправочник
    |ГДЕ
    | ТекСправочник.ПометкаУдаления
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Ссылка
    |;
    |
    |//////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ХозрасчетныйОстатки.Субконто1 В
    | (ВЫБРАТЬ
    | втИмяСправочника.Ссылка
    | ИЗ
    | втИмяСправочника КАК втИмяСправочника)"
```

РезультатЗапроса = Запрос.Выполнить(); 1,662331

____________________________________________________________­__________________________
7.

```1c
    "ВЫБРАТЬ
    | ТекСправочник.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ втИмяСправочника
    |ИЗ
    | Справочник.ИмяСправочника КАК ТекСправочник
    |ГДЕ
    | ТекСправочник.ПометкаУдаления
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Ссылка
    |;
    |
    |//////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)
    | И ВЫРАЗИТЬ(Субконто1 КАК Справочник.ИмяСправочника) В
    | (ВЫБРАТЬ
    | втИмяСправочника.Ссылка
    | ИЗ
    | втИмяСправочника КАК втИмяСправочника)) КАК ХозрасчетныйОстатки"
```

РезультатЗапроса = Запрос.Выполнить(); 1,762331
---
Условие на пометку на удаление, возможно стоит в параметры виртуальной таблицы занести, но это не точно - лучше план запроса посмотреть.
---
Пробовал - база вылетает)
а если условия в ГДЕ - не вылетает
---
Заинтригован. Завтра посмотрю планы.
---
А почему сразу в &ВидСубконто не загнать массив? Зачем это извращение с туевой хучей объединяемых подзапросов?

Или более того - сначала вообще найти все помеченные на удаление субконто необходимых видов, и только их использовать в запросе?
---
С регистром бухгалтерии это не работает
---
Согласен, параметр ВидСубконто в параметрах виртуалки бухрегистра просто определяет порядок вывода результата по субконто, если передается именно массив. (давно с бухией не работал)
Но ведь это не отменяет того, что можно сначала отдельно найти удаленные значения субконто, сгруппировать их по видам, и только потом отправлять в запрос...
---
Не только порядок. Будет еще ограничение на наличие всех указанных видов субконто на одном счете. И если мы укажем невозможные комбинации типа Статья затрат и Статья ДДС то не получим результат.
Сократ мне друг, но истина - дороже.
---
Ну да, в отбор попадут только счета, в которых есть такие субконто. Это я знаю. Я просто хотел акцентировать внимание на том, что порядок следования видов субконто в массиве позволяет очень корректно потом распоряжаться свойствами Субконто1, Субконто2 и т.д.
Ну ты понял, результат запроса будет выстроен в порядке указания видов субконто в массиве (для новичков пишу, вдруг заглянут).
мы укажем невозможные комбинации типа Статья затрат и Статья ДДС А вот это уже задачка для профи.
Я блин сейчас рассуждаю как архитектор - нельзя делать два запроса к SQL для получения одного результата. Наверное надо заранее подготовить правильный один запрос (пусть даже и динамически).

Сократ мне друг, но истина - дороже. Абсолютно без проблем! (я просто с бухией лет 10 не работал, могу ошибаться в нюансах, не отрицаю косяков, но и не претендую на истину)

PS. Или подумать над использованием другой виртуальной таблицы.
---
А если подробнее? Получу я помеченные на удаление:
Номенклатуры - 10 шт.
Номенклатурные группы - 10 шт.
Контрагенты - 10 шт.
Договора контрагентов - 10 шт.
Статьи затрат - 10 шт.
Статьи ДДС - 10 шт.

они у меня в массиве

а что дальше? куда их помещать в запросе к виртуальной таблице Остатки? Пример кода, если несложно.
Если только так:

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК ПомеченныйНаУдалениеСправочник
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконто1_Номенклатура,
    | Организация В (&Организации)
    | И Субконто1 В (&МассивНоменклатурПомеченныхНаУдаление)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Номенклатура).ПометкаУдаления
    |
    |ОБЪЕДИНИТЬ
    |
    |ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет,
    | ХозрасчетныйОстатки.Субконто1
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконто2_Контрагенты,
    | Организация В (&Организации)
    | И Субконто1 В (&МассивКонтрагентовПомеченныхНаУдаление)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.Контрагенты).ПометкаУдаления
    |
    ... и так далее"
```
---
ГДЕ будет лишним. Можно еще попробовать не типизировать субконто и одним запросом получить. Я завтра точно проверю несколько вариантов. Чисто из академических целей.
---
Сначала я бы просто получил остатки по всем субконто и счетам без условий – это должно быть быстро. Затем во встроенном языке собрал бы массивы субконто по своим типам и в запросе получил бы помеченные на удаление..
---
Так собрать массивы субконто можно и без первого запроса остатков...
---
Как? Нужны же только элементы справочников, участвующие в остатках.
---
Зачем? Для сравнения подойдут все удалённые. И только по ним отберутся остатки в конечном запросе.
Не понимаю лишних телодвижений.

А если нет остатков - ну и нет. Не судьба, значит.
---
Запрос с параметризованными остатками будет безбожно тормозить. Но вообще нужна предварительная статистика – процентаж удалённых, количество уникальных элементов на остатках.
---
Я думаю, что процент удаленных значений субконто - мизерен по сравнению со всем объёмом существующих значений субконто.

Либо автор надумал удалить 90% субконто специально, чтобы обрезать базу. Ну тут уж ограничения двойной записи ему в в руки вместе с флагом!
---
(5) (6) Сделал замер, итоги следующие:

1.

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ХозрасчетныйОстатки.Субконто1.ПометкаУдаления"
```

РезультатЗапроса = Запрос.Выполнить(); 24,209429

____________________________________________________________­__________________________
2.

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1 КАК Справочник.ИмяСправочника).ПометкаУдаления"
```

РезультатЗапроса = Запрос.Выполнить(); 1,802102

____________________________________________________________­__________________________
3.

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)
    | И Субконто1.ПометкаУдаления) КАК ХозрасчетныйОстатки"
```

БАЗА ВЫЛЕТАЕТ

____________________________________________________________­__________________________
4.

```1c
    "ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)
    | И ВЫРАЗИТЬ(Субконто1 КАК Справочник.ИмяСправочника).ПометкаУдаления) КАК ХозрасчетныйОстатки"
```

РезультатЗапроса = Запрос.Выполнить(); 2,421278

____________________________________________________________­__________________________
5.

```1c
    "ВЫБРАТЬ
    | ТекСправочник.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ втИмяСправочника
    |ИЗ
    | Справочник.ИмяСправочника КАК ТекСправочник
    |ГДЕ
    | ТекСправочник.ПометкаУдаления
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Ссылка
    |;
    |
    |//////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)
    | И Субконто1 В
    | (ВЫБРАТЬ
    | втИмяСправочника.Ссылка
    | ИЗ
    | втИмяСправочника КАК втИмяСправочника)) КАК ХозрасчетныйОстатки"
```

РезультатЗапроса = Запрос.Выполнить(); 1,599885

____________________________________________________________­__________________________
6.

```1c
    "ВЫБРАТЬ
    | ТекСправочник.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ втИмяСправочника
    |ИЗ
    | Справочник.ИмяСправочника КАК ТекСправочник
    |ГДЕ
    | ТекСправочник.ПометкаУдаления
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Ссылка
    |;
    |
    |//////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)) КАК ХозрасчетныйОстатки
    |ГДЕ
    | ХозрасчетныйОстатки.Субконто1 В
    | (ВЫБРАТЬ
    | втИмяСправочника.Ссылка
    | ИЗ
    | втИмяСправочника КАК втИмяСправочника)"
```

РезультатЗапроса = Запрос.Выполнить(); 1,662331

____________________________________________________________­__________________________
7.

```1c
    "ВЫБРАТЬ
    | ТекСправочник.Ссылка КАК Ссылка
    |ПОМЕСТИТЬ втИмяСправочника
    |ИЗ
    | Справочник.ИмяСправочника КАК ТекСправочник
    |ГДЕ
    | ТекСправочник.ПометкаУдаления
    |
    |ИНДЕКСИРОВАТЬ ПО
    | Ссылка
    |;
    |
    |//////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ХозрасчетныйОстатки.Счет КАК Счет,
    | ХозрасчетныйОстатки.Субконто1 КАК Справочник,
    | ХозрасчетныйОстатки.Организация КАК Организация
    |ИЗ
    | РегистрБухгалтерии.Хозрасчетный.Остатки(
    | &ПериодРегистрации,
    | ,
    | &ВидСубконтоИмяСправочника,
    | Организация В (&Организации)
    | И ВЫРАЗИТЬ(Субконто1 КАК Справочник.ИмяСправочника) В
    | (ВЫБРАТЬ
    | втИмяСправочника.Ссылка
    | ИЗ
    | втИмяСправочника КАК втИмяСправочника)) КАК ХозрасчетныйОстатки"
```

РезультатЗапроса = Запрос.Выполнить(); 1,762331
---
Получается, запрос #5 оптимален, даже без ВЫРАЗИТЬ.
FatPanzer, спасибо за подсказку.
Я делал один динамически собранный запрос по большой организации для справочников:
Контрагенты;
ДоговорыКонтрагентов;
Номенклатура;
НоменклатурныеГруппы;
ОбъектыСтроительства;
ОсновныеСредства;
НематериальныеАктивы;
ПрочиеДоходыИРасходы;
Склады;
СтатьиДвиженияДенежныхСредств;
СтатьиЗатрат;
ФизическиеЛица;
ЦенныеБумаги.