gifts2017

[ОБУЧАЛОВКА] Прямые запросы: практические примеры разработки

Опубликовал Сергей (Che) Коцюра (CheBurator) в раздел Программирование - Практика программирования

Пример прямого запроса для типовой 1С 7.7. ТиС для извлечения цен номенклатуры... тест

Осваиваю прямые запросы, многие Учителя помогают, за что им спасибо... Выкладываю примерчик запроса, возвращающего для номенклатуры цену определенного типа для определенной даты...
.

Описание задачи: в типовой конфигурации ТиС во многих местах встречается код по типу: 
.
СпрНоменклатура.ВыбратьЭлементы();
Пока СпрНоменклатура.ПолучитьЭлемент()=1
Цикл
//пропускаем группы
//пропускаем удаленные

НайденнаяЦена = "";
ЦенаЦены = 0;

Если глВернутьЦену(СпрНоменклатура.ТекущийЭлемент(),ТипЦены, ДатаЦены,ЦенаЦены,,,,НайденнаяЦена)<>0
Тогда

.
где НайденнаяЦена - ссылка на элемент справочника "Цены"
Данный код, даже если обход справочника делается не выборкой, а по результатм чорного (штатного запроса) - достаточно тяжелый (для этого надо посмотреть в код процедуры глВернутьЦену() - плохо это или хорошо - судить не будем, это - плата за универсальность...).

Совершенно четко понятно, что эффективность достигается за счет специализации, пойдем и мы по этому непростому и опасному пути. Оформим в качестве законченного участка кода решение следующей задачи: получить список номенклатуры с ценами для указанного типа цены на указанную дату.. По-человечески это звучит так, например: список товаров с закупочной ценой на сегодняшний день. Эффективный код (по сравнению с типовым вариантом) выглядит так:
.

RS = СоздатьОбъект("ODBCRecordSet");
RS.Отладка(0);

ТекстЗапроса = "
|SELECT
|--TOP 100
| СпрНоменклатура.ID AS [Номенклатура $Справочник.Номенклатура]
| , ISNULL(СпрЦены.ID,$ПустойИД) AS [НайденнаяЦена $Справочник.Цены]
| , ISNULL($ПоследнееЗначение.Цены.Цена(СпрЦены.ID, :ДатаЦен),0) AS ЦенаЦены
|FROM $Справочник.Номенклатура AS СпрНоменклатура With (NOLOCK)
|--
|LEFT JOIN
| $Справочник.Цены AS СпрЦены With (NOLOCK)
| ON (СпрЦены.ParentExt = СпрНоменклатура.ID)
| AND ($СпрЦены.ТипЦен = :ТипНужнойЦены)
|--
|WHERE (СпрНоменклатура.ISMARK = 0)
| AND ($СпрНоменклатура.НеВключатьВпрайс = 0)
| AND (СпрНоменклатура.ISFOLDER = 2)
|";

RS.УстановитьТекстовыйПараметр("ТипНужнойЦены" ,ТипНужнойЦены);
RS.УстановитьТекстовыйПараметр("ДатаЦен" ,ДатаЦен);

ТЗвыборка = СоздатьОбъект("ТаблицаЗначений");
ТЗвыборка = RS.ВыполнитьИнструкцию(ТекстЗапроса);
RS = "";
.
В результате имеем: таблицу значений, в которой содержатся следующие колонки:
"Номенклатура" - ссылка на элемент Справочник.Номенклатура (товар);
"НайденнаяЦена" - ссылка на элемент Справочник.Цены (например, для записи потом нового значения цены) ;
"ЦенаЗначение" - цена (конкретное число, цена товара)
.
Далее вышеприведенный "штатный" код заменяем на выборку по таблице значений:
.
ТЗВыборка.ВыбратьСтроки();
Пока ТЗВыборка.ПолучитСтроку()=1
Цикл
  Номенклатура = ТЗВыборка.Номенклатура;
  НайденнаяЦена = ТЗвыборка.НайденнаяЦена;
  ЦенаЦены = ТЗвыборка.ЦенаЦены;
.

Входные параметры: в переменной ТипНужнойЦены - ссылка на элемент справочника "ТипыЦен", ДатаЦен - дата получения периодического значения цены.

Из результата исключаются: группы номенклатуры, помеченные на удаление, не включаемые в прайс. Если для номенклатуры отсутствует нужный тип цен в ТЗВыборка.НайденнаяЦена - пустая ссылка.

