Имя: Пароль:
1C
1С v8
Производительность, регистр накопления
0 Mkamha
 
14.04.18
21:00
Есть большая система со значительными историческими данными. Есть устоявшийся бизнес процесс, связанный с указанием (отметкой), в документах реализации, статуса, проставляемым бухгалтером. Это поле, реквизит этого документа. Менять статус у этого документа могут несколько раз, например статус1, статус2, статус3 и т.д. Смена статуса, сопровождается записью документа. Сам статус выводится в отчете (взаиморасчеты), с группировкой до реквизита документа.

Что необходимо получить в итоге: понимать в какой момент произошла смена статуса, какой статус актуальный на текущий момент времени и избавится от необходимости перепроведения документа. Задачу решил через регистр сведений - работает.

Не могу решить с отчетом: когда соединил регистр накопления и новый регистр сведений по регистратору(чтобы вытащить актуальный статус каждого документа), запрос (через построитель) отрабатывает около 30 минут, в отдельных случаях вываливается с ошибкой нехватки памяти (SQL, 200 gb вся база, таблица взаиморасчеты 8 гб).
На СКД? но не хочется, т.к. придется делать отчет + пользователей обучать, это бухги, они тупые.

Какие пути решения? что можно предпринять? Кто сталкивался с подобной задачей, как ее решили?
1 Волшебник
 
14.04.18
21:03
запрос только не показывай
2 Mkamha
 
14.04.18
21:05
(1) запрос не очень большой: Регистр накопления, регистр документов, левое соединение по документу.
3 Волшебник
 
14.04.18
21:05
(2) держи его в тайне
4 Mkamha
 
14.04.18
21:10
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    РасчетыСКонтрагентамиОстаткиИОбороты.Организация КАК Организация,
    РасчетыСКонтрагентамиОстаткиИОбороты.Контрагент КАК Контрагент,
    РасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    РасчетыСКонтрагентамиОстаткиИОбороты.Сделка КАК Сделка,
    РасчетыСКонтрагентамиОстаткиИОбороты.Регистратор КАК Регистратор,
    РасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Период,
    РасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачальныйОстаток,
    РасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
    РасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
    РасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход
ПОМЕСТИТЬ ВТ_расчеты
ИЗ
    РегистрНакопления.РасчетыСКонтрагентами.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор {(&Периодичность)}, , {(ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка, (Контрагент).* КАК Контрагент, (Организация).* КАК Организация, (ДоговорКонтрагента.ВалютаВзаиморасчетов).* КАК ВалютаВзаиморасчетов}) КАК РасчетыСКонтрагентамиОстаткиИОбороты

ИНДЕКСИРОВАТЬ ПО
    Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    Проекты_и_документы.Дата КАК Дата,
    Проекты_и_документы.нстр КАК нстр,
    Проекты_и_документы.Документ КАК Документ,
    Проекты_и_документы.Контрагент КАК Контрагент,
    Проекты_и_документы.Проект КАК Проект,
    Проекты_и_документы.Пользователь КАК Пользователь
ПОМЕСТИТЬ ВТ_Проекты
ИЗ
    РегистрСведений.Проекты_и_документы КАК Проекты_и_документы

ИНДЕКСИРОВАТЬ ПО
    Документ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВТ_расчеты.Организация КАК Организация,
    ВТ_расчеты.Контрагент КАК Контрагент,
    ВТ_расчеты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВТ_расчеты.Сделка КАК Сделка,
    ВТ_расчеты.Регистратор КАК Регистратор,
    ВТ_расчеты.Период КАК Период,
    ВТ_расчеты.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачальныйОстаток,
    ВТ_расчеты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
    ВТ_расчеты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
    ВТ_расчеты.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход,
    ВТ_Проекты.Проект КАК Проект
ПОМЕСТИТЬ ВТ_результат
ИЗ
    ВТ_расчеты КАК ВТ_расчеты
        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Проекты КАК ВТ_Проекты
        ПО ВТ_расчеты.Регистратор = ВТ_Проекты.Документ
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_результат.Организация КАК Организация,
    ВТ_результат.Контрагент КАК Контрагент,
    ВТ_результат.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВТ_результат.Сделка КАК Сделка,
    ВТ_результат.Регистратор КАК Регистратор,
    ВТ_результат.Период КАК Период,
    ВТ_результат.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачальныйОстаток,
    ВТ_результат.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
    ВТ_результат.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
    ВТ_результат.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход,
    ВТ_результат.Проект КАК Проект
{ВЫБРАТЬ
    Организация.*,
    Контрагент.*,
    ДоговорКонтрагента.*,
    Сделка.*,
    Регистратор.*,
    Период,
    СуммаВзаиморасчетовНачальныйОстаток,
    СуммаВзаиморасчетовКонечныйОстаток,
    СуммаВзаиморасчетовПриход,
    СуммаВзаиморасчетовРасход,
    Проект.*}
