Имя: Пароль:
1C
 
Необходимо оптимизировать запрос.
0 helpmepls1
 
14.07.25
12:43
Необходимо оптимизировать запрос.

Дано:
    В регистре АмортизацияОС 2 измерения:
    ОсновноеСредство
    Организация

    В регистре СтоимостьОбъектовОС 3 измерения:
    ОсновноеСредство
    Организация
    ИнвентарныйНомер

    В регистре Штрихкоды сотни миллионов записей и 1 измерение:
    ИнвентарныйНомер

    Реквизит "КапитальноеВложение" есть у 2 типов регистраторов из 20 возможных


Неоптимальный запрос:

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

СГРУППИРОВАТЬ ПО
	АмортизацияОССрезПоследних.ОсновноеСредство,
	АмортизацияОССрезПоследних.Организация
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ВТ_Сгруппированные.ОсновноеСредство КАК ОсновноеСредство,
	ВТ_Сгруппированные.Организация КАК Организация,
	ВТ_Сгруппированные.Стоимость КАК Стоимость,
	ВТ_Сгруппированные.Штрихкод КАК Штрихкод
ИЗ
	ВТ_Сгруппированные КАК ВТ_Сгруппированные
ГДЕ
	ВТ_Сгруппированные.Стоимость > 1000000
1 mikecool
 
14.07.25
12:32
(0) оптимизируй!
2 maxab72
 
14.07.25
12:39
(0) Отбери сперва в пакетном запросе данные без регистра Штрихкоды, а потом, во втором запросе пакета этот короткий результат соедини с регистром штрихкодов. Можно даже сперва сделать отбор по регистру штрихкодов если есть все нужные индексы.
3 Волшебник
 
14.07.25
12:45
Штрихкод на здании — это пурпурно!
4 Fish
 
гуру
14.07.25
12:46
(3) А что не так? Есть даже здание-штрихкод
5 Волшебник
 
14.07.25
12:50
(4) Не пурпурно. Слишком красно
6 maxab72
 
14.07.25
12:51
(4) Петербург? Дом сзади похож на 504 серию.
7 timurhv
 
14.07.25
12:52
Вот тут оптимизируйте:

РегистрСведений.АмортизацияОС.СрезПоследних(&Дата, ) КАК АмортизацияОССрезПоследних
...
И АмортизацияОССрезПоследних.Регистратор.КапитальноеВложение = &КапитальноеВложение

Реквизит "КапитальноеВложение" есть у 2 типов регистраторов из 20 возможных

Осталось понять, как выводить данные после свертки базы.
8 Fish
 
гуру
14.07.25
12:52
(6) Да.
9 ptiz
 
14.07.25
12:54
(0) Сколько объектов в регистрах АмортизацияОС и СтоимостьОбъектовОС? Сколько объектов стоимостью > 1000000 ?
10 ptiz
 
14.07.25
12:54
(7) Данные по ОС не сворачивают.
11 timurhv
 
14.07.25
12:55
(10) ну регистратор будет корректировка записей или первичка остается?
12 ldo6
 
14.07.25
12:56
Косяков в запросе полно. Есть же на ИТС стандарт для запросов и причины неоптимальной работы запросов.
13 ptiz
 
14.07.25
13:05
(11) Обычно считается, что ОС не так много, и дешевле оставить все документы по ним, чем обрести новый геморрой.
14 KJlag
 
14.07.25
13:13
мне больше нравится, что мы сначала соединяем таблицу1 с сотнями миллионов записей из таблицы2, а потом через "ГДЕ" ищем "ПОДОБНО "%" + &Местонахождение + "%""
15 helpmepls1
 
14.07.25
13:30
пока такое придумал

ВЫБРАТЬ
    ОсновныеСредства.Местонахождение КАК Местонахождение
ПОМЕСТИТЬ ВТ_Местонахождение
ИЗ
    Справочник.ОсновныеСредства КАК ОсновныеСредства
ГДЕ
    ОсновныеСредства.Местонахождение ПОДОБНО "%" + &Местонахождение + "%"

ИНДЕКСИРОВАТЬ ПО
    Местонахождение
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    АмортизацияОССрезПоследних.ОсновноеСредство КАК ОсновноеСредство,
    АмортизацияОССрезПоследних.Организация КАК Организация
ПОМЕСТИТЬ ВТ_АмортизацияОС
ИЗ
    РегистрСведений.АмортизацияОС.СрезПоследних(
            &Дата,
            КапитальноеВложение = &КапитальноеВложени
                И ОсновноеСредство.АмортизационнаяГруппа = &АмортизационнаяГруппа) КАК АмортизацияОССрезПоследних

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    АмортизацияОССрезПоследних.ОсновноеСредство,
    АмортизацияОССрезПоследних.Организация
ИЗ
    РегистрСведений.АмортизацияОС.СрезПоследних(
            &Дата,
            КапитальноеВложение = &КапитальноеВложение
                И ОсновноеСредство.Местонахождение В
                    (ВЫБРАТЬ
                        ВТ_Местонахождение.Местонахождение КАК Местонахождение
                    ИЗ
                        ВТ_Местонахождение КАК ВТ_Местонахождение)) КАК АмортизацияОССрезПоследних
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СтоимостьОбъектовОСОстатки.ОсновноеСредство КАК ОсновноеСредство,
    СтоимостьОбъектовОСОстатки.Организация КАК Организация,
    СтоимостьОбъектовОСОстатки.ИнвентарныйНомер КАК ИнвентарныйНомер,
    СтоимостьОбъектовОСОстатки.СтоимостьОстаток КАК СтоимостьОстаток
ПОМЕСТИТЬ ВТ_СтоимостьОстатки
ИЗ
    РегистрНакопления.СтоимостьОбъектовОС.Остатки(
            &Дата,
            (ОсновноеСредство, Организация) В
                (ВЫБРАТЬ
                    ВТ_АмортизацияОС.ОсновноеСредство КАК ОсновноеСредство,
                    ВТ_АмортизацияОС.Организация КАК Организация
                ИЗ
                    ВТ_АмортизацияОС КАК ВТ_АмортизацияОС)) КАК СтоимостьОбъектовОСОстатки
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_СтоимостьОстатки.ОсновноеСредство КАК ОсновноеСредство,
    ВТ_СтоимостьОстатки.Организация КАК Организация,
    ВТ_СтоимостьОстатки.ИнвентарныйНомер КАК ИнвентарныйНомер,
    СУММА(ВТ_СтоимостьОстатки.СтоимостьОстаток) КАК СтоимостьОстаток
ПОМЕСТИТЬ ВТ_Сгруппированные
ИЗ
    ВТ_АмортизацияОС КАК ВТ_АмортизацияОС
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СтоимостьОстатки КАК ВТ_СтоимостьОстатки
        ПО ВТ_АмортизацияОС.ОсновноеСредство = ВТ_СтоимостьОстатки.ОсновноеСредство
            И ВТ_АмортизацияОС.Организация = ВТ_СтоимостьОстатки.Организация
ГДЕ
    ВТ_СтоимостьОстатки.СтоимостьОстаток > 10000

СГРУППИРОВАТЬ ПО
    ВТ_СтоимостьОстатки.ОсновноеСредство,
    ВТ_СтоимостьОстатки.Организация,
    ВТ_СтоимостьОстатки.ИнвентарныйНомер
;

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

СГРУППИРОВАТЬ ПО
    ВТ_Сгруппированные.ОсновноеСредство,
    ВТ_Сгруппированные.Организация,
    ВТ_Сгруппированные.СтоимостьОстаток
16 maxab72
 
14.07.25
13:33
(15) Тебя убить мало. Зачем отбирать из справочника Основные средства местонахождения по ПОДОБНО, чтоб потом отбирать опять из того-же справочника по местонахождению? Отбирай сразу ссылку.
17 timurhv
 
14.07.25
14:00
(15) Нужно еще учесть момент, что ОС может быть принято к учету, а амортизацию еще не начисляли. В данном случае у вас отчет ничего не выведет.