Для работоспособности данного кода требуется загруженная ВК 1Сpp.dll (последнюю версию можно брать здесь: http://www.1cpp.ru/index.php/File:Icpp-latest.rar) и работа базы в SQL-варианте (не DBF).

Идеал специалиста широкого профиля - знает все о ниочем...

Отдельное спасибо Учителям:  leshikkam, berezdetsky, Ёпрст - за пинание меня в правильном направлении и терпеливое отношение к моим тормозам... А также и всем остальным (в основном с mista)

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Игорь Исхаков (Ish_2) 30.09.10 08:15
Прочитал.
Не понял главной идеи. Это что ?
1. Пример Упражнения по левому соединению в запросе .
2. Рекомендация пользователям таким образом обновлять цены


Если п.2 , то неплохо бы также привести сравнительный анализ запроса и стандартного цикла для изменения цен. В чем выигрыш-то и насколько ?
2. Александр Рытов (Арчибальд) 30.09.10 11:13
3. Игорь Исхаков (Ish_2) 30.09.10 11:19
(2) Пусть так. Но я, как обучающийся, должен понять зачем мне идти :
по этому непростому и опасному пути.

И что меня ждет. Какой приз ?
4. Александр Венгер (venger) 30.09.10 11:39
(3)
Какой приз?


Помимо выигрыша в быстроте выполнения на порядки, так еще и возможности скульного языка позволяют так выбрать данные, что их дальнейшая обработка практически не нужна, имеется ввиду перебор запроса или ТЗ в тех же отчетах, после его (запроса) выполнения и перед выводом, как это зачастую происходит в штатных отчетах.
5. Игорь Исхаков (Ish_2) 30.09.10 11:42
(4) Если всё так здорово , то почему этот путь "опасен" ?
6. Сергей (Che) Коцюра (CheBurator) 30.09.10 13:06
Это скорее даже не "пример выполнения левого запроса", а просто рабочий кусок вполне себе часто используемого кода. Пример: каждый день вы рассылаете прайсы своим любимым клиентам: по оптовой цене, по спеццене для представительств, по мелкооптовой и т.д. Экономия даже в этом примере составит около от 30 сек до минуты на размере справочника в 15 тыс элементов.
7. Сергей (Che) Коцюра (CheBurator) 30.09.10 13:09
(4) Путь "опасен" тем, что за все приходится платить... ;-) в данном случае - изучать скуль, т.е. расти горизонтально (повышается квалификация программиста), вместо использования штатного кода и роста вертикально (от программиста 1С до начальника Итотдела, например). Если по какой-то причине ВНЕЗАПНО базу перевели на ДБФ - прямые запросы могут не работать (а могут и работать - смотря как сделано) - т.е. потеря функциональности... ну и всякие прочие прелести, связанные с использованием сторонних ВК. Но, по крайней мере, у меня работает давно прямые запросы (покупал в свое время) и ок...
8. Сергей (Che) Коцюра (CheBurator) 30.09.10 13:13
В (4) правильно указано. Например, у меня есть некий "регламент" (под который и использовался данный кусок кода). В штатном режиме он исполнялся 15-20 минут. Путем всяческих штатных оптимизаций - перебор кода, изменение неких изначально неоптимально выбранных подходов - удалось сократить до 10 минут. С применением трех прямых запросов - удалось свести примерно к 4,5 минутам. И почти все это время занимает неоптимизируемая (пока что) запись периодики цен. В принципе, например, в моем конкретном случае - грамотному спецу по прямым запросам все используемые три прямых запроса можно свести в один большой прямой запрос. Т.е. можно еще больше ускорить... если это надо...
9. Кирилл Иконников (spock) 30.09.10 16:33
10. Сергей (Che) Коцюра (CheBurator) 30.09.10 16:48
(9) необоснованные минуса (без комментариев, описания сущности минуса) - это не есть хорошо... и более похожи на деструктивные действия. Это не только здесь, а вообще...
11. Артур Аюханов (artbear) 30.09.10 16:56
(10) Ты бы хоть как-то в статье обозначил
1) цели перехода на прямые запросы - ускорение работы 1С, например, и т.п.
2) написал, что указанный код для МС Скл
3) написал, что данный код должен выполняться при загруженной ВК 1С++
ну и т.д. и т.п. :)
12. Сергей (Che) Коцюра (CheBurator) 30.09.10 16:59
(11) угумс.. как только мне кто-то заплатит за такие описания - так сразу же.. ;-)
13. Аркадий Кучер (Abadonna) 30.09.10 17:30
Никакой этот твой запрос не прямой! А через 1cpp.
Как выглядят по настоящему прямые я тебе писал ;)
Твой, приятнее, конечно для чтения, но не совсем прямой
14. Сергей (Che) Коцюра (CheBurator) 30.09.10 17:34
прямой, прямой... на скуль уходит именно прямой запрос, в том виде как ты любишь писать, в неадаптированном виден, привязанном к абсолютным именам - которые вообщем-то могут меняться.. сегодня спр.номенклатура - это sc83, а завтра sc999.. $-)
15. Аркадий Кучер (Abadonna) 30.09.10 17:39
А также и всем остальным (в основном с mista)

А вполне приличный пример работы со скулем уж давно на ИС лежит:
Экспорт-импорт таблиц SQL средствами 1С
http://www.infostart.ru/public/14600/
16. Кирилл Иконников (spock) 30.09.10 17:40
(10)я тебе с десяток доводов могу привести...
17. Кирилл Иконников (spock) 30.09.10 17:41
+16 но на первый раз пусть будет +0, ибо сам прикладывался к твоему практическому примеру разработки.
18. Сергей (Che) Коцюра (CheBurator) 30.09.10 17:44
(16) озвучивай по существу! для уроков - будет полезно...
19. Аркадий Кучер (Abadonna) 30.09.10 17:46
(1)
Не понял главной идеи.

Чего ты там не понял? Серега НАКОНЕЦ-ТО научился писать скулевые запросы и спешит порадовать мир :D
20. Кирилл Иконников (spock) 30.09.10 17:47
(18)в новых условиях уроки становятся платные $$
21. Сергей (Che) Коцюра (CheBurator) 30.09.10 18:00
(20) ну тогда если нечего бесплатно по существу сказать - то и нечего выступать.. ;-)
22. Аркадий Кучер (Abadonna) 30.09.10 18:07
.. на скуль уходит именно прямой запрос, в том виде как ты любишь писать

Думаешь от самой 7.7 он какой-то другой приходит? Тоже прямой (в этом смысле), только не оптимальный
23. Игорь Исхаков (Ish_2) 30.09.10 18:08
(19) Ага . А я чего-то сразу насторожился.
Впрочем , с Чебура спрос другой .
24. Сергей (Che) Коцюра (CheBurator) 30.09.10 18:17
(19) это ту можно загнул, что я наконец-то научился... иду мелкими шажками... как приперло - понадобилось - приходится подымать этот пласт, а учить скуль и скулевые запросы в полном объеме - пока что не представляется целесообразным... Перелезем на 8-ку - там и будеи тогда колупаться с этими выкормышами-запросами на 8-ке... ;-)
25. Сергей (Che) Коцюра (CheBurator) 30.09.10 18:18
По прямым запросам инфы всегда мало, а особенно таких вещей, которые можно брать и использовать...
26. Аркадий Кучер (Abadonna) 30.09.10 18:19
(24) К 8-ке то пока не написали 1cpp, таки придется совсем прямые делать ;)
34. Сергей (Che) Коцюра (CheBurator) 01.10.10 00:31
.. остался один вопрос пока что как для номенклатуры получить несколько цен (с перечнями типов этих цен), т.е. получит список товаров с ценами: закупочная, оптовая, розничная.
.
делать три джойна для каждого типа цены мне качется не сильно правильным...
35. Александр Шишкин (Шёпот теней) 01.10.10 07:47
... спАсиБО Че и Абадонне ... ! ...

... примите мои искренние восхищения ... с Уважением ... вот ...

... хотелось бы "уроков" и побольше и по-любому поводу ... а если ещё наставления "старших товарищей" будут встречаться то и совсем будет поУчительно ...

... вот ...

... а если ещё "старшие товарищи" напишут сами несколько статей или опубликуют подпорку статей, уроков, ссылок, советов по данной теме - то "младшие товарищи" будут ими гордиться, восхищаться и изучать ... ну, и задавать глупые вопросы, конечно ...

... совсемВОТсовсем ...
36. Brr (brr) 01.10.10 09:16
(35) Тут есть все, и задать вопрос можно любой http://www.1cpp.ru/forum/YaBB.pl?board=query
artbear; Шёпот теней; +2 Ответить 1
37. Александр Шишкин (Шёпот теней) 01.10.10 09:28
(36) ... ресурсы есть ...

изложу мысль кратко :
1. есть много товаров - но покупаю у тех кто мне не без различен и конечно же если "я" им не безразличен ... есть ИС ! ...
2. вопрос "прямых" запросов есть вопрос пофессионализма - и поэтому в контексте не которых мнений - хочется обсуждений именно здесь ...

... вот ...


п.с. спАсиБО за ссылку ... !

...
38. Андрей М (_Z1) 02.10.10 13:40
(34) несколько типов цен и без дат для MS sql2000
1.Сделай union all
2.LEFT я бы заменил на INNER потому что зачем нам товар вообще без цен
( для таких товаров нужен другой запрос )

1 и 2 можно Свернуть либо в 1с, либо в sql через sum и group by

PS
ISNULL тоже не нужен (ИХМО) вот если ли бы ты там ставил цену -1000000 тогда да
а так вообще непонятно 0 это нет цены или значение цены = 0.

и из примера убери строку
|--TOP 100
а то очень сбивает.
39. Сергей (Che) Коцюра (CheBurator) 21.10.10 16:27
(38) по (1) - не понял.. неграмотный я еще
40. Sk0rp (Sk0rp) 18.01.11 11:32
Не учитывается валюта. Не знаю как в центральной России, а на крайнем западе цены в валюте не редкость.
41. Сергей (Che) Коцюра (CheBurator) 18.01.11 13:02
(40) да, в запросе валюту не тащу, потому как у меня - все в рублядях... и опять же: должен же "учитель" кинуть заподлянку ученикам или нет..? ;-)
42. Программулькин (Программулькин) 26.10.11 06:11
43. Татьяна (tana1257) 22.03.12 10:14
Была бы обучалка по прямым запросам с бухгалтерскими итогами... Может где-то есть???