При работе с ветсистемой Меркурий, используется запрос остатков на стороне Меркурия, результат которого заносится в таблицу значений «Остатки». Далее при создании документа "Ветеринарное свидетельство" по номенклатурной позиции запросом вытаскивается необходимая партия.
Ранее когда строк остатков было примерно около 100-200, то скорость выборки из таблицы значений была нормальной (1-2 секунды), то сейчас это 10-15 секунд из таблицы 500-700 строк. Соответственно при создании ветдокументов (300-400 штук в день) время ожидания стало очень затратным.
Подскажите, пжл, оптимальный выход из ситуации. Ниже текст запроса (если убрать условия, то скорость запроса увеличивается не значительно):
ВЫБРАТЬ
О.ГУИД КАК ГУИД,
О.ДатаВыработки КАК ДатаВыработки,
О.ДатаПросрочки КАК ДатаПросрочки,
О.ДатаВыработкиКон КАК ДатаВыработкиКон,
О.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
О.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
О.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
О.ЕдиницаХранения КАК ЕдиницаХранения,
О.Фасовка КАК Фасовка,
О.КодПартии КАК КодПартии,
О.Количество,
О.КоличествоУпаковок,
О.Категория КАК Категория,
О.Номенклатура КАК Номенклатура,
О.НоменклатураСтрокой КАК НоменклатураСтрокой,
О.ГУИДНоменклатуры,
О.Организация КАК Организация,
О.ДатаСоздания КАК ДатаСоздания,
О.ГУИДПроизводителя КАК ГУИДПроизводителя,
О.Производитель,
О.СписокПроизводителей,
О.НомерСЗ
ПОМЕСТИТЬ Остатки
ИЗ
&Остатки КАК О
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СкладскиеЗаписи.Категория КАК Категория,
СкладскиеЗаписи.Номенклатура КАК Номенклатура,
СкладскиеЗаписи.ЕдиницаХранения КАК Единица,
СкладскиеЗаписи.Количество КАК КоличествоОстаток,
СкладскиеЗаписи.КоличествоУпаковок КАК КоличествоУпаковокОстаток,
СкладскиеЗаписи.ДатаВыработки КАК ДатаВыработки,
СкладскиеЗаписи.ДатаПросрочки КАК ДатаПросрочки,
СкладскиеЗаписи.ДатаВыработкиКон КАК ДатаВыработкиКон,
СкладскиеЗаписи.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
СкладскиеЗаписи.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
СкладскиеЗаписи.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
СкладскиеЗаписи.НомерСЗ,
СкладскиеЗаписи.ГУИД КАК ГУИД,
СкладскиеЗаписи.Фасовка КАК Фасовка,
СкладскиеЗаписи.КодПартии КАК КодПартии,
СкладскиеЗаписи.НоменклатураСтрокой КАК НоменклатураСтрокой,
СкладскиеЗаписи.ГУИДНоменклатуры,
СкладскиеЗаписи.ГУИДПроизводителя КАК ГУИДПроизводителя,
СкладскиеЗаписи.Производитель,
СкладскиеЗаписи.СписокПроизводителей
ИЗ
Остатки КАК СкладскиеЗаписи
ГДЕ
СкладскиеЗаписи.Организация = &Организация
И (&ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ИЛИ &ДатаВыработки <= СкладскиеЗаписи.ДатаВыработки
ИЛИ СкладскиеЗаписи.ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
И СкладскиеЗаписи.Количество > 0
И (&ГУИДПроизводителя = ""
ИЛИ (ВЫРАЗИТЬ(СкладскиеЗаписи.ГУИДПроизводителя КАК СТРОКА(36))) = &ГУИДПроизводителя)
И ВЫБОР
КОГДА &Номенклатура = НЕОПРЕДЕЛЕНО
ИЛИ СкладскиеЗаписи.Номенклатура = НЕОПРЕДЕЛЕНО
ИЛИ СкладскиеЗаписи.Номенклатура = &ПустойТовар
ТОГДА СкладскиеЗаписи.Категория = &Категория
ИНАЧЕ СкладскиеЗаписи.Номенклатура = &Номенклатура
КОНЕЦ
И (НЕ СкладскиеЗаписи.КоличествоУпаковок ПОДОБНО "%устаревшая%")
И (&КодПартии = ""
ИЛИ СкладскиеЗаписи.КодПартии = &КодПартии)
УПОРЯДОЧИТЬ ПО
Номенклатура УБЫВ,
ДатаВыработки,
СкладскиеЗаписи.ДатаСоздания
Перед выполнением запроса сворачивалась таблица значений по номенклатуре, и запрос отрабатывался уже по этой таблице.
Спасибо за помощь и новые познания.
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Запрос.Параметры.Номенклатура);
ОстаткиПоНоменклатуре = Остатки.Скопировать(Отбор);
Запрос.УстановитьПараметр("Остатки", ОстаткиПоНоменклатуре);
Разработчики 1С очень часто игнорируют использование конструкции «ИНДЕКСИРОВАТЬ ПО» в запросе.
Может появиться прирост производительности запроса, но не большой.
ВЫБРАТЬ
О.ГУИД КАК ГУИД,
О.ДатаВыработки КАК ДатаВыработки,
О.ДатаПросрочки КАК ДатаПросрочки,
О.ДатаВыработкиКон КАК ДатаВыработкиКон,
О.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
О.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
О.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
О.ЕдиницаХранения КАК ЕдиницаХранения,
О.Фасовка КАК Фасовка,
О.КодПартии КАК КодПартии,
О.Количество КАК Количество,
О.КоличествоУпаковок КАК КоличествоУпаковок,
О.Категория КАК Категория,
О.Номенклатура КАК Номенклатура,
О.НоменклатураСтрокой КАК НоменклатураСтрокой,
О.ГУИДНоменклатуры КАК ГУИДНоменклатуры,
О.Организация КАК Организация,
О.ДатаСоздания КАК ДатаСоздания,
О.ГУИДПроизводителя КАК ГУИДПроизводителя,
О.Производитель КАК Производитель,
О.СписокПроизводителей КАК СписокПроизводителей,
О.НомерСЗ КАК НомерСЗ
ПОМЕСТИТЬ Остатки
ИЗ
&Остатки КАК О
ИНДЕКСИРОВАТЬ ПО
Номенклатура,
ДатаВыработки,
ГУИДПроизводителя,
КодПартии
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СкладскиеЗаписи.Категория КАК Категория,
СкладскиеЗаписи.Номенклатура КАК Номенклатура,
СкладскиеЗаписи.ЕдиницаХранения КАК Единица,
СкладскиеЗаписи.Количество КАК КоличествоОстаток,
СкладскиеЗаписи.КоличествоУпаковок КАК КоличествоУпаковокОстаток,
СкладскиеЗаписи.ДатаВыработки КАК ДатаВыработки,
СкладскиеЗаписи.ДатаПросрочки КАК ДатаПросрочки,
СкладскиеЗаписи.ДатаВыработкиКон КАК ДатаВыработкиКон,
СкладскиеЗаписи.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
СкладскиеЗаписи.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
СкладскиеЗаписи.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
СкладскиеЗаписи.НомерСЗ КАК НомерСЗ,
СкладскиеЗаписи.ГУИД КАК ГУИД,
СкладскиеЗаписи.Фасовка КАК Фасовка,
СкладскиеЗаписи.КодПартии КАК КодПартии,
СкладскиеЗаписи.НоменклатураСтрокой КАК НоменклатураСтрокой,
СкладскиеЗаписи.ГУИДНоменклатуры КАК ГУИДНоменклатуры,
СкладскиеЗаписи.ГУИДПроизводителя КАК ГУИДПроизводителя,
СкладскиеЗаписи.Производитель КАК Производитель,
СкладскиеЗаписи.СписокПроизводителей КАК СписокПроизводителей
ИЗ
Остатки КАК СкладскиеЗаписи
ГДЕ
СкладскиеЗаписи.Организация = &Организация
И (&ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)
ИЛИ &ДатаВыработки <= СкладскиеЗаписи.ДатаВыработки
ИЛИ СкладскиеЗаписи.ДатаВыработки = ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))
И СкладскиеЗаписи.Количество > 0
И (&ГУИДПроизводителя = ""
ИЛИ (ВЫРАЗИТЬ(СкладскиеЗаписи.ГУИДПроизводителя КАК СТРОКА(36))) = &ГУИДПроизводителя)
И ВЫБОР
КОГДА &Номенклатура = НЕОПРЕДЕЛЕНО
ИЛИ СкладскиеЗаписи.Номенклатура = НЕОПРЕДЕЛЕНО
ИЛИ СкладскиеЗаписи.Номенклатура = &ПустойТовар
ТОГДА СкладскиеЗаписи.Категория = &Категория
ИНАЧЕ СкладскиеЗаписи.Номенклатура = &Номенклатура
КОНЕЦ
И НЕ СкладскиеЗаписи.КоличествоУпаковок ПОДОБНО "%устаревшая%"
И (&КодПартии = ""
ИЛИ СкладскиеЗаписи.КодПартии = &КодПартии)
УПОРЯДОЧИТЬ ПО
Номенклатура УБЫВ,
ДатаВыработки,
СкладскиеЗаписи.ДатаСоздания
(26) Думаю, что если называть вещи СВОИМИ именами - проще вообще будет в этом мире! Нет?
Если вам в магазине на коробке будет написано одно, а дома вы откроете и увидите совершенно другое , но тоже качественое - просто Другое и за такую же цену, вы как к этому отнесетесь?
Разруха не в клозетах , она - в головах! А спать нужно в спальне, а не в прихожей...
Если я не буду протру звезды и медвежонок не протрет звезды, то кто же протрет их?
Если не указывать писателям на явные ляпы, то скоро мы вообще перестанем понимать друг друга, уже сейчас порой автор об одном спрашивает, а ответов туча совершенно не в тему...
Перед выполнением запроса сворачивалась таблица значений по номенклатуре, и запрос отрабатывался уже по этой таблице.
Спасибо за помощь и новые познания.
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", Запрос.Параметры.Номенклатура);
ОстаткиПоНоменклатуре = Остатки.Скопировать(Отбор);
Запрос.УстановитьПараметр("Остатки", ОстаткиПоНоменклатуре);
это не запрос, а "черный ящик" механизма представлений и оптимизировать его так же мудро как топить Эверест в Индийском океане.
когда нибудь решение будет найдено в ..следующей геологической эре
а нет - это не механизм представлений, но брошенный камень уже не вернешь
обилии ИЛИ намекает на суперкостыль, замедление намекает на кривую архитектуру решения или облуживания БД, ПОДОБНО песня вообще.
за такое условие полагается наказание розгами
(9)А почему вы решили, что проблема в использовании временной таблицы, а не в отборах?
Например, сделать запрос из временной таблицы без отборов, он что, тоже будет 15 секунд выполняться?
Временная таблица без индексов, на нее накладываются отборы, которые возможно не нужны (ДатаВыбработки, ГУИДПроизводителя, КодПартии).
Добавить индексы, модифицировать текст запроса - добавляя нужные отборы.
И посмотреть что получится.
(15) Если максимально упрощаем запрос, то всё равно 9-12 сек.
ВЫБРАТЬ
О.ГУИД КАК ГУИД,
О.ДатаВыработки КАК ДатаВыработки,
О.ДатаПросрочки КАК ДатаПросрочки,
О.ДатаВыработкиКон КАК ДатаВыработкиКон,
О.ДатаПросрочкиКон КАК ДатаПросрочкиКон,
О.ДатаВыработкиСтрокой КАК ДатаВыработкиСтрокой,
О.ДатаПросрочкиСтрокой КАК ДатаПросрочкиСтрокой,
О.ЕдиницаХранения КАК ЕдиницаХранения,
О.Фасовка КАК Фасовка,
О.КодПартии КАК КодПартии,
О.Количество КАК Количество,
О.КоличествоУпаковок КАК КоличествоУпаковок,
О.Категория КАК Категория,
О.Номенклатура КАК Номенклатура,
О.НоменклатураСтрокой КАК НоменклатураСтрокой,
О.ГУИДНоменклатуры КАК ГУИДНоменклатуры,
О.Организация КАК Организация,
О.ДатаСоздания КАК ДатаСоздания,
О.ГУИДПроизводителя КАК ГУИДПроизводителя,
О.Производитель КАК Производитель,
О.СписокПроизводителей КАК СписокПроизводителей,
О.НомерСЗ КАК НомерСЗ
ПОМЕСТИТЬ Остатки
ИЗ
&Остатки КАК О
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
СкладскиеЗаписи.Номенклатура КАК Номенклатура
ИЗ
Остатки КАК СкладскиеЗаписи
(23) вот и ответ. Код выполняется на клиенте.
Т.е. ТЗ передается с клиента на сервер и уже там выполняется запрос. А замер времени это все включает.
Попробуйте создавать ТЗ и выполнять запрос на сервере.
Самый большой "затык" это передача данных клиент-сервер-клиент.
Может не использовать запрос из Таблицы значений, а выгружать её изначально например в регистр сведений, а затем уже из него вытаскивать значения с исключением забранных партий.
Используем клиент-серверный вариант. Выход конечно имеется - поменять серверное железо, так как на рабочей станции с винтом m.2 Samsung EVO 970 Plus, запрос выполняется мгновенно.