Имя: Пароль:
1C
1С v8
сравнение ТЧ документов
0 Black Dragon
 
30.12.14
10:25
Доброго дня!

есть некая конфа, в которой у некоторых доков в ТЧ встречается несколько собственников. Собственники некое подобие проектов. Для очистки старых(неиспользуемых) собственников требуется удалить все их документы из базы. В связи с особенностью, описанной выше, необходимо проверить, нет ли в удаляемых доках других собственников.

Написал вот такой запрос:

        //список исключаемых доков
        Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                |    ОстаткиТоваров1.Заказ КАК ЗаказНеУдалять,
                |    ОстаткиТоваров2.Заказ.Собственник КАК ЧужойСобственник,
                |    ОстаткиТоваров2.Заказ КАК ЧужойЗаказ,
                |    ОстаткиТоваров1.Регистратор.Владелец КАК Документ,
                |    ОстаткиТоваров2.Регистратор КАК ЧужаяОперация
                |ИЗ
                |    РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , Регистратор, , Заказ.Собственник = &Собственник) КАК ОстаткиТоваров1
                |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , Регистратор, , ) КАК ОстаткиТоваров2
                |        ПО (ОстаткиТоваров1.Регистратор.Владелец = ОстаткиТоваров2.Регистратор.Владелец
                |            И (НЕ ОстаткиТоваров1.Заказ.Собственник = ОстаткиТоваров2.Заказ.Собственник))

                |УПОРЯДОЧИТЬ ПО
                |    Документ";
        Состояние("Формируется список документов-исключений...");        
        ТабИсклДоков = Запрос.Выполнить().Выгрузить();
        Если ТабИсклДоков.Количество() Тогда
            ТабИскл = ТабИсклДоков;
            Сообщить("Обнаружены документы, содержащие несколько собственников!" + Символы.ПС + "Удаление выбранного собственника невозможно!");
            ЭлементыФормы.ТабИсклДоков.СоздатьКолонки();
            МожноУдалитьСобственника = Ложь;
        Иначе
            МожноУдалитьСобственника = Истина;
        КонецЕсли

Очень долго работает, помогите оптимизировать алгоритм
1 vicof
 
30.12.14
10:40
Сверни базу. Загрузи остатки в новую, потом удаляй, сколько влезет.
2 Black Dragon
 
30.12.14
10:47
свертка пока не нужна
3 Black Dragon
 
30.12.14
10:48
суть ВТ Обороты в рамках данной задачи будет заменять ОстаткиИОбороты?
4 ktvladimir
 
30.12.14
10:55
Регистратор и заказ составные то улучшит ситуацию приведение к типу
5 Black Dragon
 
30.12.14
10:56
тормозит именно из-за ОстаткиИОбороты
6 polosov
 
30.12.14
10:58
Я бы сделал что-нибудь такое.
Выбрать всех удаляемых собственников с добавлением поля Признак1 = "Х".
ВЫбрать всех не удаляемых собственников с добавлением поля Признак1 = "У".
Соединил
Выбрал все ТЧ в разрезе документов.
Левое соединение по собственнику.
Если в группировке есть и Х и У - этот док не удаляем.
Если только Х - удаляем.

Как-то так.
7 Black Dragon
 
30.12.14
10:59
(4) Регистратор.Владелец имеет очень много типов, практически невозможно
8 Black Dragon
 
30.12.14
11:00
(6) ТЧ доков формируются динамически из регистра, собственно
9 Black Dragon
 
30.12.14
11:00
по сути, в моем запросе это и реализовано
10 Black Dragon
 
30.12.14
11:05
сейчас сравниваю результат между запросами:

        Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                       |    ОстаткиОбороты1.Регистратор.Владелец КАК Документ,
                       |    ОстаткиОбороты1.Заказ КАК ЗаказНеУдалять,
                       |    ОстаткиОбороты1.Заказ.Собственник КАК Собственник,
                       |    ОстаткиОбороты2.Заказ.Собственник КАК ЧужойСобственник
                       |ИЗ
                       |    РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , Регистратор, , Заказ.Собственник = &Собственник) КАК ОстаткиОбороты1
                       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.ОстаткиИОбороты(, , Регистратор, , ) КАК ОстаткиОбороты2
                       |        ПО ОстаткиОбороты1.Регистратор.Владелец = ОстаткиОбороты2.Регистратор.Владелец
                       |            И ОстаткиОбороты1.Заказ.Собственник <> ОстаткиОбороты2.Заказ.Собственник";


        Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                       |    Обороты1.Регистратор.Владелец КАК Документ,
                       |    Обороты1.Заказ КАК ЗаказНеУдалять,
                       |    Обороты1.Заказ.Собственник КАК Собственник,
                       |    Обороты2.Заказ.Собственник КАК ЧужойСобственник
                       |ИЗ
                       |    РегистрНакопления.ОстаткиТоваров.Обороты(, , Регистратор, , Заказ.Собственник = &Собственник) КАК Обороты1
                       |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Обороты(, , Регистратор, , ) КАК Обороты2
                       |        ПО Обороты1.Регистратор.Владелец = Обороты2.Регистратор.Владелец
                       |            И Обороты1.Заказ.Собственник <> Обороты2.Заказ.Собственник";
11 polosov
 
30.12.14
11:16
(8) Ну дык предварительно выбери все документы по удаляемым собственникам.
Не тереби РН.
12 Black Dragon
 
30.12.14
11:16
собственно, вот и результат, выходные данные идентичны, время выполнения в неск раз дольше у ОстаткиИОбороты

Всем спасибо за участие и разъяснения
13 Black Dragon
 
30.12.14
11:32
(11) не все документы имеют реквизит Собственник, а только по регистру имеют связь через Заказ...вот так все печально(