Покажите простой пример прямого запроса, например, по остаткам на складе
дружище не подскажешь почему не работает метод case вот запрос
select distinct
СпрКонтр.Descr as Контрагент,
СпрДог.Descr as Договор,
Sum(case when покуп.debkred =1 then Покуп.Sp2201 else -(Покуп.Sp2201) end ) as продСтоим,
Sum(Sp2203) as Себест
from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог
LEFT JOIN SC134 as СпрКонтр
ON СпрКонтр.sp125 = СпрДог.ID
ON Покуп.SP2195 = СпрДог.ID
GROUP BY Контрагент,Договор
select distinct
СпрКонтр.Descr as Контрагент,
СпрДог.Descr as Договор,
Sum(case when покуп.debkred =1 then Покуп.Sp2201 else -(Покуп.Sp2201) end ) as продСтоим,
Sum(Sp2203) as Себест
from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог
LEFT JOIN SC134 as СпрКонтр
ON СпрКонтр.sp125 = СпрДог.ID
ON Покуп.SP2195 = СпрДог.ID
GROUP BY Контрагент,Договор
По теме из базы знаний
- Опыт проведения сложных переносов данных на 1С
- Не спеша, эффективно и правильно – путь разработки. Часть 3. Практика
- ФинОфис. Контроль и управление финансами. Практика применения
- Опыт разработки ботов на 1С: от идеи до продукта, кейсы использования
- Применение 1С:Аналитики и Дата акселератора, или Как получить в 1С прозрачность и скорость обработки данных для прямого доступа и контроля руководителя
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
ИМХО, простой пример будет не показательным. Если бы был пример запроса на 1С, то можно было бы перевести его на прямой запрос и сравнить их производительность.
Вот! У меня есть монитор заявок (лежит иллюсташка
http://www.infostart.ru/projects/?id=320&ref=174)
там практически один в один типовой 1Совский тяжелый запрос.
давайте его переложим на 1С++ и я доложу результаты)
ок?
там практически один в один типовой 1Совский тяжелый запрос.
давайте его переложим на 1С++ и я доложу результаты)
ок?
Вот запрос
Код |
---|
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = "//{{ЗАПРОС(Сформировать)
|Период с ВыбДокумент по ДатаКонцаАнализа;
|Заявка = Регистр.Заявки. ЗаявкаПокупателя,
| Регистр.ЗаказыЗаявки.ЗаявкаПокупателя,
| Регистр.РезервыТМЦ. ЗаявкаПокупателя;
|ТекДок = Регистр.Заявки.ТекущийДокумент;
|Фирма = Регистр.РезервыТМЦ.Фирма,
| Регистр.ОстаткиТМЦ.Фирма,
| Регистр.Заявки. Фирма,
| Регистр.ЗаказыЗаявки.ЗаявкаПокупателя.Фирма;
|КолЗаявки = Регистр.Заявки. КоличествоРасход;
|КолЗаказа = Регистр.ЗаказыЗаявки.Количество;
|КолРезерва = Регистр.РезервыТМЦ. Количество;
|КолОстатка = Регистр.ОстаткиТМЦ. Количество;
|Номенклатура = Регистр.Заявки. Номенклатура,
| Регистр.ЗаказыЗаявки.Номенклатура,
| Регистр.РезервыТМЦ. Номенклатура,
| Регистр.ОстаткиТМЦ. Номенклатура;
|Функция ВыписанаЗаявка = Приход(КолЗаявки) Когда (Заявка в ВыбДокумент);
|Функция ОстатокНаСкладах = КонОст(КолОстатка);
|Функция ЧужиеРезервы = КонОст(КолРезерва) Когда (Заявка <> ВыбДокумент);
|Функция Зарезервировано = КонОст(КолРезерва) Когда (Заявка в ВыбДокумент);
|Функция СнятаЗаявка = Расход(КолЗаявки) Когда((Заявка в ВыбДокумент) и ((ТекДок.Вид() = ""ЗаявкаПокупателя"") или (ТекДок.Вид() = ""ОтменаЗаявок"")));
|Функция ОстатокЗаявки = КонОст(КолЗаявки) Когда (Заявка в ВыбДокумент);
|Функция ЗаказаноПоставщику = КонОст(КолЗаказа) Когда (Заявка в ВыбДокумент);
|Функция Отпущено = Расход(КолЗаявки) Когда((Заявка в ВыбДокумент) и (ТекДок.Вид() <> ""ЗаявкаПокупателя"") и (ТекДок.Вид() <> ""ОтменаЗаявок""));
|Группировка Номенклатура Без Групп;
|Условие (Номенклатура в СписокНоменклатура);
|Условие (Фирма в ФирмаЗаявки);";
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда Возврат; КонецЕсли;
Показать полностью |
Тип измерения ЗаявкаПокупателя в этих четырех регистрах какой - просто Документ или Документ.ЗаявкаПокупателя ?
Вот вроде накропал, на скорую руку. Не проверял. Требуется 1С++
Код |
---|
Запрос=СоздатьОбъект("ODBCRecordSet");
Запрос.УложитьСписокОбъектов(СписокНоменклатура, "#ВремТовары", "Номенклатура");
Запрос.УстановитьТекстовыйПараметр("ФирмаЗаявки", ФирмаЗаявки);
Запрос.УстановитьТекстовыйПараметр("ВыбДокумент", ВыбДокумент);
Запрос.УстановитьТекстовыйПараметр("ДатаКонцаАнализа", ДатаКонцаАнализа);
тз=Запрос.ВыполнитьИнструкцию(
"select
| Рез.Номенклатура [Номенклатура $Справочник.Номенклатура],
| sum(Рез.ОстатокЗаявки) [ОстатокЗаявки],
| sum(Рез.ВыписанаЗаявка) [ВыписанаЗаявка],
| sum(Рез.СнятаЗаявка) [СнятаЗаявка],
| sum(Рез.Отпущено) [Отпущено],
| sum(Рез.ОстатокНаСкладах) [ОстатокНаСкладах],
| sum(Рез.ЧужиеРезервы) [ЧужиеРезервы],
| sum(Рез.Зарезервировано) [Зарезервировано],
| sum(Рез.ЗаказаноПоставщику) [ЗаказаноПоставщику]
|from(
| select -- ОстатокЗаявки = КонОст(КолЗаявки) Когда (Заявка в ВыбДокумент)
| РегЗаявка_О.Номенклатура [Номенклатура],
| РегЗаявка_О.КоличествоРасходОстаток [ОстатокЗаявки],
| 0 [ВыписанаЗаявка],
| 0 [СнятаЗаявка],
| 0 [Отпущено],
| 0 [ОстатокНаСкладах],
| 0 [ЧужиеРезервы],
| 0 [Зарезервировано],
| 0 [ЗаказаноПоставщику]
| from $РегистрОстатки.Заявки(:ДатаКонцаАнализа~,
| inner join #ВремТовары ON Номенклатура=#ВремТовары.val,
| ЗаявкаПокупателя=:ВыбДокумент and Фирма=:ФирмаЗаявки,
| Номенклатура, КоличествоРасход) as РегЗаявка_О
| union all
| select -- ВыписанаЗаявка, СнятаЗаявка, Отпущено
| $РегЗаявка_Д.Номенклатура,
| 0,
| sum(case РегЗаявка_Д.debkred when 0 then $РегЗаявка_Д.КоличествоРасход else 0 end),
| sum(case РегЗаявка_Д.debkred when 0 then 0 else
| case when Журн.iddocdef=$ВидДокумента.ЗаявкаПокупателя or Журн.iddocdef=$ВидДокумента.ОтменаЗаявок then $РегЗаявка_Д.КоличествоРасход
| else 0
| end
| end),
| sum(case РегЗаявка_Д.debkred when 0 then 0 else
| case when Журн.iddocdef=$ВидДокумента.ЗаявкаПокупателя or Журн.iddocdef=$ВидДокумента.ОтменаЗаявок then 0
| else $РегЗаявка_Д.КоличествоРасход
| end
| end),
| 0,
| 0,
| 0,
| 0
| from $Регистр.Заявки РегЗаявка_Д inner join _1sjourn Журн on РегЗаявка_Д.iddoc=Журн.iddoc
| inner join #ВремТовары on $РегЗаявка_Д.Номенклатура=#ВремТовары.val
| where Журн.date_time_iddoc >= :ВыбДокумент~~~~ and Журн.date_time_iddoc <= :ДатаКонцаАнализа
| and $РегЗаявка_Д.ЗаявкаПокупателя=:ВыбДокумент and $РегЗаявка_Д.Фирма = :ФирмаЗаявки
| group by $РегЗаявка_Д.Номенклатура
| having
| sum(case РегЗаявка_Д.debkred when 0 then $РегЗаявка_Д.КоличествоРасход else 0 end)<>0 or
| sum(case РегЗаявка_Д.debkred when 0 then 0 else
| case when Журн.iddocdef=$ВидДокумента.ЗаявкаПокупателя or Журн.iddocdef=$ВидДокумента.ОтменаЗаявок then $РегЗаявка_Д.КоличествоРасход
| else 0
| end
| end) <> 0 or
| sum(case РегЗаявка_Д.debkred when 0 then 0 else
| case when Журн.iddocdef=$ВидДокумента.ЗаявкаПокупателя or Журн.iddocdef=$ВидДокумента.ОтменаЗаявок then 0
| else $РегЗаявка_Д.КоличествоРасход
| end
| end)<>0
| union all
| select -- ОстатокНаСкладах = КонОст(КолОстатка)
| РегОстТМЦ.Номенклатура,
| 0,
| 0,
| 0,
| 0,
| РегОстТМЦ.КоличествоОстаток,
| 0,
| 0,
| 0
| from $РегистрОстатки.ОстаткиТМЦ(:ДатаКонцаАнализа~,
| inner join #ВремТовары ON Номенклатура=#ВремТовары.val,
| Фирма=:ФирмаЗаявки,
| Номенклатура, Количество) as РегОстТМЦ
| union all
| select -- ЗаказаноПоставщику = КонОст(КолЗаказа) Когда (Заявка в ВыбДокумент)
| РегЗаказыЗаявки.Номенклатура,
| 0,
| 0,
| 0,
| 0,
| 0,
| 0,
| 0,
| РегЗаказыЗаявки.КоличествоОстаток
| from $РегистрОстатки.ЗаказыЗаявки(:ДатаКонцаАнализа~,
| inner join #ВремТовары ON Номенклатура=#ВремТовары.val,
| ЗаявкаПокупателя=:ВыбДокумент and Фирма=:ФирмаЗаявки,
| Номенклатура, Количество) as РегЗаказыЗаявки
| union all
| select -- ЧужиеРезервы = КонОст(КолРезерва) Когда (Заявка <> ВыбДокумент)
| РегРезервы1.Номенклатура,
| 0,
| 0,
| 0,
| 0,
| 0,
| РегРезервы1.КоличествоОстаток,
| 0,
| 0
| from $РегистрОстатки.РезервыТМЦ(:ДатаКонцаАнализа~,
| inner join #ВремТовары ON Номенклатура=#ВремТовары.val,
| ЗаявкаПокупателя<>:ВыбДокумент and Фирма=:ФирмаЗаявки,
| Номенклатура, КоличествоРасход) as РегРезервы1
| union all
| select -- Зарезервировано = КонОст(КолРезерва) Когда (Заявка в ВыбДокумент)
| РегРезервы2.Номенклатура,
| 0,
| 0,
| 0,
| 0,
| 0,
| 0,
| РегРезервы2.КоличествоОстаток,
| 0
| from $РегистрОстатки.РезервыТМЦ(:ДатаКонцаАнализа~,
| inner join #ВремТовары ON Номенклатура=#ВремТовары.val,
| ЗаявкаПокупателя=:ВыбДокумент and Фирма=:ФирмаЗаявки,
| Номенклатура, КоличествоРасход) as РегРезервы2
|) as Рез
|group by Рез.Номенклатура");
тз.ВыбратьСтроку();
Показать полностью |
Конечно - хорошо, погоняем... Но плохо, что только под скулем.
Придется дома скуль разворачивать - туды его в качель...
Придется дома скуль разворачивать - туды его в качель...
Ну тогда уже три :)
ДБФ в монопольном режиме - встроенные средства.
ДБВ в немонопольном - работа через OLE DB.
СКЛ - работа через ODBC.
ДБФ в монопольном режиме - встроенные средства.
ДБВ в немонопольном - работа через OLE DB.
СКЛ - работа через ODBC.
Я офигеваю от этого запроса..
ТЗСпп = Запрос.ВыполнитьИнструкцию(
{\\SERVERPC2\BAZ\COMPLEX_SQL.DIR\EXTFORMS\БВК_НОВ_БЭ_МОНИТОРЗАЯВОК1CPP.ERT(86)}: Meta name parser error: недопустимое значение параметра "$РегистрОстатки.РезервыТМЦ" (5)
Чтобы это значило?
ТЗСпп = Запрос.ВыполнитьИнструкцию(
{\\SERVERPC2\BAZ\COMPLEX_SQL.DIR\EXTFORMS\БВК_НОВ_БЭ_МОНИТОРЗАЯВОК1CPP.ERT(86)}: Meta name parser error: недопустимое значение параметра "$РегистрОстатки.РезервыТМЦ" (5)
Чтобы это значило?
Ищем кусок "as РегРезервы1", перед этим исправляем ",КоличествоРасход)" на ",Количество)"
Аналогично для "as РегРезервы2"
Аналогично для "as РегРезервы2"
Быстро пробую...
Это проскочило, зато
{\\SERVERPC2\BAZ\COMPLEX_SQL.DIR\EXTFORMS\БВК_НОВ_БЭ_МОНИТОРЗАЯВОК1CPP.ERT(86)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Фирма'.
Это проскочило, зато
{\\SERVERPC2\BAZ\COMPLEX_SQL.DIR\EXTFORMS\БВК_НОВ_БЭ_МОНИТОРЗАЯВОК1CPP.ERT(86)}: State 42S22, native 207, message [Microsoft][ODBC SQL Server Driver][SQL Server]Invalid column name 'Фирма'.
Как и обещал, привожу сравнительные цифры функционирования проги с использованием обычных запросов и варианта, переписанного на прямые запросы. Логика программы не менялась, просто 1сные запросы переписаны на прямые запросы 1С++. Итого, цифры:
-----------------------------
Обычный 1С: 629 сек
Прямой 1С++ 18 сек
-----------------------------
выигрыш по времени ~35 раз
ладно, допустим удалось удачно соптимизировать 1Сные штатные запросы и увеличить скорость их выполнения в 2 раза - но даже и тогда увеличение скорости работы ~17 раз.
Я в ауте... срочно придется совершентсоваться в прямых запросах и учить SQL...
-----------------------------
Обычный 1С: 629 сек
Прямой 1С++ 18 сек
-----------------------------
выигрыш по времени ~35 раз
ладно, допустим удалось удачно соптимизировать 1Сные штатные запросы и увеличить скорость их выполнения в 2 раза - но даже и тогда увеличение скорости работы ~17 раз.
Я в ауте... срочно придется совершентсоваться в прямых запросах и учить SQL...
Внимание! Тема сдана в архив
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот