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

25.10.11

Разработка - Запросы

Пример прямого запроса для типовой 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)

См. также

Микро консоль для запросов к MySQL базе из 1С: Предприятие 7.7

Инструментарий разработчика Запросы Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Обработка, позволяющая выполнять запросы к базе, лежащей в MySQL, для 1С:Предприятие 7.7.

10.08.2022    2936    4    crocolo    0    

2

.Net в 1С. Асинхронные HTTP запросы, отправка Post нескольких файлов multipart/form-data, сжатие трафика с использованием gzip, deflate, удобный парсинг сайтов и т.д.

Запросы Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

Очень часто нужно при работе с HTTP сервисами или сайтами использовать Асинхронные HTTP запросы, отправку на сервер нескольких файлов, использование сжатия трафика. Эта статья про то, как этого легко добиться.

09.03.2016    37661    Serginio    22    

44

Универсальный способ сравнения таблиц

Универсальные функции Запросы Платформа 1С v7.7 Платформа 1С v8.3 Бесплатно (free)

На эту тему уже есть статьи, но этот способ нигде не описан. Хотя я его использую с тех пор, как занимаюсь программированием. Его преимущество в простоте и универсальности: можно применять на 1С, SQL, а также в любом другом языке программирования.

05.07.2015    21652    json    3    

22

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

Запросы Платформа 1С v7.7 Конфигурации 1cv7 Абонемент ($m)

Пример получения остатков по складу по запросу по почте из программы 1С 7.7. Для получения остатков необходимо пользователю с любого почтовика (с любого "мыла") отправить текст сообщения GiveMyStockBalance_ForAnalize на почтовый адрес определенный в Константа.СерверПолучения. Программа выдаст остатки (можно переписать функцию для выдачи любых данных) в формате xls на почту указанную в константе Константа.СерверОтправки. Программа может быть полезна в тех организациях где трудно или невозможно осуществить прямой доступ к 1С сотрудников для просмотра необходимых данных. Также можно организовать некий почтамт - запрос для клиентов - при посылке определенного логина клиентом на его почту будет автоматически выслана информация, например, акт сверки с клиентов, или процент выполнения его заказа и т.д.

3 стартмани

25.03.2014    25149    5    protexprotex    3    

5

Реализация условий в прямых запросах к журналу расчета.

Зарплата Запросы Расчет 7.7 1С:Зарплата и кадры 7.7 Абонемент ($m)

Обзор методов реализации условий и функций с условиями в обращениях к журналу расчетов при помощи прямого запроса.

1 стартмани

06.12.2012    14086    nicotin    5    

9

Универсальный отчет - Конструктор запросов для 1С 7.7

Запросы Платформа 1С v7.7 Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 Конфигурации 1cv7 Абонемент ($m)

Универсальный отчет для конфигураций на платформе 1С 7.7. Умеет обращатся к справочникам, документам, регистрам и журналам расчетов. Удобен для быстрого получения каких либо данных, которые можно получить посредствам запроса. Предусмотренна возможность сохранения настроек.

1 стартмани

14.04.2012    33861    303    set2333    16    

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


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

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


Помимо выигрыша в быстроте выполнения на порядки, так еще и возможности скульного языка позволяют так выбрать данные, что их дальнейшая обработка практически не нужна, имеется ввиду перебор запроса или ТЗ в тех же отчетах, после его (запроса) выполнения и перед выводом, как это зачастую происходит в штатных отчетах.
5. Ish_2 1104 30.09.10 11:42 Сейчас в теме
(4) Если всё так здорово , то почему этот путь "опасен" ?
7. CheBurator 3119 30.09.10 13:09 Сейчас в теме
(4) Путь "опасен" тем, что за все приходится платить... ;-) в данном случае - изучать скуль, т.е. расти горизонтально (повышается квалификация программиста), вместо использования штатного кода и роста вертикально (от программиста 1С до начальника Итотдела, например). Если по какой-то причине ВНЕЗАПНО базу перевели на ДБФ - прямые запросы могут не работать (а могут и работать - смотря как сделано) - т.е. потеря функциональности... ну и всякие прочие прелести, связанные с использованием сторонних ВК. Но, по крайней мере, у меня работает давно прямые запросы (покупал в свое время) и ок...
8. CheBurator 3119 30.09.10 13:13 Сейчас в теме
В (4) правильно указано. Например, у меня есть некий "регламент" (под который и использовался данный кусок кода). В штатном режиме он исполнялся 15-20 минут. Путем всяческих штатных оптимизаций - перебор кода, изменение неких изначально неоптимально выбранных подходов - удалось сократить до 10 минут. С применением трех прямых запросов - удалось свести примерно к 4,5 минутам. И почти все это время занимает неоптимизируемая (пока что) запись периодики цен. В принципе, например, в моем конкретном случае - грамотному спецу по прямым запросам все используемые три прямых запроса можно свести в один большой прямой запрос. Т.е. можно еще больше ускорить... если это надо...
19. Abadonna 3958 30.09.10 17:46 Сейчас в теме
(1)
Не понял главной идеи.

Чего ты там не понял? Серега НАКОНЕЦ-ТО научился писать скулевые запросы и спешит порадовать мир :D
23. Ish_2 1104 30.09.10 18:08 Сейчас в теме
(19) Ага . А я чего-то сразу насторожился.
Впрочем , с Чебура спрос другой .
24. CheBurator 3119 30.09.10 18:17 Сейчас в теме
(19) это ту можно загнул, что я наконец-то научился... иду мелкими шажками... как приперло - понадобилось - приходится подымать этот пласт, а учить скуль и скулевые запросы в полном объеме - пока что не представляется целесообразным... Перелезем на 8-ку - там и будеи тогда колупаться с этими выкормышами-запросами на 8-ке... ;-)
26. Abadonna 3958 30.09.10 18:19 Сейчас в теме
(24) К 8-ке то пока не написали 1cpp, таки придется совсем прямые делать ;)
6. CheBurator 3119 30.09.10 13:06 Сейчас в теме
Это скорее даже не "пример выполнения левого запроса", а просто рабочий кусок вполне себе часто используемого кода. Пример: каждый день вы рассылаете прайсы своим любимым клиентам: по оптовой цене, по спеццене для представительств, по мелкооптовой и т.д. Экономия даже в этом примере составит около от 30 сек до минуты на размере справочника в 15 тыс элементов.
9. spock 601 30.09.10 16:33 Сейчас в теме
минус влепить чтоли :)
10. CheBurator 3119 30.09.10 16:48 Сейчас в теме
(9) необоснованные минуса (без комментариев, описания сущности минуса) - это не есть хорошо... и более похожи на деструктивные действия. Это не только здесь, а вообще...
11. artbear 1448 30.09.10 16:56 Сейчас в теме
(10) Ты бы хоть как-то в статье обозначил
1) цели перехода на прямые запросы - ускорение работы 1С, например, и т.п.
2) написал, что указанный код для МС Скл
3) написал, что данный код должен выполняться при загруженной ВК 1С++
ну и т.д. и т.п. :)
12. CheBurator 3119 30.09.10 16:59 Сейчас в теме
(11) угумс.. как только мне кто-то заплатит за такие описания - так сразу же.. ;-)
16. spock 601 30.09.10 17:40 Сейчас в теме
(10)я тебе с десяток доводов могу привести...
18. CheBurator 3119 30.09.10 17:44 Сейчас в теме
(16) озвучивай по существу! для уроков - будет полезно...
20. spock 601 30.09.10 17:47 Сейчас в теме
(18)в новых условиях уроки становятся платные $$
21. CheBurator 3119 30.09.10 18:00 Сейчас в теме
(20) ну тогда если нечего бесплатно по существу сказать - то и нечего выступать.. ;-)
27. пользователь 30.09.10 18:20
Сообщение было скрыто модератором.
...
28. пользователь 30.09.10 18:29
Сообщение было скрыто модератором.
...
30. пользователь 30.09.10 18:33
Сообщение было скрыто модератором.
...
31. пользователь 30.09.10 18:37
Сообщение было скрыто модератором.
...
33. пользователь 30.09.10 18:44
Сообщение было скрыто модератором.
...
29. пользователь 30.09.10 18:32
Сообщение было скрыто модератором.
...
13. Abadonna 3958 30.09.10 17:30 Сейчас в теме
Никакой этот твой запрос не прямой! А через 1cpp.
Как выглядят по настоящему прямые я тебе писал ;)
Твой, приятнее, конечно для чтения, но не совсем прямой
14. CheBurator 3119 30.09.10 17:34 Сейчас в теме
прямой, прямой... на скуль уходит именно прямой запрос, в том виде как ты любишь писать, в неадаптированном виден, привязанном к абсолютным именам - которые вообщем-то могут меняться.. сегодня спр.номенклатура - это sc83, а завтра sc999.. $-)
15. Abadonna 3958 30.09.10 17:39 Сейчас в теме
А также и всем остальным (в основном с mista)

А вполне приличный пример работы со скулем уж давно на ИС лежит:
Экспорт-импорт таблиц SQL средствами 1С
http://www.infostart.ru/public/14600/
17. spock 601 30.09.10 17:41 Сейчас в теме
+16 но на первый раз пусть будет +0, ибо сам прикладывался к твоему практическому примеру разработки.
22. Abadonna 3958 30.09.10 18:07 Сейчас в теме
.. на скуль уходит именно прямой запрос, в том виде как ты любишь писать

Думаешь от самой 7.7 он какой-то другой приходит? Тоже прямой (в этом смысле), только не оптимальный
25. CheBurator 3119 30.09.10 18:18 Сейчас в теме
По прямым запросам инфы всегда мало, а особенно таких вещей, которые можно брать и использовать...
32. пользователь 30.09.10 18:39
Сообщение было скрыто модератором.
...
34. CheBurator 3119 01.10.10 00:31 Сейчас в теме
.. остался один вопрос пока что как для номенклатуры получить несколько цен (с перечнями типов этих цен), т.е. получит список товаров с ценами: закупочная, оптовая, розничная.
.
делать три джойна для каждого типа цены мне качется не сильно правильным...
38. _Z1 38 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. CheBurator 3119 21.10.10 16:27 Сейчас в теме
(38) по (1) - не понял.. неграмотный я еще
35. Шёпот теней 1779 01.10.10 07:47 Сейчас в теме
... спАсиБО Че и Абадонне ... ! ...

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

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

... вот ...

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

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

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

... вот ...


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

...
40. Sk0rp 119 18.01.11 11:32 Сейчас в теме
Не учитывается валюта. Не знаю как в центральной России, а на крайнем западе цены в валюте не редкость.
41. CheBurator 3119 18.01.11 13:02 Сейчас в теме
(40) да, в запросе валюту не тащу, потому как у меня - все в рублядях... и опять же: должен же "учитель" кинуть заподлянку ученикам или нет..? ;-)
42. Программулькин 301 26.10.11 06:11 Сейчас в теме
43. tana1257 2 22.03.12 10:14 Сейчас в теме
Была бы обучалка по прямым запросам с бухгалтерскими итогами... Может где-то есть???
Оставьте свое сообщение