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

Так сложилось, что приходится часто писать прямые запросы для 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 #ВременнаяТаблица )

2 Comments

  1. vandalsvq

    эммм… а чем класс «Прямой запрос» плох? ))))) (рекламируюсь немного)

    Reply
  2. vitaliy.ermolenko

    Собственно «а зачем»? Если «кодить» в режиме «блокнота» то наверное есть смысл в Вашем подходе, а если иначе — смысла нет. Openconf и все «что с ним связано» позволяют не слабо автоматизировать набор кода прямых запросов в частности, конечно есть некий дискомфорт при переключении раскладки, но это «дешевле» чем набирать код в режиме «блокнота». Имхо.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *