Привет всем. Опять затык в запросе. нужно обойти всю номенклатуру в далионе что впринцепи легко:
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.Код КАК Код,
| Номенклатура.БазоваяЕдиницаИзмерения КАК БазоваяЕдиницаИзмерения
|ИЗ
| Справочник.Номенклатура КАК Номенклатура";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Показать
на каждую позицию нужно заполнить остатками что отдельным запросом тоже легко сделать
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Фирма КАК Фирма,
| ОстаткиНоменклатурыОстатки.Склад КАК Склад,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
| ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
|ГДЕ
| ОстаткиНоменклатурыОстатки.Номенклатура = &Номенклатура
| И ОстаткиНоменклатурыОстатки.Склад = &Склад
| И ОстаткиНоменклатурыОстатки.Фирма = &Фирма";
Запрос.УстановитьПараметр("Номенклатура", Номенкратура);
Запрос.УстановитьПараметр("Фирма", Фирма);
Запрос.УстановитьПараметр("Склад", Склад);
Выборка=Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Воз=Выборка.КоличествоОстаток;
Конецесли;
Возврат Воз;
Показать
а также заполнить ценами
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатуры.Цена КАК Цена,
| ЦеныНоменклатуры.КатегорияЦен КАК КатегорияЦен,
| ЦеныНоменклатуры.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
|ГДЕ
| ЦеныНоменклатуры.Номенклатура = &Номенклатура
| И ЦеныНоменклатуры.КатегорияЦен = &КатегорияЦен";
Запрос.УстановитьПараметр("Номенклатура", Номенкратура);
Запрос.УстановитьПараметр("КатегорияЦен", КатегорияЦен);
Выборка=Запрос.Выполнить().Выбрать();
Показать
но выполнение всего очень много времени занимает
еще нюанс что остатки нужно заполнить по одному складу но двух выбранных фирм
цены нужно заполнить также двумя, закупочной, и розничной которую при выборе указываешь
вопрос как ускорить? если все выполнить в одном запросе будет ли быстрее? еще отдельно почему то запрос цены не берет последнюю текущую цену, а берет самую первую установленную цену.
2.
nomad_irk
7616.07.23 09:59 Сейчас в теме+0.1 $m
(1)
В чем сложности сделать левые соединения с таблицей остатков и цен в одном запросе?
ТаблицаЦен и ТаблицаОстатков сформировать как временные таблицы отдельными запросами с нужными отборами. ТаблицаЦен сформировать из СрезПоследних.
Выбрать
Номеклатура,
КоличествоОстаток
ПОМЕСТИТЬ ТаблицаОстатков
ИЗ
РегистрОстатков.Остатки(&Граница, Склад В(&Склады))
;
Выбрать
Номеклатура,
ВидЦены,
Цена
ПОМЕСТИТЬ ТаблицаЦен
ИЗ
РегистрЦен.СрезПоследних(&Дата, )
;
Выбрать
Т1.Ссылка КАК Номенклатура
Т2.КоличествоОстаток,
Т3.Цена КАК Цена1
Т4.Цена КАК Цена2
ИЗ
ТаблицаНоменклатуры КАК Т1
Левое соединение ТаблицаОстатков КАК Т2
ПО Т1.Ссылка = Т2.Номенклатура
Левое соединение ТаблицаЦен КАК Т3
ПО Т1.Ссылка = Т3.Номенклатура
И ТаблицаЦен.ВидЦены = &ВидЦены1
Левое соединение ТаблицаЦен КАК Т4
ПО Т1.Ссылка = Т4.Номенклатура
И ТаблицаЦен.ВидЦены = &ВидЦены2
Показать
Будет быстрее хотя бы из-за того, что не будет запросов в цикле.
(2)
В чем и дело. Сначало освоишься в запросах, вроде все получается. Потом на год забросишь, а как понадобится ни чего не помнишь. Простыми запросами начинаешь все решать.
(3)
Сарказм. Уважаю. Но здесь вопрос близок, "а в чем разница фроденда и бекэда". Если верстальщик занимается только версткой, от поплывет в решения какой ни будь задачи в беке.
(12)
да Господа. Забавно наблюдать что точка преткновения оказалось количество звезд.
Вместо того что бы показать свое превосходство на примере рабочего запроса, закрывающий мой вопрос. что бы понял где я опростоволосился. Вы долбите прутиком по воде.
Звезды не означают крутизну в коденге. А означает что я узнав нюанса в каком то вопросе и не сидел над ними как над златом, мое, только я знаю, ХЫХЫХЫ. А поделился с общественностью, что бы кто то если натыкнулся на данную проблему, мог ее решить.
(14)
А зачем тогда сидеть в этом разделе?
Не для того что бы если что то знаешь, поделиться решением. Или найти ответ на свою задачу путем поиска аналогичных запросов.
Вроде прикрыли лавочку фарма стартов через сообщения.
(13) не там ищешь. Тут надо или изучать, что такое запросы, как они работают, как устроена база данных и т.д., это не объяснить в рамках сообщений на форуме. Или же сделать готовое решение, что возможно, но это работа и она стоит денег, а не 0.15 манек. Я думаю, что если ты предложишь тысяч 10, то вопрос будет решен в течение нескольких часов. И это будет справедливо и правильно. А искать, кто сделает работу нахаляву - несправедливо и неправильно.
ищешь. Тут надо или изучать, что такое запросы, как они работают, как устроена база данных и т.д., это не объяснить в рамках сообщений на форуме. Или же сделать готовое решение, что возможно, но это работа и она стоит денег, а не 0.15 манек. Я думаю, что если ты предложишь тысяч 10, то вопрос будет решен в течение нескольких часов. И это будет справедливо и правильно. А искать, кто сделает работу нахаляву - несправедливо и неправильно.
Вы не правы. Не кто не спрашивает, дайте мне готовы код. Да и поправить запрос за 10к не многовато ли.
Вы дали наводку что через временные таблицы скомпоновать. Спасибо за это. Копаю, перебираю.
(21)
Спасибо, добрый человек. По твоему примеру я и объединил в один запрос обход двух цен
Код
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатуры1.Цена КАК Цена1,
| ЦеныНоменклатуры1.КатегорияЦен КАК КатегорияЦен1,
| ЦеныНоменклатуры2.Цена КАК Цена2,
| ЦеныНоменклатуры2.КатегорияЦен КАК КатегорияЦен2,
| ЦеныНоменклатуры1.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры1
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры2
| ПО ЦеныНоменклатуры1.Номенклатура = ЦеныНоменклатуры2.Номенклатура
| И (ЦеныНоменклатуры1.КатегорияЦен = &КатегорияЦен1)
| И (ЦеныНоменклатуры2.КатегорияЦен = &КатегорияЦен2)
|ГДЕ
| ЦеныНоменклатуры1.Номенклатура = &Номенклатура";
Показать полностью
но со срезом не догнал и как в таблицу поместить для общего обхода.
(31)Результат этого запроса по своей сути будет чушью, т.к. если по КатергорияЦен1 не будет данных, то и по КатегорияЦен2 так же не будет данных даже в случае их наличия в регистре.
Данный запрос так же не получает последнее значение цены и я боюсь себе представить какое количество записей он вернет
Если внимательно читать (2), то в нем запрос цен строится к таблице СрезПоследних с указанием параметров виртуальной таблицы.
(13) Точкой преткновения стало нереально огромное количество информации по работе с СКД. Причем как в свободном доступе, так и за символическую денежку. Как минимум книги "Язык запросов 1С:Предприятия" Хурсталевой и "Язык запросов 1С от зубов" Сайфутдинова с Сотниковым. Поэтому твоя попытка иронизировать про "сидеть над златом" неуместна - это расписано до уровня "объяснить на хлебушке". Если нет желания читать, то и учиться нет желания. А если нет желания учиться - что тогда хотеть от форумчан? Готового кода? Так это в фриланс и за деньги.
(23)
у каждого свой подход к изучению. Знаю много "спецов", кто и книжки прочли, и курсы, и сидят на жопе в ожидание вакансии мечты. Ни строчки кода не написали. Мне же удобнее по проектам шагать разбирая, даже если гдето вырвиглазный код но задачу выполняет. так и тут, работает, но коряво и хочу понять где касяк.
Да и когда СКД в принцепи в текучке не используешь, как то тонкости глубже знать не обязательно. Если что то нужно сделать, мне проще на примере похожего разобрать. Почему и все старты сжигаются. рад бы и 10 стартов отдать тому кто поможет да нема уже.
(26) Не знаю что там у тебя за «спецы» и что за сгоревшие старты (мир пеплу их), но базу тебе нужно подтянуть обязательно. Первый запрос с номенклатурой тебе зачем? Ты получаешь ВСЮ номенклатуру. Если ее 40000 то и строк будет 40000. Если ее полмиллиона, то и строк будет полмиллиона. Если тебе нужны остатки с определенными параметрами (Контрагент, Склад, ВидНоменклытуры, ЛюбоеДругоеБуйствоФантазии), то первой временной таблицей у тебя должна быть таблицей остатков. И уже к ней тебе нужно цеплять все остальное. Осталось два коробка спичек — ок, ты работаешь с этими двумя коробками, а не кладешь сервер изобилием номенклатуры Ашана.
(45)
заполнить отдельную табличную часть всей номенклатуры, для дальнейший отдельных манипуляций по условиям. Сразу по условиям заполнять не вариант, так как корректируется условия по ходу изучения всего списка.
все условия на измерения регистров нужно прописывать в параметрах виртуальных таблиц.
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиНоменклатурыОстатки.Фирма КАК Фирма,
| ОстаткиНоменклатурыОстатки.Склад КАК Склад,
| ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
| ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| ,
| Номенклатура = &Номенклатура
| И Склад = &Склад
| И Фирма = &Фирма) КАК ОстаткиНоменклатурыОстатки";
Показать
что бы получить последнюю цену, нужно использовать СрезПоследних
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатуры.Цена КАК Цена,
| ЦеныНоменклатуры.КатегорияЦен КАК КатегорияЦен,
| ЦеныНоменклатуры.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(
| ,
| Номенклатура = &Номенклатура
| И КатегорияЦен = &КатегорияЦен) КАК ЦеныНоменклатуры";
(8) прикол в том что срез не отрабатывает и пускает в замкнутый цикл пока не сбросишь, даже в отладке первый результат обхода не дает
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатуры1.Цена КАК Цена1,
| ЦеныНоменклатуры1.КатегорияЦен КАК КатегорияЦен1,
| ЦеныНоменклатуры2.Цена КАК Цена2,
| ЦеныНоменклатуры2.КатегорияЦен КАК КатегорияЦен2,
| ЦеныНоменклатуры1.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатуры1
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатуры2
| ПО ЦеныНоменклатуры1.Номенклатура = ЦеныНоменклатуры2.Номенклатура
| И (ЦеныНоменклатуры1.КатегорияЦен = &КатегорияЦен1)
| И (ЦеныНоменклатуры2.КатегорияЦен = &КатегорияЦен2)
|ГДЕ
| ЦеныНоменклатуры1.Номенклатура = &Номенклатура";
Запрос.Текст = "ВЫБРАТЬ
| ЦеныНоменклатуры1.Цена КАК Цена1,
| ЦеныНоменклатуры1.КатегорияЦен КАК КатегорияЦен1,
| ЦеныНоменклатуры2.Цена КАК Цена2,
| ЦеныНоменклатуры2.КатегорияЦен КАК КатегорияЦен2,
| ЦеныНоменклатуры1.Номенклатура КАК Номенклатура
|ИЗ
| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры1
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры2
| ПО ЦеныНоменклатуры1.Номенклатура = ЦеныНоменклатуры2.Номенклатура
| И (ЦеныНоменклатуры1.КатегорияЦен = &КатегорияЦен1)
| И (ЦеныНоменклатуры2.КатегорияЦен = &КатегорияЦен2)
|ГДЕ
| ЦеныНоменклатуры1.Номенклатура = &Номенклатура";
Показать
если период использовать тоже в цикл уходит. И фиг знает толь Далион закоцана база, толи хз
(49) Можно сделать публикацию о том что в феврале не может быть 30 дней, завести пару десятков твинков-однодневок, в каждом добавить работу в избранное... Готово, вы - звезда!
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Родитель КАК Родитель,
| Номенклатура.Код КАК Код,
| Номенклатура.БазоваяЕдиницаИзмерения КАК БазоваяЕдиницаИзмерения
|ПОМЕСТИТЬ Номенклатура
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ЛОЖЬ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЦеныСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныСрезПоследних.Цена КАК Цена
|ПОМЕСТИТЬ ЗакупочныеЦены
|ИЗ
| РегистрСведений.Цены.СрезПоследних(, ТипЦен = &ТипЦенЗакупочные) КАК ЦеныСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЦеныСрезПоследних.Номенклатура КАК Номенклатура,
| ЦеныСрезПоследних.Цена КАК Цена
|ПОМЕСТИТЬ РозничныеЦены
|ИЗ
| РегистрСведений.Цены.СрезПоследних(, ТипЦен = &ТипЦенРозничные) КАК ЦеныСрезПоследних
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ЭлементыНоменклатуры.Ссылка КАК Ссылка,
| ЭлементыНоменклатуры.Родитель КАК Родитель,
| ЭлементыНоменклатуры.Код КАК Код,
| ЭлементыНоменклатуры.БазоваяЕдиницаИзмерения КАК БазоваяЕдиницаИзмерения,
| ЕСТЬNULL(ЗакупочныеЦены.Цена, 0) КАК ЗакупочнаяЦена,
| ЕСТЬNULL(РозничныеЦены.Цена, 0) КАК РозничнаяЦена
|ИЗ
| Номенклатура КАК ЭлементыНоменклатуры
| ЛЕВОЕ СОЕДИНЕНИЕ ЗакупочныеЦены КАК ЗакупочныеЦены
| ПО ЭлементыНоменклатуры.Ссылка = ЗакупочныеЦены.Номенклатура
| ЛЕВОЕ СОЕДИНЕНИЕ РозничныеЦены КАК РозничныеЦены
| ПО ЭлементыНоменклатуры.Ссылка = РозничныеЦены.Номенклатура
|";
Запрос.Параметры.Вставить("ТипЦенЗакупочные", ТипЦенЗакупочные); // <Типы цен>[], Справочники.ТипыЦен.ПустаяСсылка();
Запрос.Параметры.Вставить("ТипЦенРозничные", ТипЦенРозничные); // <Типы цен>[], Справочники.ТипыЦен.ПустаяСсылка();
Показать
Но не забывайте, что в регистре могут быть и другие измерения (Подразделение, Организация, Проект...) Я не знаком с Далионом тесно.
Если подумать, то сможете по аналогии добавить временную таблицу остатков, ну или несколько таблиц, если по разным складам надо.
Ну и группировки можно применять...
(27) Ну и к вопросу о параметрах.
Ещё раз повторю, в регистре могут быть и другие измерения, кроме номенклатуры и типа цен.
Это нужно учесть, и передавать и их в параметрах.
Или нужно группировать результат и получать Минимальное / Максимальное значение цены (ну или сумму для остатка, если несколько складов например и несколько организаций...)
Тут нужно подробно вникнуть в структуру и в задачу.