Имя: Пароль:
1C
1С v8
Задваиваются проводки при выборе из регистра бухгалтерии ДвиженияССубконто
0 wisekat
 
28.01.14
11:18
Есть такой запрос в СКД:

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

Обнаружилось, что некоторые проводки в нашем отчёте задваиваются.

Что это может быть?
1 zak555
 
28.01.14
11:21
параметры виртуальной таблицы не любишь ?
2 wisekat
 
28.01.14
11:43
(1) Это по поводу фильтров на счета?
3 wisekat
 
28.01.14
11:45
(1) Вроде там не работали правильно отборы. У нас ВыбСчетаЗатрат и ВыбСчетаИзноса - это списки счетов. Но на самом деле они не списки, а ТаблицыЗначений - иначе 1С не отбирает правильно по списку оператором "В". Формируются так:

    СпСчетаИзноса = Новый ТаблицаЗначений;
    СпСчетаИзноса.Колонки.Добавить("СчетИзноса");
    НоваяСтрока = СпСчетаИзноса.Добавить();
    НоваяСтрока.СчетИзноса = ПланыСчетов.Хозрасчетный.НайтиПоКоду("131");
    НоваяСтрока = СпСчетаИзноса.Добавить();
    НоваяСтрока.СчетИзноса = ПланыСчетов.Хозрасчетный.НайтиПоКоду("1321");
    
    СпСчетаЗатрат = Новый ТаблицаЗначений;
    СпСчетаЗатрат.Колонки.Добавить("СчетЗатрат");
    НоваяСтрока = СпСчетаЗатрат.Добавить();
    НоваяСтрока.СчетЗатрат = ПланыСчетов.Хозрасчетный.НайтиПоКоду("231");
    НоваяСтрока = СпСчетаЗатрат.Добавить();
    НоваяСтрока.СчетЗатрат = ПланыСчетов.Хозрасчетный.НайтиПоКоду("232");
    НоваяСтрока = СпСчетаЗатрат.Добавить();
    НоваяСтрока.СчетЗатрат = ПланыСчетов.Хозрасчетный.НайтиПоКоду("233");
    НоваяСтрока = СпСчетаЗатрат.Добавить();
    НоваяСтрока.СчетЗатрат = ПланыСчетов.Хозрасчетный.НайтиПоКоду("91");
    НоваяСтрока = СпСчетаЗатрат.Добавить();
    НоваяСтрока.СчетЗатрат = ПланыСчетов.Хозрасчетный.НайтиПоКоду("92");
    НоваяСтрока = СпСчетаЗатрат.Добавить();
    НоваяСтрока.СчетЗатрат = ПланыСчетов.Хозрасчетный.НайтиПоКоду("949");
4 Maxus43
 
28.01.14
11:45
(2) да.. Ну и отгадай что будет если в документе 2 строки например.
По простому - вытащи ещё регистратор, и погляди в док у которого "задвоено"
5 Maxus43
 
28.01.14
11:46
>>иначе 1С не отбирает правильно по списку оператором "В"
врёшь же, всё 1с нормально отбирает. Массив счетов передавай в запрос в параметр
6 wisekat
 
28.01.14
11:46
т.е. надо отобрать 12 корреспонденций 131-231, 131-232, ..., 1321-949

Я бы и сам рад использовать параметры вирт. таблицы если бы оно сработало как надо - и должно было быть гораздо быстрее как я понимаю.
7 wisekat
 
28.01.14
11:47
(5) Сейчас проверю через массив, но помню что напрямую в запросе массив не работал.
8 wisekat
 
28.01.14
11:48
Насчёт задвоения сам разобрался - в регистре было две записи по одному ОС. Протупил, думал, что там только по одной записи к каждому ОС.

Запрос вот такой должен был быть:

ВЫБРАТЬ
    ХозрасчетныйДвиженияССубконто.Период,
    ХозрасчетныйДвиженияССубконто.СчетДт,
    ХозрасчетныйДвиженияССубконто.СчетКт,
    ХозрасчетныйДвиженияССубконто.СубконтоКт1,
    ХозрасчетныйДвиженияССубконто.СубконтоКт1.Код,
    ХозрасчетныйДвиженияССубконто.Организация,
    ХозрасчетныйДвиженияССубконто.Сумма,
    СчетаБухгалтерскогоУчетаОССрезПоследних.СчетУчета
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&ДатаНач, &ДатаКон, , , ) КАК ХозрасчетныйДвиженияССубконто
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СчетаБухгалтерскогоУчетаОС.СрезПоследних КАК СчетаБухгалтерскогоУчетаОССрезПоследних
        ПО ХозрасчетныйДвиженияССубконто.СубконтоКт1 = СчетаБухгалтерскогоУчетаОССрезПоследних.ОсновноеСредство
            И ХозрасчетныйДвиженияССубконто.Организация = СчетаБухгалтерскогоУчетаОССрезПоследних.Организация
ГДЕ
    ХозрасчетныйДвиженияССубконто.СчетДт В(&ВыбСчетаЗатрат)
    И ХозрасчетныйДвиженияССубконто.СчетКт В(&ВыбСчетаИзноса)
    И ХозрасчетныйДвиженияССубконто.Организация = &ВыбОрганизация
    И ХозрасчетныйДвиженияССубконто.Активность
9 wisekat
 
28.01.14
11:49
(8) т.е. дополнительно по Организации в регистре надо было фильтровать
10 wisekat
 
28.01.14
14:35
(5) Попробовал. Массивы в параметрах виртуальной таблицы работают. Причём работают раз в 100 быстрее наверное :).

Запрос теперь выглядит так:

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

Я так понимаю, по счетам построены внутренние индексы, которые позволяют платформе оптимизировать запрос. А вот перенос Организации в параметры виртуальной таблицы ускорения не даёт - или это ускорение уже просто незаметно. Насколько я знаю, для измерения регистра надо свойство Индексировать устанавливать для построения соответствующего индекса, которые платформа может использовать?
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший