gifts2017

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

Опубликовал Сергей Шахов (Gvozdod) в раздел Программирование - Инструментарий

Консоль запросов к базе 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) в виде <Дата><Время><Ссылка> (пример '20150105A54AG0 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) в виде <Дата><Время><Ссылка> (пример '20150105A54AG0 2AKT'):
- Дата в формате ГГГГММДД
- Время количество секунд от начала дня * 10000, в 36-ричном формате (A54AG0 = 613260000; 61326 сек = 17:02:06)
- Ссылка документа (IDDOC)
$РегистрДвижения.<ИмяРегистра>.НомерСтроки - номер строки документа, к которой привязано движение (LINENO_)
$РегистрДвижения.<ИмяРегистра>.ПриходРасход - признак прихода или расхода движения (DEBKRED), значения:
 - $Приход
 - $Расход
$РегистрДвижения.<ИмяРегистра>.НомерДвижения - порядковый номер движения (ACTNO)

$РегистрИтоги.<ИмяРегистра> - таблица итогов регистра RGxxxx
$РегистрИтоги.<ИмяРегистра>.Период - период итогов регистра (PERIOD). Итоги хранятся на конец периода или на ТА.
Таким образом, итоги на начала апреля 2015 хранятся на дату 01.03.2015
$РегистрИтоги.<ИмяРегистра>.<ИмяРеквизита> - измерение, ресурс или реквизит регистра 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/

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

Наименование Файл Версия Размер
Консоль запроса 17
.ert 227,00Kb
29.04.15
17
.ert 1504291554 227,00Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Франко Деллиани (Franco) 30.04.15 12:09
+, однозначно. Такую бы для 8.3
2. Сергей Шахов (Gvozdod) 30.04.15 13:05
(1) Franco, чтобы из 8.3 подключаться к 7.7? Есть такие планы
3. ~ ~ (1cmod) 07.05.15 11:57
(0) Типа запрос по АДО идёт? Провайдер, какой должен быть ?
+ типизации естественно нет, на выходе с запроса, так ?

4. Сергей Шахов (Gvozdod) 08.05.15 06:25
(3) да, "ADODB.Connection". Провайдер sqloledb. Типизацию можно сделать, просто ваял для выгрузки в другую базу и для загрузки, подключаясь из другой базы. А там типизация - только лишние тормоза.

Но, фича нужная, да. Добавлю в ближайшее время
5. ~ ~ (1cmod) 08.05.15 08:56
Имена табличек - парсинг DDS?
6. ~ ~ (1cmod) 08.05.15 08:58
Ну и не вижу, есть ли $ВидСправочника и Как работаешь с значениями неопределенного Типа.
7. Сергей Шахов (Gvozdod) 12.05.15 08:31
(5) нет. В DDS недостаточно информации для разбора метаданных.
(6) $ВидСправочника есть, используется для реквизитов типа справочник неопределенного вида. Добавлю в описание позже.
С неопределенными ещё не делал
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа