gifts2017

Ленивые запросы SQL (1С++) для 7.7 на русском

Опубликовал Max Kir (mismak) в раздел Программирование - Инструментарий

Так сложилось, что приходится часто писать прямые запросы для 1С 7.7 используя 1С++. И так сложилось, что я столкнулся с регулярными выражениями, и, как водится, был ошеломлен.
Пришлось написать несколько процедур для того, чтобы запросы было составлять удобнее, дабы переключение раскладки языков не сломать :)

Получилось в итоге так, что раскладку переключать вообще не требуется. Запрос набирается просто в русской раскладке :) Почти как в 1С 8.Х!

Операторы и названия таблиц, которые я пропустил, просто добавляются в функции запросПравилаЗаменыИменПолей, запросПравилаЗаменыИменТаблиц, запросПравилаЗаменыОператоров.
Строки, заключенные в кавычки, обрабатываются корректно.

Обработка сырая, буду благодарен за советы и обнаруженные баги фичи :)

пример запроса:

ВЫБРАТЬ РАЗЛИЧНЫЕ
!Журнал.(ДатаДок) ДатаДок,
Журнал.%НомерДок НомерДок,
Журнал.%ИДДок /Док Документ.РасходнаяНакладная/,
%РН.Контрагент /Контрагент Справочник.Контрагенты/
%%РН.ТипУчета ТипУчета,
Контрагенты.ТипЦен( %РН.Контрагент, !Журнал.(ДатаДок) )
ТипЦенКонтрагента,
Журнал.%Проведен Проведен

ИЗ
ДокументСтроки.РасходнаяНакладная сРН
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
%Журнал% Журнал ПО Журнал.%ИДДок = сРН.%ИДДок
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Документ.РасходнаяНакладная РН ПО РН.%ИДДок = Журнал.%ИДДок

ГДЕ
Журнал.%ДатаДок между :НачДата AND :КонДата~
И %сРН.Товар = #Товары
И %%РН.Фирма <> ПустойИД
ИЛИ лТрим(рТрим(%%ДокРН.Основание)) подобно '%\[%\]%' экран '\'


ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ ПЕРВЫЕ 100
!Журнал.(ДатаДок) ДатаДок,
Журнал.%НомерДок НомерДок,
Журнал.%ИДДок /Док Документ.ПриходнаяНакладная/,
%ПН.Контрагент /Контрагент Справочник.Контрагенты/
%%ПН.ТипУчета ТипУчета,
Контрагенты.ТипЦен( %ПН.Контрагент, !Журнал.(ДатаДок) )
ТипЦенКонтрагента,
Журнал.%Проведен Проведен

ИЗ
ДокументСтроки.ПриходнаяНакладная сПН
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
%Журнал% Журнал ПО Журнал.%ИДДок = сПН.%ИДДок
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
Документ.ПриходнаяНакладная ПН ПО ПН.%ИДДок = Журнал.%ИДДок

ГДЕ
Журнал.%ДатаДок между :НачДата AND :КонДата~
И %сПН.Товар = #Товары
И %%ПН.Фирма <> ПустойИД

************** Правила составления ленивого запроса ******************

Вместо $ можно ставить % перед псевдонимами таблиц и полей,
регистров, периодических реквизитов и спецконстант ПустойИД ил ПустойИД13:
%Справочник.Товары
вместо
$Справочник.Товары
%Товары.Цена
вместо
$Товары.Цена
%ДокПриходнаяНакладная.Контрагент
вместо
$ДокПриходнаяНакладная.Контрагент
Обращение к периодическому реквизиту:
%ПоследнееЗначение.Контрагент.Глубина(
или
ПоследнееЗначение.Контрагент.Глубина(
или просто
Контрагент.Глубина(
Вместо
$ПоследнееЗначение.Контрагент.Глубина( и так далее.

В типизации полей и в объявлении таблиц можно вовсе пропускать $ или %:
СпрТовар.ID as [Товар Справочник.Товары]
вместо
СпрТовар.ID as [Товар $Справочник.Товары]
FROM ДокПриходнаяНакладная.Контрагент
вместо
FROM $ДокПриходнаяНакладная.Контрагент

Типизация полей может быть заключена между символами
СпрТовар.ID as /Товар Справочник.Товары/
вместо
СпрТовар.ID as [Товар $Справочник.Товары]

Обращение к общим реквизитам через двойной %
пишем
%%Журнал.ТипУчета
вместо
Журнал.$ОбщийРеквизит.ТипУчета

Преобразование поля Date_Time_IDDoc в дату выглядит так:
!Журнал.(ДатаДок)
в запрос пойдет строка
CAST( Left(Журнал.Date_Time_IDDoc, 8) as DateTime )

Часто импользуемые поля, состоящие из латинских символов заменены на кириллические.
Все правила замен устанавливаются в функции запросПравилаЗаменыИменПолей()
Например, вместо
ДокРасходнаяНакладная.IDDoc
пишем
ДокРасходнаяНакладная.%ИДДок
вместо
СправочникКонтрагенты.isFolder
пишем
СправочникКонтрагенты.%ЭтоГруппа
вместо
ДокПриходнаяНакладная.Closed & 1
пишем
ДокПриходнаяНакладная.%Проведен

Вместо _1SJourn можно писать %Журнал%

Вместо and/or/not можно писать и/или/не

В условиях можно писать
Поле = #ВременнаяТаблица
вместо
Поле in ( select Val from #ВременнаяТаблица )
или
Поле <> #ВременнаяТаблица
вместо
Поле not in ( select Val from #ВременнаяТаблица )

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Ленивые запросы
.ert 55,50Kb
12.03.14
1
.ert 0.96 55,50Kb 1 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Анисков (vandalsvq) 13.03.14 09:05
эммм... а чем класс "Прямой запрос" плох? ))))) (рекламируюсь немного)
2. Виталий Ермоленко (vitaliy.ermolenko) 19.03.14 12:37
Собственно "а зачем"? Если "кодить" в режиме "блокнота" то наверное есть смысл в Вашем подходе, а если иначе - смысла нет. Openconf и все "что с ним связано" позволяют не слабо автоматизировать набор кода прямых запросов в частности, конечно есть некий дискомфорт при переключении раскладки, но это "дешевле" чем набирать код в режиме "блокнота". Имхо.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа