1с как я оптимизировал запрос в подборе РМК

Сразу  же после внедрения конфигурации Розница 2 на предприятии, первым делом был разработан новый подбор. Имеющийся в типовых конфах подбор по характеристикам просто ужасно неудобный, и я думаю  разработчикам типовых стоит задуматься над его юзабилити. Особо тяжело переносят  те пользователи которые, перешли на управляемые формы с конфигураций на обычных формах и толстым клиентом УТ10.3 и ТИС9 (1с 7.7). Стоит отметить, что в этих конфах подбор реализован, ну очень удобно.

В общем я принял решение сделать свой подбор с нуля с использованием Таблицы значений и  поля поиска. Все достаточно примитивно и в разы удобнее родного подбора. Удобней было бы использовать динамический список, а не таблицу значений, но он имеет значительный минус, после набора текста в строке поиска не происходит перехода на выбранные строки для выбора значения.  Собственно  к сути статьи. Сказано — сделано, накидал я простой подбор, который выводит товары по запросу. Запрос не совсем простой, так как тянет данные из нескольких виртуальных таблиц.  Изначально звпрос имел вид.

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

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

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

СГРУППИРОВАТЬ ПО
ТоварыНаСкладахОстатки.Номенклатура,
ТоварыНаСкладахОстатки.КоличествоОстаток
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ОстатокАптеки.Номенклатура КАК Номенклатура,
ОстатокАптеки.Серия КАК Серия,
ОстатокАптеки.Цена КАК Цена,
ОстатокАптеки.Остаток КАК Остаток,
ОстаткиСклада.ОстатокСклада КАК ОстатокСклада,
ОстаткиСклада.ЦенаСклада КАК ЦенаСклада
ИЗ
ОстатокАптеки КАК ОстатокАптеки
ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиСклада КАК ОстаткиСклада
ПО ОстатокАптеки.Номенклатура = ОстаткиСклада.Номен

УПОРЯДОЧИТЬ ПО
ОстатокАптеки.Номенклатура.Наименование

Вскоре пользователи стали жаловаться на долгое открытие подбора, примерно 3 сек, уходило на его открытие. Произведя замер производительности, выяснилось. что слабым местом является сам запрос, а не его отображение на форме. Почитав статьи по теме, про оптимизацию запросов в 1с, я нашел в своем изначальном запросе несколько критичных ошибок.

Первая ошибка связывание между собой 2-х виртуальных таблиц ЦеныНоменклатурыСрезПоследних  и ТоварыНаСкладахОстатки.  В официальной доке сказано, что так делать не есть гуд.

Вторая ошибка использование условия ГДЕ для виртуальной таблицы. В результате исходный запрос был переписан. В следующий вид.

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

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

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

СГРУППИРОВАТЬ ПО
Номен.Ссылка,
ОстатокРозницы.Характеристика,
ЦеныРозницы.Цена,
ОстатокРозницы.КоличествоОстаток,
ТоварыНаСкладахОстатки.КоличествоОстаток

УПОРЯДОЧИТЬ ПО
Номен.Наименование

Теперь запрос стал выполняться в среднем за 0.2-.3 секунды.  Таким образом удалось выиграть  более 2-х секунд. Так что друзья, составляем запросы на языке запросов 1с всегда придерживайтесь правил которые рекомендует сама компания.

Вам также может понравиться

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Яндекс.Метрика