Консоль запросов

Консоль запросов к базе SQL, не требующая внешних компонент

Введение

Данная обработка (далее консоль) позволяет выполнять прямы запросы в среде 1С:Предприятие версии 7.7

Для удоства написания запроса в консоль встроен метапарсер, позволяющий вместо системных имен 1С (вроде SC792 и тому подобных) использовать более понятные (Справочник.Товары и т.п.). Также консоль понимает русскоязычное написание основных служебных слов языка Transact-SQL (SELECT=ВЫБРАТЬ, FROM=ИЗ и т.п.), что позволяет писать запрос на русском языке.

Для работы консоли не нужны абсолютно никакие внешние компоненты (никаких 1C++, FormEx и т.п.). Единственые необходимые условия:

  1. База данных должна быть на сервере SQL
  2. Необходимо один раз запустить 1С:Предприятие от имени администратора (локального или доменного)
  3. Заходить в базу необходимо не в монопольном режиме

Описание

Для написания запроса необходимо не только уметь писать SQL-запросы (https://msdn.microsoft.com/ru-ru/library/bb510741.aspx), но и знать структуру хранения данных в базах данных 1С версии 7.7  (http://www.script-coding.com/v77tables.html)

Ключевые слова

Язык запросов, используемый в консоли, аналогичен языку Transact-SQL. Основные слова имеют  русскоязычные аналоги:

ВЫБРАТЬ = SELECT
ИЗ = FROM
ГДЕ = WHERE
СГРУППИРОВАТЬ ПО = GROUP BY
УПОРЯДОЧИТЬ ПО = ORDER BY
КАК = AS
ПЕРВЫЕ = TOP
[ВНУТРЕННЕЕ] СОЕДИНЕНИЕ = [INNER] JOIN
ЛЕВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ = LEFT [OUTER] JOIN
ПРАВОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ = RIGHT [OUTER] JOIN
ПОЛНОЕ [ВНЕШНЕЕ] СОЕДИНЕНИЕ = FULL [OUTER] JOIN
ПЕРЕКРЕСТНОЕ СОЕДИНЕНИЕ = CROSS JOIN
ОБЪЕДИНИТЬ [ВСЕ] = UNION ALL
ВЫБОР = CASE
КОГДА = WHEN
ТОГДА = THEN
ИНАЧЕ = ELSE
КОНЕЦ = END
И = AND
ИЛИ = OR
НЕ = NOT
МИНИМУМ = MIN
МАКСИМУМ = MAX
СУММА = SUM
КОЛИЧЕСТВО = COUNT
СРЕДНЕЕ = AVG
ЕСТЬ NULL = IS NULL
ЕСТЬNULL = ISNULL
ПОДОБНО = LIKE
ВРЕГ = UPPER
НРЕГ = LOWER
СРЕД = SUBSTRING
ВЫРАЗИТЬ = CAST
ЦЕЛОЕ = INT
РЕАЛЬНОЕ = REAL
ДАТА = DATE
ДАТАВРЕМЯ = DATETIME

Имена таблиц и полей

Для удобства имена таблиц и полей могут быть заменены именами среды 1С. Символ $ вначале выражения запроса означает, что выражение необходимо преобразовать в написание SQL. 

$Журнал — таблица _1SJOURN
$Журнал.Ссылка — ID документа (IDDOC)
$Журнал.Вид — вид документа (IDDOCDEF), значения:
 — $ВидДокумента.<ИмяДокумента> — вид документа
$Журнал.ДатаВремя — позиция документа (DATE_TIME_IDDOC) в виде <Дата><Время><Ссылка> (пример ‘20240105A54AG0 2AKT’):
— Дата в формате ГГГГММДД
— Время количество секунд от начала дня * 10000, в 36-ричном формате (A54AG0 = 613260000; 61326 сек = 17:02:06)
— Ссылка документа (IDDOC)
$Журнал.Компоненты — набор компонент, по которым могут делаться движения(проводки). может состоять из нескольких(+) движений:
 — $ПроведенОперУчет
 — $ПроведенРасчет
 — $ПроведенБухУчет
 — $ПроведенПериодическиеРеквизиты
 — $ПроведенОперация
 — $ПроведенДокументОперация
$Журнал.НомерДок — Номер документа (DOCNO)
$Журнал.Проведен — набор компонент, по которым сделаны движения(проводки). значения аналогичны $Журнал.Компоненты
$Журнал.Помечен — пометка удаления документа (ISMARK), значения:
 — $Помечен
 — $НеПомечен
$Журнал.<ИмяОбщегоРеквизита> — Общий реквизит SPxxxx

$Константы — таблица константы (_1SCONST)
$Константы.Ссылка — ID константы. значения:
 — $ВидКонстанты.<ИмяКонстанты> — имя константы
$Константы.Значение — значение константы (VALUE)

$Периодические — таблица периодичесих реквизитов/констант (_1SCONST)
$Периодические.ОбъектСсылка — Ссылка на объект (OBJID). в случае периодической константы равен ‘ 0’
$Периодические.Ссылка — ID периодической константы или реквизита справочника. значения:
 — $ВидКонстанты.<ИмяКонстанты> — имя константы
 — $РеквизитСправочника.<ИмяСправочника>.<ИмяРеквизита>
$Периодические.Дата — дата значения (DATE);
$Периодические.Значение — значение периодической константы или реквизита справочника (VALUE)
$Периодические.ДокументСсылка — ссылка на документ, установивший периодическое значение (DOCID)
$Периодические.Время — количество секунд от начала дня * 10000, время установки значения (TIME)
$Периодические.НомерСтроки — номер строки документа, к которой привязано значение (LINENO_)

$Справочник.<ИмяСправочника> — таблица справочника SCxxxx
$Справочник.<ИмяСправочника>.<ИмяРеквизита> — реквизит справочника SPxxxx
$Справочник.<ИмяСправочника>.Ссылка — ID справочника
$Справочник.<ИмяСправочника>.Ссылка13 — ID справочника с указанием вида объекта. используется в реквизитах «справочник неопределенного вида»
$Справочник.<ИмяСправочника>.Код — код справочника
$Справочник.<ИмяСправочника>.Наименование — наименование справочника
$Справочник.<ИмяСправочника>.Родитель — ID родителя справочника (PARENTID)
$Справочник.<ИмяСправочника>.ЭтоПапка — признак группы справочника (ISFOLDER), значения:
 — $ЭтоПапка
 — $ЭтоЭлемент
$Справочник.<ИмяСправочника>.Помечен — пометка удаления справочника (ISMARK), значения:
 — $Помечен
 — $НеПомечен

$РегистрДвижения.<ИмяРегистра> — таблица движений регистра RAxxxx
$РегистрДвижения.<ИмяРегистра>.<ИмяРеквизита> — измерение, ресурс или реквизит регистра SPxxxx
$РегистрДвижения.<ИмяРегистра>.Ссылка — ID документа, сделавшего движение (IDDOC)
$РегистрДвижения.<ИмяРегистра>.Вид — вид документа, сделавшего движение (IDDOCDEF), значения:
 — $ВидДокумента.<ИмяДокумента> — вид документа
$РегистрДвижения.<ИмяРегистра>.ДатаВремя — позиция документа (DATE_TIME_IDDOC) в виде <Дата><Время><Ссылка> (пример ‘20240105A54AG0 2AKT’):
— Дата в формате ГГГГММДД
— Время количество секунд от начала дня * 10000, в 36-ричном формате (A54AG0 = 613260000; 61326 сек = 17:02:06)
— Ссылка документа (IDDOC)
$РегистрДвижения.<ИмяРегистра>.НомерСтроки — номер строки документа, к которой привязано движение (LINENO_)
$РегистрДвижения.<ИмяРегистра>.ПриходРасход — признак прихода или расхода движения (DEBKRED), значения:
 — $Приход
 — $Расход
$РегистрДвижения.<ИмяРегистра>.НомерДвижения — порядковый номер движения (ACTNO)

$РегистрИтоги.<ИмяРегистра> — таблица итогов регистра RGxxxx
$РегистрИтоги.<ИмяРегистра>.Период — период итогов регистра (PERIOD). Итоги хранятся на конец периода или на ТА.
Таким образом, итоги на начала апреля 2024 хранятся на дату 01.03.2024
$РегистрИтоги.<ИмяРегистра>.<ИмяРеквизита> — измерение, ресурс или реквизит регистра SPxxxx

$Документ.<ИмяДокумента> — таблица шапки документа DHxxxx
$Документ.<ИмяДокумента>.Ссылка — ID документа (IDDOC)
$Документ.<ИмяДокумента>.Ссылка13 — ID документа с указанием вида объекта. используется в реквизитах «документ неопределенного вида»
$Документ.<ИмяДокумента>.<ИмяРеквизита> — реквизит(общий реквизит) шапки документа DHxxxx
$ТабличнаяЧасть.<ИмяДокумента> — таблица табличной части документа DTxxxx
$ТабличнаяЧасть.<ИмяДокумента>.Ссылка — ID документа (IDDOC)
$ТабличнаяЧасть.<ИмяДокумента>.НомерСтроки — номер строки документа (LINENO_)
$ТабличнаяЧасть.<ИмяДокумента>.<ИмяРеквизита> — реквизит табличной части документа DTxxxx

$ЖурналРасчетов.<ИмяСправочника> — таблица журнала расчетов CJxxxx
$ЖурналРасчетов.<ИмяСправочника>.<ИмяРеквизита> — реквизит журнала расчетов SPxxxx

$Перечисление.<ИмяПеречисления>.<ЗначениеПеречисления> — значение перечисления

Пример запроса консоли:

ВЫБРАТЬ
    $Товары.Код КодТовара
    ,$Товары.Наименование НаименованиеТовара
ИЗ
    $Справочник.Товары Товары
ГДЕ
    НЕ $Товары.Помечен = $Помечен
УПОРЯДОЧИТЬ ПО
    НаименованиеТовара

преобразуется в SQL-запрос:

SELECT
    Товары.CODE КодТовара
    ,Товары.DESCR НаименованиеТовара
FROM
    BASE1C.dbo.SC2943 Товары
WHERE
    NOT Товары.ISMARK = 1
ORDER BY
    НаименованиеТовара

Заключение

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

Код консоли полностью открытый. Автор не против использования любых программных данных консоли в коммерческих целях кем бы то ни было, но с указанием ссылки на автора данной консоли и авторов, упомянутых в разделе Благодарности (см. ниже).

Благодарности

Спасибо разработчикам в среде 1С, чьими стараниями программа 1С становится более доступной для понимания и более удобной для разработки.

Спасибо Александру Маляеву
e-mail: maljaev@mail.ru
ICQ: 275009000

Спасибо авторам сайта http://www.script-coding.com/

7 Comments

  1. Franco

    +, однозначно. Такую бы для 8.3

    Reply
  2. Gvozdod

    (1) Franco, чтобы из 8.3 подключаться к 7.7? Есть такие планы

    Reply
  3. 1cmod

    (0) Типа запрос по АДО идёт? Провайдер, какой должен быть ?

    + типизации естественно нет, на выходе с запроса, так ?

    Reply
  4. Gvozdod

    (3) да, «ADODB.Connection». Провайдер sqloledb. Типизацию можно сделать, просто ваял для выгрузки в другую базу и для загрузки, подключаясь из другой базы. А там типизация — только лишние тормоза.

    Но, фича нужная, да. Добавлю в ближайшее время

    Reply
  5. 1cmod

    Имена табличек — парсинг DDS?

    Reply
  6. 1cmod

    Ну и не вижу, есть ли $ВидСправочника и Как работаешь с значениями неопределенного Типа.

    Reply
  7. Gvozdod

    (5) нет. В DDS недостаточно информации для разбора метаданных.

    (6) $ВидСправочника есть, используется для реквизитов типа справочник неопределенного вида. Добавлю в описание позже.

    С неопределенными ещё не делал

    Reply

Leave a Comment

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