ИЗ
    ВТ_результат КАК ВТ_результат
{ГДЕ
    ВТ_результат.Организация.*,
    ВТ_результат.Контрагент.*,
    ВТ_результат.ДоговорКонтрагента.*,
    ВТ_результат.Сделка.*,
    ВТ_результат.Регистратор.*,
    ВТ_результат.Период,
    ВТ_результат.СуммаВзаиморасчетовНачальныйОстаток,
    ВТ_результат.СуммаВзаиморасчетовКонечныйОстаток,
    ВТ_результат.СуммаВзаиморасчетовПриход,
    ВТ_результат.СуммаВзаиморасчетовРасход,
    ВТ_результат.Проект.*}
{ИТОГИ ПО
    Организация.*,
    Контрагент.*,
    ДоговорКонтрагента.*,
    Сделка.*,
    Регистратор.*,
    Период,
    СуммаВзаиморасчетовНачальныйОстаток,
    СуммаВзаиморасчетовКонечныйОстаток,
    СуммаВзаиморасчетовПриход,
    СуммаВзаиморасчетовРасход,
    Проект.*}
5 Cyberhawk
 
14.04.18
21:14
Затраты на части выполнения запроса в СУБД погляди и все станет понятно
6 Mkamha
 
14.04.18
21:20
вот этот вариант отчета, напрочь вешает базу
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    РасчетыСКонтрагентамиОстаткиИОбороты.Организация КАК Организация,
    РасчетыСКонтрагентамиОстаткиИОбороты.Контрагент КАК Контрагент,
    РасчетыСКонтрагентамиОстаткиИОбороты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    РасчетыСКонтрагентамиОстаткиИОбороты.Сделка КАК Сделка,
    РасчетыСКонтрагентамиОстаткиИОбороты.Регистратор КАК Регистратор,
    РасчетыСКонтрагентамиОстаткиИОбороты.Период КАК Период,
    РасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачальныйОстаток,
    РасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
    РасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
    РасчетыСКонтрагентамиОстаткиИОбороты.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход,
    Проекты_и_документы.Проект КАК Проект
ПОМЕСТИТЬ ВТ_расчеты
ИЗ
    РегистрНакопления.РасчетыСКонтрагентами.ОстаткиИОбороты(&ДатаНач, &ДатаКон, Регистратор {(&Периодичность)}, , {(ДоговорКонтрагента).* КАК ДоговорКонтрагента, (Сделка).* КАК Сделка, (Контрагент).* КАК Контрагент, (Организация).* КАК Организация, (ДоговорКонтрагента.ВалютаВзаиморасчетов).* КАК ВалютаВзаиморасчетов}) КАК РасчетыСКонтрагентамиОстаткиИОбороты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Проекты_и_документы КАК Проекты_и_документы
        ПО РасчетыСКонтрагентамиОстаткиИОбороты.Регистратор = Проекты_и_документы.Документ

ИНДЕКСИРОВАТЬ ПО
    Регистратор
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    ВТ_расчеты.Организация КАК Организация,
    ВТ_расчеты.Контрагент КАК Контрагент,
    ВТ_расчеты.ДоговорКонтрагента КАК ДоговорКонтрагента,
    ВТ_расчеты.Сделка КАК Сделка,
    ВТ_расчеты.Регистратор КАК Регистратор,
    ВТ_расчеты.Период КАК Период,
    ВТ_расчеты.СуммаВзаиморасчетовНачальныйОстаток КАК СуммаВзаиморасчетовНачальныйОстаток,
    ВТ_расчеты.СуммаВзаиморасчетовКонечныйОстаток КАК СуммаВзаиморасчетовКонечныйОстаток,
    ВТ_расчеты.СуммаВзаиморасчетовПриход КАК СуммаВзаиморасчетовПриход,
    ВТ_расчеты.СуммаВзаиморасчетовРасход КАК СуммаВзаиморасчетовРасход,
    ВТ_расчеты.Проект КАК Проект
{ВЫБРАТЬ
    Организация.*,
    Контрагент.*,
    ДоговорКонтрагента.*,
    Сделка.*,
    Регистратор.*,
    Период,
    СуммаВзаиморасчетовНачальныйОстаток,
    СуммаВзаиморасчетовКонечныйОстаток,
    СуммаВзаиморасчетовПриход,
    СуммаВзаиморасчетовРасход,
    Проект.*}
ИЗ
    ВТ_расчеты КАК ВТ_расчеты
{ГДЕ
    ВТ_расчеты.Организация.*,
    ВТ_расчеты.Контрагент.*,
    ВТ_расчеты.ДоговорКонтрагента.*,
    ВТ_расчеты.Сделка.*,
    ВТ_расчеты.Регистратор.*,
    ВТ_расчеты.Период,
    ВТ_расчеты.СуммаВзаиморасчетовНачальныйОстаток,
    ВТ_расчеты.СуммаВзаиморасчетовКонечныйОстаток,
    ВТ_расчеты.СуммаВзаиморасчетовПриход,
    ВТ_расчеты.СуммаВзаиморасчетовРасход,
    ВТ_расчеты.Проект.*}
ИТОГИ
    СУММА(СуммаВзаиморасчетовНачальныйОстаток),
    СУММА(СуммаВзаиморасчетовКонечныйОстаток),
    СУММА(СуммаВзаиморасчетовПриход),
    СУММА(СуммаВзаиморасчетовРасход)
ПО
    ОБЩИЕ,
    Проект,
    Организация,
    Период,
    Сделка,
    Регистратор,
    Контрагент,
    ДоговорКонтрагента
{ИТОГИ ПО
    Организация.*,
    Контрагент.*,
    ДоговорКонтрагента.*,
    Сделка.*,
    Регистратор.*,
    Период,
    СуммаВзаиморасчетовНачальныйОстаток,
    СуммаВзаиморасчетовКонечныйОстаток,
    СуммаВзаиморасчетовПриход,
    СуммаВзаиморасчетовРасход,
    Проект.*}
7 Йохохо
 
14.04.18
21:23
(6) из наложенных отборов только валюта взаиморасчетов?
8 Mkamha
 
14.04.18
21:26
(6) отборов нет.
Хочу получить за месяц, в группировке по контрагенту.
9 d4rkmesa
 
14.04.18
22:07
(0) В консоли запросов так же все медленно? Вытащите реальный запрос и поэкспериментируйте. Если нужен последний статус, почему не СрезПоследних или его подобие через Максимум периодов? Подозреваю, там на 1 регистратор хренова куча изменений. Измерения регистра сведений проиндексированы, какие надо?
10 dem0sphen
 
14.04.18
23:43
(8) Вижу вариант решения - через иной запрос отчет на СКД:

Поскольку тип регистратора в РН РасчетыСКонтрагентами имеет составной тип, то обязательно использовать ВЫРАЗИТЬ для нужного в задаче типа регистратора (док Реализация).

Возможно, потребителю информации (отчета) нужно видеть лишь обороты, поэтому попробуй согласовать и брать только обороты без остатков тем более что в этом РН нет остатка по регистратору типа Реализация. Задачу (получить остатки и обороты по реквизиту регистратора) нужно решать иначе - объединением таблиц остатков и оборотов.

К твоей задаче - делай так:
Виртуальную таблицу РН (с выразить) соединяй левым соединением со срезом последних своего регистра сведений (в котором сидит история изменения реквизита Реализации).
Без лишних пакетов сразу.

Если нужно видеть историю изменения (последнего изменения или всех изменений по регистру сведений, то сначала к таблице среза последних соедини по реализации внутренним соединением физическую таблицу РС (получишь и актуальное значение - из среза последних, и вее имевшиеся по датам изменения) и далее левое соединение вт РН с полученной таблицей значений реквизита.
11 Мимохожий Однако
 
15.04.18
09:16
(0) Используй регистр сведений для документа, для исключения записи документа. Например, Дополнительные сведения или категории.
12 ssh2006
 
15.04.18
09:56
(0) сделай пересчет итогов, переиндексацию, посмотри как после
13 hhhh
 
15.04.18
10:23
(8) забыл проиндексировать Проекты_и_документы  по полю Документ?
14 triviumfan
 
15.04.18
11:11
Временные таблицы тут лишнее, как и индексация =)
15 Mkamha
 
15.04.18
12:13
(10), спасибо, идею  понял. Проекты соединить с таблицей оборотов, + дополнительно соединить с таблицей остатков. Попробую это сделать на построителе. На СКД геморно, в плане того, что новый интерфейс, пользователям объяснять, обучать, это существенный минус. Наверное даже проще оставить бизнес процесс "как есть", с перепроведением старых документов.
(12) переиндексация такой базы занимает много времени. Таблицы всех баз проверяет отдельный базист по SQL(который хорошо знает профайлер и пр, и он естественно в отпуске в этот сложный момент)
(13), делал разные варианты и с индексацией и без, регистр сведений делал и периодический и нет (чтобы показывал) только последнее состояние, без истории. Результат один - разрастание базы tempdb, отключение.
16 d4rkmesa
 
15.04.18
20:18
(15)
"разрастание базы tempdb, отключение."
Это все избыточные временные таблицы.
17 Mkamha
 
26.04.18
00:11
(16) переделал. Отдельно запрос по остаткам, соединил с оборотами и обороты с доп.таблицей по проектам.
Все работает, отчет - летает!
18 triviumfan
 
26.04.18
00:13
(17) главное на луну не улететь)