День добрый. Помогите люди добрые. Есть две функции с запросом, требуется получить последнюю цену. Много перепробовал. Ну ни как
Функция ПолучитьСтаруюРозничнуюЦену(Номенклатура, ХарактеристикаНоменклатуры = Неопределено, Склад, ВалютаРегламентированногоУчета,
Дата = Неопределено, ЕдиницаИзмерения = Неопределено, Валюта = Неопределено, Курс = 0, Кратность = 1) Экспорт
ПолученнаяЦена = 0;
// Если дата не заполнена, возьмем рабочую дату
Если НЕ ЗначениеЗаполнено(Дата) Тогда
Дата = ОбщегоНазначения.ПолучитьРабочуюДату();
КонецЕсли;
Если Номенклатура.Услуга
Или Склад.ВидСклада <> Перечисления.ВидыСкладов.НТТ Тогда
ПолученнаяЦена = Ценообразование.ПолучитьЦенуНоменклатуры(Номенклатура, , Склад.ТипЦенРозничнойТорговли, Дата, ЕдиницаИзмерения, Валюта, Курс, Кратность);
ЕдиницаЦены = ЕдиницаИзмерения;
ВалютаЦены = Валюта;
Иначе
ТаблицаРозничныхЦен = ПолучитьОстаткиИЦеныВРознице(Номенклатура, ХарактеристикаНоменклатуры, Склад, Дата);
Если ТаблицаРозничныхЦен.Количество() = 0 Тогда // Нет розничных цен
ПолученнаяЦена = 0;
Иначе
ПолученнаяЦена = ТаблицаРозничныхЦен[0].ЦенаВРознице; // первая цена
КонецЕсли;
ЕдиницаЦены = Номенклатура.ЕдиницаХраненияОстатков;
ВалютаЦены = ВалютаРегламентированногоУчета;
КонецЕсли;
Возврат ПолученнаяЦена;
КонецФункции
Функция ПолучитьОстаткиИЦеныВРознице(Номенклатура, ХарактеристикаНоменклатуры, Склад = Неопределено, Дата = Неопределено) Экспорт
// В качетве оперативных остатков берем текущие.
ДатаОстатков = Дата;
Если Дата <> Неопределено Тогда
ДатаОстатков = ?(НачалоДня(Дата) = НачалоДня(ТекущаяДата()), Неопределено, Дата)
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", ДатаОстатков);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", ?(ХарактеристикаНоменклатуры = Неопределено,
Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(), ХарактеристикаНоменклатуры));
Запрос.Текст = "
|ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
| ОстаткиТоваровКомпанииОстатки.ЦенаВРознице
|ИЗ
| РегистрНакопления.ТоварыВНТТ.Остатки(&Дата,
| Номенклатура = &Номенклатура " +
?(НЕ ЗначениеЗаполнено(Склад),"",
"И Склад = &Склад") + "
| И ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры
| И (ЦенаВРознице > 0)) КАК ОстаткиТоваровКомпанииОстатки";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции // ПолучитьОстаткиИЦеныВРознице(
Функция ПолучитьСтаруюРозничнуюЦену(Номенклатура, ХарактеристикаНоменклатуры = Неопределено, Склад, ВалютаРегламентированногоУчета,
Дата = Неопределено, ЕдиницаИзмерения = Неопределено, Валюта = Неопределено, Курс = 0, Кратность = 1) Экспорт
ПолученнаяЦена = 0;
// Если дата не заполнена, возьмем рабочую дату
Если НЕ ЗначениеЗаполнено(Дата) Тогда
Дата = ОбщегоНазначения.ПолучитьРабочуюДату();
КонецЕсли;
Если Номенклатура.Услуга
Или Склад.ВидСклада <> Перечисления.ВидыСкладов.НТТ Тогда
ПолученнаяЦена = Ценообразование.ПолучитьЦенуНоменклатуры(Номенклатура, , Склад.ТипЦенРозничнойТорговли, Дата, ЕдиницаИзмерения, Валюта, Курс, Кратность);
ЕдиницаЦены = ЕдиницаИзмерения;
ВалютаЦены = Валюта;
Иначе
ТаблицаРозничныхЦен = ПолучитьОстаткиИЦеныВРознице(Номенклатура, ХарактеристикаНоменклатуры, Склад, Дата);
Если ТаблицаРозничныхЦен.Количество() = 0 Тогда // Нет розничных цен
ПолученнаяЦена = 0;
Иначе
ПолученнаяЦена = ТаблицаРозничныхЦен[0].ЦенаВРознице; // первая цена
КонецЕсли;
ЕдиницаЦены = Номенклатура.ЕдиницаХраненияОстатков;
ВалютаЦены = ВалютаРегламентированногоУчета;
КонецЕсли;
Возврат ПолученнаяЦена;
КонецФункции
Функция ПолучитьОстаткиИЦеныВРознице(Номенклатура, ХарактеристикаНоменклатуры, Склад = Неопределено, Дата = Неопределено) Экспорт
// В качетве оперативных остатков берем текущие.
ДатаОстатков = Дата;
Если Дата <> Неопределено Тогда
ДатаОстатков = ?(НачалоДня(Дата) = НачалоДня(ТекущаяДата()), Неопределено, Дата)
КонецЕсли;
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", ДатаОстатков);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", ?(ХарактеристикаНоменклатуры = Неопределено,
Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(), ХарактеристикаНоменклатуры));
Запрос.Текст = "
|ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
| ОстаткиТоваровКомпанииОстатки.ЦенаВРознице
|ИЗ
| РегистрНакопления.ТоварыВНТТ.Остатки(&Дата,
| Номенклатура = &Номенклатура " +
?(НЕ ЗначениеЗаполнено(Склад),"",
"И Склад = &Склад") + "
| И ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры
| И (ЦенаВРознице > 0)) КАК ОстаткиТоваровКомпанииОстатки";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции // ПолучитьОстаткиИЦеныВРознице(
По теме из базы знаний
- История оптимизации одного большого запроса средствами MSSQL Profiler и 1С
- Неоплаченные долги при распределении оплаты по правилу ФИФО одним запросом и намного быстрее, чем Вы думали
- Консоль запросов к базе Oracle для 1С, без использования специализированных программ
- Оптимизатор запроса. Часть первая
- Как читать чужой код? Часть 3. Разбор и доработка запросов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) killitch, Если так сделать, выбирается наибольшая цена за период.
(3) Поправил свой запрос, получаю первую цену за весь период
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", ДатаОстатков);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", ?(ХарактеристикаНоменклатуры = Неопределено,
Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(), ХарактеристикаНоменклатуры));
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЙ 1
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
| ОстаткиТоваровКомпанииОстатки.ЦенаВРознице
|ИЗ
| РегистрНакопления.ТоварыВНТТ.Остатки(&Дата,
| Номенклатура = &Номенклатура " +
?(НЕ ЗначениеЗаполнено(Склад),"",
"И Склад = &Склад") + "
| И ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры
| И (ЦенаВРознице > 0)) КАК ОстаткиТоваровКомпанииОстатки
|
|УПОРЯДОЧИТЬ ПО
| &Дата убыв";
(3) Поправил свой запрос, получаю первую цену за весь период
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Дата", ДатаОстатков);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", ?(ХарактеристикаНоменклатуры = Неопределено,
Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка(), ХарактеристикаНоменклатуры));
Запрос.Текст = "
|ВЫБРАТЬ ПЕРВЫЙ 1
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток,
| ОстаткиТоваровКомпанииОстатки.ЦенаВРознице
|ИЗ
| РегистрНакопления.ТоварыВНТТ.Остатки(&Дата,
| Номенклатура = &Номенклатура " +
?(НЕ ЗначениеЗаполнено(Склад),"",
"И Склад = &Склад") + "
| И ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры
| И (ЦенаВРознице > 0)) КАК ОстаткиТоваровКомпанииОстатки
|
|УПОРЯДОЧИТЬ ПО
| &Дата убыв";
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот