v7: ТиС 77 Прямой запрос к справочнику Номенклатура #769683


#0 by Looking
Доброго времени суток! Конфигурация "Торговля и Склад 7.7". Задача в частичном отображении справочника "Номенклатура", реализую ее через ИспользоватьСписокЭлементов. Формирование списка который должен отображаться реализовано через задание пользователями списка исключаемых из отображения групп и элементов, то есть при открытии справочника Номенклатура анализируется список исключения и формируется отображаемый список. Запрос к справочнику пробовал делать и штатным запросом, и прямым - время выполнения в обоих случаях одинаково - 3 сек. Может я что-то не так реализовал, раз время идентично? Может необходимо использовать другие методы?
#0 by Looking
Доброго времени суток! Конфигурация "Торговля и Склад 7.7". Задача в частичном отображении справочника "Номенклатура", реализую ее через ИспользоватьСписокЭлементов. Формирование списка который должен отображаться реализовано через задание пользователями списка исключаемых из отображения групп и элементов, то есть при открытии справочника Номенклатура анализируется список исключения и формируется отображаемый список. Запрос к справочнику пробовал делать и штатным запросом, и прямым - время выполнения в обоих случаях одинаково - 3 сек. Может я что-то не так реализовал, раз время идентично? Может необходимо использовать другие методы?
#1 by Looking
#2 by Looking
#3 by Looking
#4 by ДенисЧ
Запросы практически эквипенисуальны. В смысле эквивалентны. Основное время всё равно уйдёт на передачу списка на сервер и последующее получение данных
#5 by Mikeware
криво поставленную задачу решать через .оппу, и удивляться... Если уж прямым запросом (в смысле, классом) то надо типа ВЫБРАТЬ СпрНоменклатура.ТекущийЭлемент [Номенклатура $Справочник.Номенклатура] ИЗ Справочник.Номенклатура КАК СпрНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ Справочник.СоставФильтраСправочникаНоменклатура СпрФильтр ПО $СпрФильтр.Номенклатура=$СпрНоменклатура.ТекущийЭлемент И $СпрФИльтр.Владелец=:ПеремФильтрСправочникаНоменклатураПользователя ГДЕ  ISNULL($СпрФильтр.ТекущийЭлемент)=1
#6 by Mikeware
и да, с какого перепугу стало прямым запросом?
#7 by Изучаю1С8
+nolock
#8 by Mikeware
для дбф не обязательно.
#9 by Looking
ну как криво поставленную. стоит задача, чтобы часть справочника Номенклатура и Контрагенты часть пользователей не видела совсем - не могла выбрать в документах, отчетах, в принципе не знала об их существовании. можно достичь это как-то иначе?
#10 by Looking
"Справочник.СоставФильтраСправочникаНоменклатура СпрФильтр ПО $СпрФильтр.Номенклатура=$СпрНоменклатура.ТекущийЭлемент" но ведь чтобы сформировать фильтр все-равно необходимо сначала обратиться к справочнику Номенклатура? ведь в данном случае пользователи задают только то, что нужно исключать, а не то, что нужно отображать. то есть в списке должны отображаться группы и элементы, кроме тех, что укажут пользователи в списке-фильтре.
#11 by Злопчинский
Если скульная база То можно поставить патч Ромикса И перехватывать запросы к скулю И модифицировать их
#12 by Looking
база ДБФ
#13 by Mikeware
а ГДЕ  ISNULL($СпрФильтр.ТекущийЭлемент)=1 ты не заметил?
#14 by Looking
можете помочь мне в написании запроса под мою конкретную задачу? не бесплатно конечно. с прямыми запросами не работал, а нужно достаточно оперативно проверить, ускорит-ли он данную задачу. написал Вам в ICQ указанную в Вашем профиле.
#15 by Looking
+1cpp в конфигурации установлена, используется для индексированных таблиц значений
#16 by Djelf
Класс "ПрямойЗапрос" на dbf использует 1sqlite. А запросе "В" превращается в "IN". А в официальной версии 1sqlite используется древний движок sqlite версии 3.7.10 А движок sqlite 3.7.10 не умеет оптимизировать IN. В смысле он не использует по IN индексы, а без индексов, естественно запрос тормозит. Можешь попробовать мою сборку 1sqlite, она по IN умеет использовать индексы Либо не используй "ПрямойЗапрос", а пиши на чистом sql, а  список выгружай во временную таблицу sqlite и используй не IN, а JOIN
#17 by Looking
у меня база дбф
#18 by Djelf
Я знаю. В ты об этом уже говорил. Или ты про слова "пиши на чистом sql"? Ну так все правильно написано. "ПрямойЗапрос" транслирует запрос в чистый sql, который в dbf базе выполняет ВК 1sqlite.
#19 by Looking
можете реализовать это под мою задачу? сколько это стоит? в итоге должно работать быстрее чем сейчас?
#20 by Looking
+сам я точно сходу не смогу написать, а мне-бы на днях результат нужен. знающим ведь такая задача не очень трудоемка?
#21 by Это_mike
я аськууже с полгода не включал...
#22 by Это_mike
кинь в почту - мой ник на мэйл.ру завтра гляну.
#23 by Looking
спасибо большое! а что конкретно кинуть нужно? md-ик?
#24 by Это_mike
вопрос - что сделать нужно.
#25 by Это_mike
то, что в -не сработало?
#26 by Looking
, я сам не пойму как прописать, никогда прямые запросы не писал, к сожалению.
#27 by Looking
суть вопроса в ускорении, реально-ли сделать так, чтобы фильтр на справочник накладывался быстрее чем за 3 секунды.
#28 by Looking
могу удаленный доступ предоставить, может так проще, чтобы сразу на реальной БД отработать?
#29 by Djelf
Просто попытайся поставить 1sqlite по ссылке Конечно будет быстрее, сейчас считай это не прямой запрос, а кривой ;) И кстати, выложи код генерации СпискаИсключения. Это все можно завернуть в 1 запрос...
#30 by Это_mike
у меня сейчас база, так там фильр примерно так же накладывается, только не по справочнику дополнительному, с по реувизиту основного. Есть тормоза, но не 3 секунды, конечно. Но я эту базу стараюсь не ковврять Завтра попрлбую..
#31 by Это_mike
он выше это и выложил. А как в один запрс -ч предложил в
#32 by Looking
"выложи код генерации СпискаИсключения." в Процедура ФормированиеСпискаОтбораСправочникаНоменклатура
#33 by Djelf
Чорд, как то не заметил...
#34 by Это_mike
я, правда, 1склайт только на прошлой неделе попообовал, до этого с файловыми не возюкался, и думал, что никогда не придется. Однако пришлось.
#35 by Looking
по ссылке скачал 1sqlite.dll, у меня она в моменте совсем не подключена. я же говорю, что в моменте совсем не умею с прямыми запросами работать. поэтому и прошу того у кого есть эти знания и навык, написать прямой запрос под мое решение.
#36 by Looking
+не бесплатно конечно. главное чтобы время нашли.
#37 by Djelf
Какой тип у ПеремФильтрСправочникаНоменклатураПользователя? Не Справочник Номенклатура же... Поэтому и не взлетает.
#38 by Djelf
Как так не подключена? Не может быть такого!!! оО И даже dll` ки в каталогах ИБ или 1С не было? Не верю!
#39 by Looking
тип у ПеремФильтрСправочникаНоменклатураПользователя Справочник.ФильтрыСправочникаНоменклатура, у которого в свою очередь подчиненный Справочник.СоставФильтраСправочникаНоменклатура, в этом подчиненном справочнике реквизит Номенклатура, как раз в нем и указываются группы и элементы, которые необходимо исключить из отображения.
#40 by Looking
ну почему-же не верите, только 1cpp.dll используется из дополнительных внешних компонент.
#41 by Looking
то есть пользователь-руководитель указывает в справочнике пользователей, что пользователю Иванову задан "Фильтр для менеджеров", а пользователю Петрову "Фильтр для снабженцев" и т.д., а уже в подчиненных справочниках этих фильтров перечислены группы и элементы номенклатуры, которые необходимо исключать из отображения.
#42 by Злопчинский
а не проще сделать справочник по типу "Номенклатура-Пользователь", и спр.номенклатура список вообще не открывать?
#43 by Looking
не совсем понял мысль, ведь номенклатура не статична, постоянно дополняется, видоизменяется, и при каждом таком действии эти изменения справочника Номенклатура должны каким-то образом синхронизироваться со справочниками "Номенклатура менеджеров", "Номенклатура снабженцев" и т.д.? и опять-же обращение к справочнику Номенклатура идет из целого ряда документов, отчетов, везде необходимо подменить это обращение обращением не к справочнику Номенклатура, а к справочникам "Номенклатура-Пользователь"?
#44 by Looking
+или я не так понял ?
#45 by Looking
"Какой тип у ПеремФильтрСправочникаНоменклатураПользователя? " 3 сек это с момента начала запроса к справочнику Номенклатура, и к окончанию запроса. или речь о том, что сама конструкция не работает?
#46 by Djelf
Да не сработает... У тебя отрицательный фильтр, а в sql с этим мучения ;) Как то так оно должно выглядеть     ТекстЗапроса="     |SELECT
#47 by Djelf
Слегка ошибся...
#48 by Looking
, спасибо огромное! скажете что должен! сейчас никак проверить не смогу, утром рано вставать. попробую завтра в течение дня.
#49 by Mikeware
как раз сработает. второе соединение нафик не нужно. ну что, сработало? или пробовать?
#50 by Looking
еще проверяю. что нужно выслать Вам, чтобы пробовать? мд-ик? удаленный доступ по ТВ или АммиАдмин подойдет?
#51 by Looking
"Запрос.УстановитьПараметр("@ФильтрПользователя",ФильтрПользователя);" прошу подсказать, какое значение имеет переменная ФильтрПользователя? его нужно самому предварительно заполнять? пытался передавать в эту переменную список значений, или просто справочник, получаю ошибку при выполнении Запрос.УстановитьПараметр("@ФильтрПользователя",СЗИсключаемойНоменклатуры); {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль}: Неверный номер параметра
#52 by Looking
Запрос.Подготовить(ТекстЗапроса); {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль}: Ошибка подстановки текстового параметра ПеремФильтрСправочникаНоменклатураПользователя - Неизвестный параметр
#53 by Mikeware
это вгде?
#54 by Mikeware
кинь базу - мд+эти три справочника+справочник пользователей (или где там фильтр фиксируемтя)
#55 by Looking
а по АммиАдмин или ТимВьювер неудобно подключиться?
#56 by Mikeware
Не. Даже скайп, и то...
#57 by Looking
когда открываю список справочника, то получаю ошибку Процедура ФормированиеСпискаОтбораСправочникаНоменклатура ПеремФильтрСправочникаНоменклатураПользователя=глПользователь.ФильтрСправочникаНоменклатура;
#58 by Mikeware
То, что у тебя в было в СпрСоставФильтраСправочникаНоменклатура.ИспользоватьВладельца(ПеремФильтрСправочникаНоменклатураПользователя);
#59 by Looking
в у меня ПеремФильтрСправочникаНоменклатураПользователя=глПользователь.ФильтрСправочникаНоменклатура; то есть это значение реквизита ФильтрСправочникаНоменклатура справочника Пользователи, которое имеет тип значения Справочник.ФильтрыСправочникаНоменклатура. то при открытии формы получаю ошибку Запрос.УстановитьПараметр("@ФильтрПользователя",ПеремФильтрСправочникаНоменклатураПользователя);   {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль}: Неверный номер параметра
#60 by Mikeware
ухххххххххххкакязол! Запрос.УстановитьПараметр("ПеремФильтрСправочникаНоменклатураПользователя",глПользователь.ФильтрСправочникаНоменклатура);
#61 by Looking
не работает так, показывает ошибку. можно смысл пояснить? структура понятна? что в фильтре пользователей нет фильтра - это элемент справочника, у которого есть подчиненный справочник, в котором перечислены те группы и элементы, которые необходимо исключить из отображения.
#62 by Looking
+Запрос.УстановитьПараметр("ФильтрПользователя",глПользователь.ФильтрСправочникаНоменклатура); {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль}: Неверный номер параметра
#63 by Mikeware
смысл такой справочник.номенклатура соединяется со справочнником СоставФильтраНоменклатура, левым соединением по 1)равенству номенлатуры (номеклатура в справочнике номенклатура равен реквизиту номенклатура в справочнике СоставФильтраНоменклатура), и 2)по условию поле Владелец справочника СоставФильтра... равен твоей переменной. получается табличка с двумя колонками - в одной колонке _весь_ справочник номенклатура, во во второй дибо соответвующий эдемент из справочника СоставФильтра, либо пусто. Из этой таблички мы отбираем толко те строки, у которых во второй строке пусто, и берем из них элемент номенлаьуры (из первой колонки) гы?
#64 by Looking
спасибо большое! на неверный номер параметра ругается, так как ранее в запросе не задан сам параметр?
#65 by Mikeware
блин, ну кинь базу
#66 by Djelf
Эх... недокурил я вчера запрос... Исправленный     ТекстЗапроса="     |SELECT @ФильтрПользователя - элемент Справочника ФильтрыСправочникаНоменклатура
#67 by Mikeware
если скуллайт - попробуй     Запрос.Подставлять("...",...);
#68 by Djelf
Одна печаль - в индекс по справочнику номенклатура никак не попасть. Сколько выполняется "SELECT id FROM Справочник_Номенклатура"?
#69 by Mikeware
имхо, как раз _пере_курил
#70 by Mikeware
а лучше - посавь вандаловский класс ПрямойЗапрос
#71 by Looking
работает! и гораздо быстрее. говорите что должен. на базе без пользователей, не в монопольном режиме я по отладчику смотрю Справочник.Номенклатура.ФормаСписка.ФормаСписка    945    Запрос.Подготовить(ТекстЗапроса);    1    0.000890    0.38 или нужно как-то иначе смотреть? Выборку подчиненных элементов ПриВыбореРодителя тоже прямым запросом можно делать? Можете подсказать текст запроса?
#72 by Mikeware
|SELECT а лучше - поставь ПрямойЗапрос, и пиши "на русском" зы. почту глянь
#73 by Djelf
Обидно на прямом запросе тратить на саму подготовку столько же времени сколько выполняется сам запрос ;) Ну и на прямом вот так не получится! > Все товары в группе, +_Родитель  для ускоренной группировки в ИндексированнойТаблице WITH RECURSIVE Goods(ID,PARENTID,ISFOLDER) AS (     FROM [Справочник.Номенклатура]     WHERE ID   IN('     2Б  ')     UNION SELECT Спр.ID,Спр.PARENTID,Спр.ISFOLDER     FROM [Справочник.Номенклатура] AS Спр     INNER JOIN Goods ON Goods.ID = Спр.PARENTID ) SELECT
#74 by Looking
письмо получил, спасибо огромное! изучаю! опять у меня ошибка Запрос.Подготовить(ТекстЗапроса); {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль}: Ошибка подстановки текстового параметра ВыбРодитель - Неизвестный параметр ВыбРодитель необходимо через Запрос.УстановитьПараметр задавать?
#75 by Looking
это просто пример? в моей задаче он не применим?
#76 by Looking
что я должен за проделанную Вами работу?
#77 by Mikeware
Научился? вот и хорошо!
#78 by Mikeware
Запрос.Подставлять("...",...);
#79 by Djelf
Поддерживаю но в нагрузку нужно прочитать и документацию по 1sqlite Ты же на этом с прямыми запросами не остановишься? пример то работоспособный и полезный, только он потребует мою сборку 1sqlite, в оригинальном СТЕ запросы не работают.
#80 by Looking
, спасибо вам огромное за науку! но если что я осознаю, и готов понести наказание рублем за свое незнайство ))) , а когда открывается корневой каталог, например, при первоначальном открытии формы списка справочника, то есть группа-родитель отсутствует, нужно это как-то дополнительным условием в запросе отражать? или ограждать запрос от этой ситуации дополнительными условиями? " только он потребует мою сборку 1sqlite" у меня как-раз она и установлена, с Вашей помощью
#81 by Looking
если использую такой запрос, то получаю ошибку Запрос.Подготовить(ТекстЗапроса); {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль}: Ошибка подстановки текстового параметра ВыбРодитель - Неизвестный параметр если добавляю то получаю ошибку Запрос.Подготовить(ТекстЗапроса); {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль}: Ошибка подстановки текстового параметра ВыбРодитель - Неизвестный параметр прошу извинить и помочь.
#82 by Злопчинский
Короче склифасовский Как отладишь все - расписываешь все подробно и выкладываешь Технологию и сами запросы Ибо надо делится типа
#83 by Djelf
Не будь таким жестоким ;) Различие между "Подставлять" и "УстановитьПараметр" новичка могут ввести в ступор. Руководство по 1sqlite "Объекты компоненты"/"Объект SQLiteQuery"/"Подготовить / Prepeare" Там все хорошо разжёвано. Главное этот раздел найти!!!
#84 by Злопчинский
"Различие между "Подставлять" и "УстановитьПараметр" новичка могут ввести в ступор." - я уже в ступоре. ничегго не поннял...
#85 by Looking
поймите меня правильно, я очень благодарен, что помощь в ключе обучения, такая помощь лучшая, развивающая. Но мне проще летом с этим сесть и спокойно разбираться, а сейчас отчетность, куча разноплановых вопросов как всегда в это время года. Поэтому я и прошу знающих написать, согласен на оплату. Я позднее с удовольствием сам во все вникну, а сейчас просто физически не смогу грамотно сам это сделать. Очень прошу помочь написать через прямой запрос.
#86 by Djelf
Ладно... попытаюсь объяснить! Есть объект Запрос. У Запроса есть 2 метода "Подставлять" и "УстановитьПараметр". Перед выполнением Запрос должен быть Подготовлен. Подготовкой считается вычисление плана выполнения Запроса. Метод Подставлять должен быть сделан до момента Подготовки. После Подготовки уже не меняется, фактически это установка константы для запроса. А вот УстановитьПараметр нужно делать после Подготовки. Т.к. у нас уже есть не просто Запрос, а ПодготовленныйЗапрос!!! Кто то что то понял? Я нет... Это надо попробовать несколько раз и вот тогда оно в голове уляжется ;)
#87 by Злопчинский
фигня все Я по такому пути так прямые запросы и не освоил Бо когда надо - здесь шаблон пишут или за денежку покупаю Сделал, пустил в продакшн и забыл А когда не надо - оно и не надо, ведь уже работает
#88 by Djelf
в Используется метод Подставлять Поэтому
#89 by Злопчинский
то есть красная или синяя...?
#90 by Djelf
Я обе уже съел, и зеленую тоже ;)
#91 by Djelf
Если для УстановитьПараметр то так     ТекстЗапроса="     |SELECT
#92 by Djelf
+ Редко использую Подставлять, только если сильно уверен что там не окажутся всякие кавычками и т.п. УстановитьПараметр работает надежнее - жрет все.
#93 by Злопчинский
дальтоник?
#94 by Looking
, , спасибо огромное за подробное осмысленное пояснение и пример! размещать Подставлять до Подготовить я также пробовал, получаю ошибку Запрос.Подготовить(ТекстЗапроса); {Справочник.Номенклатура.ФормаСписка.ФормаСписка.Модуль}: no such column: СпрНомерклатура.PARENTID а вот через УстановитьПараметр работает!
#95 by Looking
только отбор по фильтру не осуществляется, так как в есть условие ТекНоменклатура=СпрНоменклатура.ТекущийЭлемент; Если СЗОтображаемойНоменклатуры.НайтиЗначение(ТекНоменклатура)>0 Тогда а в прямом запросе такого условия нет, его можно в тело запроса прописать? или-же после запроса его результат обработать, например так?
#96 by Mikeware
чиво надобно-то?
#97 by Ёпрст
если запрос выполняется один раз, по Подставлять. Если много раз один и тот же запрос с разными параметрами, например, в форме списка - то Подготовить + УстановитьПараметр. Усё.
#98 by Mikeware
давай в темпе чата, если вопросы есть. у меня 30 минут, и убегаю...
Тэги: 1С 7.7 и ранее
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С