Radistka
|
|
« : 11-04-2013 05:47 » |
|
чтото порыскала по форумам, вроде у народа получается, а как?- не понятно. Справочник Сертификатов подчинён справочнику номенклатуры. ВЫБРАТЬ СУММА(ПеремещениеНаРегионТовары.Количество) КАК Количество, ПеремещениеНаРегионТовары.Номенклатура, ПеремещениеНаРегионТовары.ЕдиницаИзмерения, ВложенныйЗапрос.Ссылка КАК Сертификат ИЗ Документ.ПеремещениеНаРегион.Товары КАК ПеремещениеНаРегионТовары ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1 Сертификаты.Ссылка КАК Ссылка, Сертификаты.НачалоДействияСертификата КАК НачалоДействияСертификата, Сертификаты.Владелец КАК Владелец ИЗ Справочник.Сертификаты КАК Сертификаты ГДЕ (Сертификаты.НачалоДействияСертификата <= &ДатаДок ИЛИ Сертификаты.НачалоДействияСертификата = &Дата1) И (Сертификаты.ДатаОкончанияДействия >= &ДатаДок ИЛИ Сертификаты.ДатаОкончанияДействия = &Дата1) И Сертификаты.ТипСертификата = &ТипСертификата УПОРЯДОЧИТЬ ПО НачалоДействияСертификата УБЫВ) КАК ВложенныйЗапрос ПО ПеремещениеНаРегионТовары.Номенклатура = ВложенныйЗапрос.Владелец ГДЕ ПеремещениеНаРегионТовары.Ссылка.Ссылка В(&МассивДокументов)
СГРУППИРОВАТЬ ПО ПеремещениеНаРегионТовары.Номенклатура, ПеремещениеНаРегионТовары.ЕдиницаИзмерения, ВложенныйЗапрос.Ссылка проблема в том что у номенклатуры может быть несколько активных сертификатов на дату документа. нам нужен тот, у которого дата начала действия самая поздняя. если убираем "Выбрать 1" то он берёт их все, если оставляем - не заполняет колонку с сылками на сертификаты. видела ещё вариант, когда пользуют максимум от даты начала действия сертификата, но вряд ли получится как-то сгруппировать по владельцу чтобы не группировать по ссылке. есть ещё варианты?
|
|
« Последнее редактирование: 11-04-2013 05:51 от Radistka »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #1 : 11-04-2013 07:02 » |
|
Radistka, ты бы сформулировала полней задачу. Kivals, он способный, поймет. Но есть отдельные товарищи... которые в шоке от такого ГДЕ (Сертификаты.НачалоДействияСертификата <= &ДатаДок ИЛИ Сертификаты.НачалоДействияСертификата = &Дата1) И (Сертификаты.ДатаОкончанияДействия >= &ДатаДок ИЛИ Сертификаты.ДатаОкончанияДействия = &Дата1) Ладно... может так и надо..
А ты во вложенном запросе получаешь необходимое?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Radistka
|
|
« Ответ #2 : 11-04-2013 07:14 » |
|
Radistka, ты бы сформулировала полней задачу. Kivals, он способный, поймет. Но есть отдельные товарищи... которые в шоке от такого ...... А ты во вложенном запросе получаешь необходимое?
ой, я как-то привыкла, что тут только он отвечает . задача то как бы не у меня первой возникла: необходимо во вложенном запросе выбрать данные по условиям и взять первые несколько записей результата. проблема, на сколько я понимаю, в том, что сначало отрабатывает вложенный запрос и по его результатам выбирается первое значение, а потом уже срабатывает связь между таблицами в основном запросе. в итоге результаты вложенного запроса могут не пройти по условиям связи и дать пустые строки. мне повезло - я могу заменить команду "первые 1" условиями и сделать много маленьких выборок, а из них в объединении получить результат, вот так заработало: ВЫБРАТЬ СУММА(ПеремещениеНаРегионТовары.Количество) КАК Количество, ПеремещениеНаРегионТовары.Номенклатура, ПеремещениеНаРегионТовары.ЕдиницаИзмерения, Сертификат.Ссылка ИЗ Документ.ПеремещениеНаРегион.Товары КАК ПеремещениеНаРегионТовары ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Сертификаты.Ссылка КАК Ссылка, Сертификаты.Владелец КАК Владелец, Сертификаты.НачалоДействияСертификата КАК НачалоДействияСертификата ИЗ Справочник.Сертификаты КАК Сертификаты ГДЕ (Сертификаты.НачалоДействияСертификата <= &ДатаДок ИЛИ Сертификаты.НачалоДействияСертификата = &Дата1) И (Сертификаты.ДатаОкончанияДействия >= &ДатаДок ИЛИ Сертификаты.ДатаОкончанияДействия = &Дата1) И Сертификаты.ТипСертификата = &ТипСертификата) КАК Сертификат ВНУТРЕННЕЕ СОЕДИНЕНИЕ (ВЫБРАТЬ МАКСИМУМ(Сертификаты.НачалоДействияСертификата) КАК НачалоДействияСертификата, Сертификаты.Владелец КАК Владелец ИЗ Справочник.Сертификаты КАК Сертификаты ГДЕ (Сертификаты.НачалоДействияСертификата <= &ДатаДок ИЛИ Сертификаты.НачалоДействияСертификата = &Дата1) И (Сертификаты.ДатаОкончанияДействия >= &ДатаДок ИЛИ Сертификаты.ДатаОкончанияДействия = &Дата1) И Сертификаты.ТипСертификата = &ТипСертификата СГРУППИРОВАТЬ ПО Сертификаты.Владелец) КАК ДатаПоследнегоСертификата ПО ДатаПоследнегоСертификата.НачалоДействияСертификата = Сертификат.НачалоДействияСертификата ПО ПеремещениеНаРегионТовары.Номенклатура = Сертификат.Владелец ГДЕ ПеремещениеНаРегионТовары.Ссылка.Ссылка В(&МассивДокументов)
СГРУППИРОВАТЬ ПО ПеремещениеНаРегионТовары.Номенклатура, ПеремещениеНаРегионТовары.ЕдиницаИзмерения, Сертификат.Ссылка а как вообще это решается, когда нельзя обойтись условиями, а надо именно взять один первый, или условий слишком много?
|
|
« Последнее редактирование: 11-04-2013 07:21 от Radistka »
|
Записан
|
|
|
|
Radistka
|
|
« Ответ #3 : 11-04-2013 07:16 » |
|
А ты во вложенном запросе получаешь необходимое?
да, вложенный запрос, когда он не вложенный, а самостоятельный, работает норм. тут вопрос именно в порядке выполнения вложенных запросов )
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #4 : 11-04-2013 07:27 » |
|
>нам нужен тот, у которого дата начала действия самая поздняя. если убираем "Выбрать 1"
есть агрегатные функции min max
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Radistka
|
|
« Ответ #5 : 11-04-2013 08:00 » |
|
>нам нужен тот, у которого дата начала действия самая поздняя. если убираем "Выбрать 1"
есть агрегатные функции min max
да, но они действуют в пределах группировки. это я реализовала во втором сообщении )
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #6 : 11-04-2013 08:02 » |
|
Radistka, "первые 1" - возвращает один результат, а тебе (судя по условиям задачи, пришлось немного подняпрячь телепатические способности ) нужно "первый 1 для каждой номенклатуры". Если есть возможность - я бы делал это через временные таблицы (например, динамический список до сегодняшней версии 8.3.2 временные таблицы не поддерживает), а не через вложенный запрос, потому как будет нагляднее (и данные запроса 1 у нас используются дважды): Запрос 1: Получаем исходные данные (Номенклатура, ЕдиницаИзмерения, Количество) из ПеремещениеНаРегион.Товары Запрос 2: По данным из запроса 1 получаем соответствие Номенклатура и МАКСИМУМ(НачалоДействияСертификата), накладывая все условия на справочник сертификатов Запрос 3 (самое важное): По результатам запроса 2 (Номенклатура и НачалоДействияСертификата) получаем ссылки на сертификаты. Внимание! Комбинация Номенклатура + НачалоДействияСертификата должна быть уникальной для справочника сертификатов! Иначе придется еще раз использовать МИНИМУМ (или МАКИМУМ) на ссылку из справочника, при этом какой из одинаковых (по комбинации Номенлатура + НачалоДействияСертификата) элементов попадет в результат - определить заранее невозможно. Результат запроса: соответствие Номенклатура и Сертификат Запрос 4 (результат): Делаем левое соединение Запрос 1 и Запрос 3 P.S. Аналогичные приемы подходят для получения хитрых срезов периодических регистров сведений Добавлено через 1 минуту и 20 секунд:P.P.S. А что касается что отвечаю в основном я - ну так читают ответы я надеюсь многие Глядишь - кому-то еще пригодится консультация, если задача будет понятна
|
|
« Последнее редактирование: 11-04-2013 08:05 от Kivals »
|
Записан
|
|
|
|
Radistka
|
|
« Ответ #7 : 11-04-2013 08:14 » |
|
да, прошу прощения, забыла уточнить. моя печаль - я работаю на 1С:Предприятие 8.1 (8.1.15.14). я штатник и конфа на столько переписана что для 8.3 мне прийдётся через годик, когда разберусь с переписками, писать с нуля на новую платформу..
|
|
|
Записан
|
|
|
|
Алёна
Молодой специалист
Offline
Блондинка...
|
|
« Ответ #8 : 11-04-2013 10:53 » |
|
Читаем.. читаем.... и даже пытаемся понять Я сейчас честно обложилась желтенькими книжками но как всегда жду волшебного пенедля...
|
|
|
Записан
|
Стену можно пробить только головой. Все остальное орудия.
|
|
|
Kivals
|
|
« Ответ #9 : 11-04-2013 13:08 » |
|
Radistka, я вроде не написал ничего, что не пошло бы на 8.1 - только в исключениях. Временные таблицы есть уже в 8.1. В принципе твой второй запрос практически полностью реализует то, что я написал, кроме следующих моментов: 1) делает это во вложенных запросах, вместо временных таблиц у меня. На мой взгляд это снижает читабельность, но какой вариант эффективнее - не знаю, это только проверять на реальных данных. 2) лишний раз используются условия (достаточно все условия "где" указать в запросе с МАКСИМУМ) Добавлено через 52 секунды:Алёна, если Radistka не поленится, и напишет реальные запросы по моим рекомендациям - думаю тогда будет понятнее
|
|
« Последнее редактирование: 11-04-2013 13:09 от Kivals »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #10 : 11-04-2013 13:38 » |
|
Kivals, временные таблицы - это на момент расчета? А чем тогда , грубо говоря, подзапрос отличается от временной таблицы?
С другой стороны - все зависит от объемов и нагруженности системы, и частоты таких запросов Если это все работает на MS SQL, то может проще построить view?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Kivals
|
|
« Ответ #11 : 11-04-2013 14:05 » |
|
Sla, 1с сама ретранслирует код запросов в sql, т.к. база может быть на MS SQL, Oracle, IBM DB2, PostgreSQL и во внутреннем файловом формате 1С.
Временные таблицы реально создаются в БД (create temporary table), потому в принципе могут тормозить работу, вложенные запросы по-моему не создают временных таблиц. Но в варианте с временными таблицами во втором запросе мы отбираем сертификаты только тех записей, которые есть по условиям задачи: из Документ.ПеремещениеНаРегион.Товары где ПеремещениеНаРегионТовары.Ссылка.Ссылка В(&МассивДокументов), а в варианте с вложенными таблицами мы шерстим всю таблицу справочника и отбираем нужные только на завершающем этапе ЛЕВОЕ СОЕДИНЕНИЕ (LEFT JOIN). Потому что будет эффективнее зависит от настроек БД (временные таблицы можно настроить в памяти) и количества данных в таблице Справочник.Сертификаты
|
|
|
Записан
|
|
|
|
Radistka
|
|
« Ответ #12 : 12-04-2013 03:36 » |
|
щас с текущими раскидаюсь с утра и в конце рабочего дня попробую сделать пример из временных таблиц..(кстати можно как-то в СКД реализовывать временные таблицы? а то я так привыкла всё в консоли тестить)
Оффтоп, в поисках истины: мне вот всё интересно было, когда 8.2 только появилсь то временные таблицы помню сильно нашумели тем что действительно физически создаются в каком то виде и где то хранятся и 1Ска их за собой не чистит. но я тогда только начинала 1С изучать и все эти умные слова мне были непонятны.. сейчас всё это в форумах давно ушло в архивы и не найти, а очень хочется сейчас вот разобраться что же они всё таки создают за файлы, чистит ли диски от них винда, или сама 1Ска или ещё чтото? это же вероятно какие то темпы должны быть? где бы ликбез получить? а то временными таблицами сейчас стала появляться необходимость пользоваться время от времени, а сервера у нас мощные только центральные, а в филиалах до смешного(2,49Гб оперативки и на этом ещё и Скуль вертится и по 10 пользователей подключается одновременно)
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #13 : 12-04-2013 07:12 » |
|
>а в филиалах до смешного(2,49Гб оперативки и на этом ещё и Скуль вертится и по 10 пользователей подключается одновременно) Не показатель нагрузки. 10 пользователей одновременной работы или коннектов.
По опыту знаю 2гб + 4 юзера одновременной работы (не 1С), но количество таблиц и запросов сопоставимо с 1С - и ни гу-гу, все работает, архитектура - клиент-сервер. Да... проблемы возникали, но на очень больших отчетах (большой период)
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Radistka
|
|
« Ответ #14 : 12-04-2013 10:21 » |
|
я не разбираюсь во взаимодействии сервера с пользователями, но процесс rphost который на таких "серверах" выжирает всю оперативку под ноль и пользователи просто не могут с базу запрашивать данные, потому что выборка данных идёт ооочень медленно - меня угнетает это и заставляет лишний раз к базе не кидаться. ой как хочется на управляемые формы, в надежде что наконец то огромные куски кода перепишутся и будут обрабатываться на клиенте.. а вдруг полегчает.. почему то на 8+Гб оперативки такая проблема возникает не раз в неделю а раз в два-три месяца. может так настроен Скуль неудачно или сервер 1С?
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #15 : 12-04-2013 10:37 » |
|
Offtopic: Sla, да и просто сказать "10 пользователей 1С" тоже не показатель. Количество таблиц в самой простой конфе (например, Деньги) и в самой сложной (УПП) отличается почти на 2 порядка (60 таблиц в Деньгах vs. более 3000 в УПП)...
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #16 : 12-04-2013 10:40 » |
|
Radistka, в управляемых формах как раз наоборот - все переброшено на сервер, на клиенте по сути только интерфейс обрабатывается. Хотя и оптимизирована работа сервера в более новых версиях. А вообще-то свои рабочие сервера я ставлю в ежедневный перезапуск службы, чтобы не было утечек памяти (т.к. утечками страдают все виденные мною версии 8ки)
|
|
|
Записан
|
|
|
|
Radistka
|
|
« Ответ #17 : 12-04-2013 10:51 » |
|
таблиц 400 наверное от силы, документооборот большой, базы по 10гигов минимум. базам от недели до двух лет, РИБ. пока тоже решаем перезапуском службы, но возникает потребность сейчас не так часто - как-то обмены расписание подгадали или может звезды в другом порядке, ночью идут обмены даными по товарным регистрам накопления, на некоторых базах по 5 часов обмен идёт. разброс в часовых поясах у пользователей 6 часов. т.е. я уже домой собираюсь а ктото ещё на обед не ходил.
и всё таки, где бы обликбезиться по поводу временных таблиц, 1Совские брошюрки иногда неправдивы или недоговаривают.
|
|
« Последнее редактирование: 12-04-2013 10:53 от Radistka »
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #18 : 12-04-2013 15:09 » |
|
На счет "где почитать" про временные таблицы: я уже не помню где выцепил. Попробуй пошерстить поиском google по www.gilev.ru
|
|
« Последнее редактирование: 12-04-2013 15:14 от Kivals »
|
Записан
|
|
|
|
Sla
|
|
« Ответ #19 : 12-04-2013 16:40 » |
|
блИИИн. Гилеву 100500 респектов.... очень много ссылок на него.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|