До одного сообщения на форуме не задумывался даже о том, что поиск по марке может быть долгим, так как под рукой не было баз с большим количеством акцизных марок. Отладчик показывал упорно, что большая часть времени тратится на заполнение остатка в РМК при подборе по марке. Поэтому решил наполнить базу, сгенерировав некоторое количество марок, добавив их в справочник "Штрихкоды упаковок и товаров", а также статус "В наличии" в регистр сведений "Акцизные марки ЕГАИС".
Итак, для целей эксперимента было сгенерировано 1 000 000 кодов акцизных марок ЕГАИС нового формата. База используется файловая, компьютер вполне посредственный, файл базы располагается на HDD.
Посмотрим, на что 1С тратит больше всего времени при сканировании акцизной марки ЕГАИС в РМК:
Это результат запроса, который возвращает нам "специфику" алкогольной продукции: код марки, статус, какой организации принадлежит марка и т.д.
Собственно, сам текст запроса располагается в общем модуле "ШтрихкодированиеЕГАИС" в функции "ТекстЗапросаПолученияСпецификиДанныхШтрихкодов":
"ВЫБРАТЬ
| &ОрганизацияЕГАИС КАК ОрганизацияЕГАИС,
| ШтрихкодыУпаковокТоваров.Ссылка КАК АкцизнаяМарка,
| ШтрихкодыУпаковокТоваров.ЗначениеШтрихкода КАК Штрихкод
|ПОМЕСТИТЬ ШтрихкодыУпаковок
|ИЗ
| Справочник.ШтрихкодыУпаковокТоваров КАК ШтрихкодыУпаковокТоваров
|ГДЕ
| ШтрихкодыУпаковокТоваров.Ссылка В (&ШтрихкодыУпаковок)
|ИНДЕКСИРОВАТЬ ПО
| АкцизнаяМарка,
| ОрганизацияЕГАИС
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ШтрихкодыУпаковок.АкцизнаяМарка КАК АкцизнаяМарка,
| ШтрихкодыУпаковок.Штрихкод КАК Штрихкод,
| ШтрихкодыУпаковок.ОрганизацияЕГАИС КАК ОрганизацияЕГАИС,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.Статус, ЗНАЧЕНИЕ(Перечисление.СтатусыАкцизныхМарок.ПустаяСсылка)) КАК Статус,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.Справка2, ЗНАЧЕНИЕ(Справочник.Справки2ЕГАИС.ПустаяСсылка)) КАК Справка2,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция, ЗНАЧЕНИЕ(Справочник.КлассификаторАлкогольнойПродукцииЕГАИС.ПустаяСсылка)) КАК АлкогольнаяПродукция,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция.Код, """") КАК КодАлкогольнойПродукции,
| 1 КАК Приоритет
|ИЗ
| ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
| ПО ШтрихкодыУпаковок.АкцизнаяМарка = АкцизныеМаркиЕГАИС.АкцизнаяМарка
| И ШтрихкодыУпаковок.ОрганизацияЕГАИС = АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ШтрихкодыУпаковок.АкцизнаяМарка,
| ШтрихкодыУпаковок.Штрихкод,
| ШтрихкодыУпаковок.ОрганизацияЕГАИС,
| ЗНАЧЕНИЕ(Перечисление.СтатусыАкцизныхМарок.ПустаяСсылка),
| ЗНАЧЕНИЕ(Справочник.Справки2ЕГАИС.ПустаяСсылка),
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция, ЗНАЧЕНИЕ(Справочник.КлассификаторАлкогольнойПродукцииЕГАИС.ПустаяСсылка)),
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция.Код, """"),
| 2
|ИЗ
| ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
| ПО ШтрихкодыУпаковок.АкцизнаяМарка = АкцизныеМаркиЕГАИС.АкцизнаяМарка
| И ШтрихкодыУпаковок.ОрганизацияЕГАИС <> АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
|"
Сам запрос ничего сверхъестественного не представляет. Однако, если посмотреть внимательно на индексирование, порядок полей в связях таблиц и порядок измерений регистра сведений "Акцизные марки ЕГАИС", то приходим к выводу, что есть куда стремиться) А именно, порядок индексов должен быть строго в последовательности
- ОрганизацияЕГАИС
- АкцизнаяМарка
По сути, разработчики забыли про статью Типичные причины неоптимальной работы запросов и методы оптимизации, а именно:
Для каждого условия должен существовать подходящий индекс. Подходящим является индекс, удовлетворяющий следующим требованиям:
- 1. Индекс содержит все поля перечисленные в условии;
- 2. Эти поля находятся в самом начале индекса;
- 3. Эти поля идут подряд, то есть между ними не «вклиниваются» поля, не участвующие в условии запроса;
При создании объекта метаданных 1С:Предприятие автоматически создает индексы, которые должны подходить для работы большинства запросов.
Основные идексы, создаваемые 1С:Предприятием:
- индекс по уникальному идентификатору (ссылке) для всех объектных сущностей (справочники, документы и т.д.);
- индекс по регистратору (ссылке на документ) для таблиц движений регистров, подчиненных регистратору;
- индекс периоду и значениям всех измерений для итоговых таблиц регистров накопления;
- индекс периоду, счету и значениям всех измерений для итоговых таблиц регистров бухгалтерии.
Ну что ж, давайте поменяем порядок полей индекса и порядок связей:
Измененный текст запроса (для расширения)
"ВЫБРАТЬ
| &ОрганизацияЕГАИС КАК ОрганизацияЕГАИС,
| ШтрихкодыУпаковокТоваров.Ссылка КАК АкцизнаяМарка,
| ШтрихкодыУпаковокТоваров.ЗначениеШтрихкода КАК Штрихкод
|ПОМЕСТИТЬ ШтрихкодыУпаковок
|ИЗ
| Справочник.ШтрихкодыУпаковокТоваров КАК ШтрихкодыУпаковокТоваров
|ГДЕ
| ШтрихкодыУпаковокТоваров.Ссылка В (&ШтрихкодыУпаковок)
|ИНДЕКСИРОВАТЬ ПО
#Удаление
| АкцизнаяМарка,
#КонецУдаления
| ОрганизацияЕГАИС
#Вставка
|,
|АкцизнаяМарка
#КонецВставки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ШтрихкодыУпаковок.АкцизнаяМарка КАК АкцизнаяМарка,
| ШтрихкодыУпаковок.Штрихкод КАК Штрихкод,
| ШтрихкодыУпаковок.ОрганизацияЕГАИС КАК ОрганизацияЕГАИС,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.Статус, ЗНАЧЕНИЕ(Перечисление.СтатусыАкцизныхМарок.ПустаяСсылка)) КАК Статус,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.Справка2, ЗНАЧЕНИЕ(Справочник.Справки2ЕГАИС.ПустаяСсылка)) КАК Справка2,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция, ЗНАЧЕНИЕ(Справочник.КлассификаторАлкогольнойПродукцииЕГАИС.ПустаяСсылка)) КАК АлкогольнаяПродукция,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция.Код, """") КАК КодАлкогольнойПродукции,
| 1 КАК Приоритет
|ИЗ
| ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
#Удаление
| ПО ШтрихкодыУпаковок.АкцизнаяМарка = АкцизныеМаркиЕГАИС.АкцизнаяМарка
| И ШтрихкодыУпаковок.ОрганизацияЕГАИС = АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
#КонецУдаления
#Вставка
| ПО ШтрихкодыУпаковок.ОрганизацияЕГАИС = АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
| И ШтрихкодыУпаковок.АкцизнаяМарка = АкцизныеМаркиЕГАИС.АкцизнаяМарка
#КонецВставки
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ШтрихкодыУпаковок.АкцизнаяМарка,
| ШтрихкодыУпаковок.Штрихкод,
| ШтрихкодыУпаковок.ОрганизацияЕГАИС,
| ЗНАЧЕНИЕ(Перечисление.СтатусыАкцизныхМарок.ПустаяСсылка),
| ЗНАЧЕНИЕ(Справочник.Справки2ЕГАИС.ПустаяСсылка),
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция, ЗНАЧЕНИЕ(Справочник.КлассификаторАлкогольнойПродукцииЕГАИС.ПустаяСсылка)),
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция.Код, """"),
| 2
|ИЗ
| ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
#Удаление
| ПО ШтрихкодыУпаковок.АкцизнаяМарка = АкцизныеМаркиЕГАИС.АкцизнаяМарка
| И ШтрихкодыУпаковок.ОрганизацияЕГАИС <> АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
#КонецУдаления
#Вставка
| ПО ШтрихкодыУпаковок.ОрганизацияЕГАИС = АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
| И ШтрихкодыУпаковок.АкцизнаяМарка <> АкцизныеМаркиЕГАИС.АкцизнаяМарка
#КонецВставки
|"
Перезапускаем 1С, заходим в РМК, включаем замер производительности и сканируем акцизную марку:
Думаю, в дополнительных комментариях нет смысла) Вывод: используйте индексы правильно!
Желающие могут скачать расширение или использовать готовый текст исправленной функции:
&ИзменениеИКонтроль("ТекстЗапросаПолученияСпецификиДанныхШтрихкодов")
Функция хас_ТекстЗапросаПолученияСпецификиДанныхШтрихкодов()
Возврат
"ВЫБРАТЬ
| &ОрганизацияЕГАИС КАК ОрганизацияЕГАИС,
| ШтрихкодыУпаковокТоваров.Ссылка КАК АкцизнаяМарка,
| ШтрихкодыУпаковокТоваров.ЗначениеШтрихкода КАК Штрихкод
|ПОМЕСТИТЬ ШтрихкодыУпаковок
|ИЗ
| Справочник.ШтрихкодыУпаковокТоваров КАК ШтрихкодыУпаковокТоваров
|ГДЕ
| ШтрихкодыУпаковокТоваров.Ссылка В (&ШтрихкодыУпаковок)
|ИНДЕКСИРОВАТЬ ПО
#Удаление
| АкцизнаяМарка,
#КонецУдаления
| ОрганизацияЕГАИС
#Вставка
|,
|АкцизнаяМарка
#КонецВставки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ШтрихкодыУпаковок.АкцизнаяМарка КАК АкцизнаяМарка,
| ШтрихкодыУпаковок.Штрихкод КАК Штрихкод,
| ШтрихкодыУпаковок.ОрганизацияЕГАИС КАК ОрганизацияЕГАИС,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.Статус, ЗНАЧЕНИЕ(Перечисление.СтатусыАкцизныхМарок.ПустаяСсылка)) КАК Статус,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.Справка2, ЗНАЧЕНИЕ(Справочник.Справки2ЕГАИС.ПустаяСсылка)) КАК Справка2,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция, ЗНАЧЕНИЕ(Справочник.КлассификаторАлкогольнойПродукцииЕГАИС.ПустаяСсылка)) КАК АлкогольнаяПродукция,
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция.Код, """") КАК КодАлкогольнойПродукции,
| 1 КАК Приоритет
|ИЗ
| ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
#Удаление
| ПО ШтрихкодыУпаковок.АкцизнаяМарка = АкцизныеМаркиЕГАИС.АкцизнаяМарка
| И ШтрихкодыУпаковок.ОрганизацияЕГАИС = АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
#КонецУдаления
#Вставка
| ПО ШтрихкодыУпаковок.ОрганизацияЕГАИС = АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
| И ШтрихкодыУпаковок.АкцизнаяМарка = АкцизныеМаркиЕГАИС.АкцизнаяМарка
#КонецВставки
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ШтрихкодыУпаковок.АкцизнаяМарка,
| ШтрихкодыУпаковок.Штрихкод,
| ШтрихкодыУпаковок.ОрганизацияЕГАИС,
| ЗНАЧЕНИЕ(Перечисление.СтатусыАкцизныхМарок.ПустаяСсылка),
| ЗНАЧЕНИЕ(Справочник.Справки2ЕГАИС.ПустаяСсылка),
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция, ЗНАЧЕНИЕ(Справочник.КлассификаторАлкогольнойПродукцииЕГАИС.ПустаяСсылка)),
| ЕСТЬNULL(АкцизныеМаркиЕГАИС.АлкогольнаяПродукция.Код, """"),
| 2
|ИЗ
| ШтрихкодыУпаковок КАК ШтрихкодыУпаковок
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АкцизныеМаркиЕГАИС КАК АкцизныеМаркиЕГАИС
#Удаление
| ПО ШтрихкодыУпаковок.АкцизнаяМарка = АкцизныеМаркиЕГАИС.АкцизнаяМарка
| И ШтрихкодыУпаковок.ОрганизацияЕГАИС <> АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
#КонецУдаления
#Вставка
| ПО ШтрихкодыУпаковок.ОрганизацияЕГАИС = АкцизныеМаркиЕГАИС.ОрганизацияЕГАИС
| И ШтрихкодыУпаковок.АкцизнаяМарка <> АкцизныеМаркиЕГАИС.АкцизнаяМарка
#КонецВставки
|";
КонецФункции