Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 мар 2024, 13:10

ТиС, прямой запрос к регистру ПартииНаличие - Help me!

Автор danish, 11 мая 2018, 11:22

0 Пользователей и 1 гость просматривают эту тему.

danish

Доброго времени суток!
Пытаюсь ускорить работу отчёта, в котором есть запрос к оборотам и остаткам по регистру ПартииНаличие (Регистр остатков)
Версия БД - файловая.
Исходный запрос:

    ТекстЗапроса = "//{{ЗАПРОС(Приходы)
|Период с ДатаНачала по ДатаКонца;
|Количество = Регистр.ПартииНаличие.Количество;
|Номенклатура = Регистр.ПартииНаличие.Номенклатура;
|Функция КоличествоПриход = Приход(Количество);
|Функция КоличествоКонОст = КонОст(Количество);
|Группировка Номенклатура без групп;
|Условие(Номенклатура = Ном);
|"//}}ЗАПРОС
    ;

Перерыл весь тырнет, в итоге понял, что вариант с виртуальными таблицами на файловой БД не прокатывает. В итоге получился вот такой код:

ТекстЗапроса = "
|SELECT
| Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
| SUM(Рег.КоличествоНачОст) AS КоличествоНачОст,
| SUM(Рег.КоличествоПриход) AS КоличествоПриход,
| SUM(Рег.КоличествоРасход) AS КоличествоРасход,
| SUM(Рег.КоличествоНачОст) + SUM(Рег.КоличествоПриход) - SUM(Рег.КоличествоРасход) AS КоличествоКонОст
|FROM
| (SELECT
| $Р.Номенклатура AS Номенклатура,
| $Р.Количество AS КоличествоНачОст,
| $0 AS КоличествоПриход,
| $0 AS КоличествоРасход
| FROM
| РегистрИтоги.ПартииНаличие As Р
| WHERE
| (period = :ПредМесяц~~)
| AND($Р.Номенклатура=:Ном)
|
| UNION ALL
|
| SELECT
| $Р1.Номенклатура AS Номенклатура,
| $Р1.Количество * (1 - Р1.debkred * 2) AS КоличествоНачОст,
| $0 AS КоличествоПриход,
| $0 AS КоличествоРасход
| FROM
| Регистр.ПартииНаличие AS Р1
| INNER JOIN 1sjourn As jr ON (Р1.iddoc = jr.iddoc)
| AND (jr.date BETWEEN :НачалоМесяца~~ AND :ПредДата~~)
| AND ($ФлагРегистра.ПартииНаличие = 1)
| WHERE
| ($Р1.Номенклатура=:Ном)
|
| UNION ALL
|
| SELECT
| $Р2.Номенклатура AS Номенклатура,
| $0 AS КоличествоНачОст,
| (1-Р2.debkred)* $Р2.Количество AS КоличествоПриход,
| (Р2.debkred) * $Р2.Количество AS КоличествоРасход
| FROM
| Регистр.ПартииНаличие AS Р2
| INNER JOIN 1sjourn as jr ON (Р2.iddoc = jr.iddoc)
| AND (jr.date BETWEEN :НачДата~~ AND :КонДата~~)
| AND ($ФлагРегистра.ПартииНаличие = 1)
| WHERE
| ($Р2.Номенклатура=:Ном)
| ) Рег
|GROUP BY
| Номенклатура"
;

Но почему-то при попытке выполнить запрос возникает ошибка: unrecognized token: "1sjourn"
Вроде, всё есть, что нужно, таблица журнала именно с таким именем...
Полный код процедуры:

Функция Остаток(Ном, Надо, ДатаД)
ДатаНачала = Мин(ДатаД+1,КонДата);
ДатаКонца = КонДата;
ТекстЗапроса = "
|SELECT
| Рег.Номенклатура as [Номенклатура $Справочник.Номенклатура],
| SUM(Рег.КоличествоНачОст) AS КоличествоНачОст,
| SUM(Рег.КоличествоПриход) AS КоличествоПриход,
| SUM(Рег.КоличествоРасход) AS КоличествоРасход,
| SUM(Рег.КоличествоНачОст) + SUM(Рег.КоличествоПриход) - SUM(Рег.КоличествоРасход) AS КоличествоКонОст
|FROM
| (SELECT
| $Р.Номенклатура AS Номенклатура,
| $Р.Количество AS КоличествоНачОст,
| $0 AS КоличествоПриход,
| $0 AS КоличествоРасход
| FROM
| РегистрИтоги.ПартииНаличие As Р
| WHERE
| (period = :ПредМесяц~~)
| AND($Р.Номенклатура=:Ном)
|
| UNION ALL
|
| SELECT
| $Р1.Номенклатура AS Номенклатура,
| $Р1.Количество * (1 - Р1.debkred * 2) AS КоличествоНачОст,
| $0 AS КоличествоПриход,
| $0 AS КоличествоРасход
| FROM
| Регистр.ПартииНаличие AS Р1
| INNER JOIN 1sjourn As jr ON (Р1.iddoc = jr.iddoc)
| AND (jr.date BETWEEN :НачалоМесяца~~ AND :ПредДата~~)
| AND ($ФлагРегистра.ПартииНаличие = 1)
| WHERE
| ($Р1.Номенклатура=:Ном)
|
| UNION ALL
|
| SELECT
| $Р2.Номенклатура AS Номенклатура,
| $0 AS КоличествоНачОст,
| (1-Р2.debkred)* $Р2.Количество AS КоличествоПриход,
| (Р2.debkred) * $Р2.Количество AS КоличествоРасход
| FROM
| Регистр.ПартииНаличие AS Р2
| INNER JOIN 1sjourn as jr ON (Р2.iddoc = jr.iddoc)
| AND (jr.date BETWEEN :НачДата~~ AND :КонДата~~)
| AND ($ФлагРегистра.ПартииНаличие = 1)
| WHERE
| ($Р2.Номенклатура=:Ном)
| ) Рег
|GROUP BY
| Номенклатура"
;


RecordSet.УстановитьТекстовыйПараметр("НачалоМесяца", НачМесяца(ДатаНачала));
RecordSet.УстановитьТекстовыйПараметр("ПредМесяц", НачМесяца(ДобавитьМесяц(ДатаНачала,-1)));
RecordSet.УстановитьТекстовыйПараметр("ПредДата", ДатаНачала-1);
RecordSet.УстановитьТекстовыйПараметр("НачДата", ДатаНачала);
RecordSet.УстановитьТекстовыйПараметр("КонДата", ДатаКонца);
RecordSet.УстановитьТекстовыйПараметр("Ном", Ном);

ТабОстатков = RecordSet.Выполнить("ТаблицаЗначений", ТекстЗапроса);
//ТабОстатков.ВыбратьСтроку();
Если ТабОстатков.КоличествоСтрок() = 0 Тогда
Возврат 0;
КонецЕсли;                   
Стр = 0;
Если ТабОстатков.НайтиЗначение(Ном,Стр,"Номенклатура") = 1 Тогда
ТабОстатков.ПолучитьСтрокуПоНомеру(Стр);
Если (ТабОстатков.КоличествоПриход >= Надо) и (ТабОстатков.КоличествоКонОст >= Надо) Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
Возврат 0;
КонецФункции

Похожие темы (5)

Рейтинг@Mail.ru

Поиск