Введение
Данная обработка (далее консоль) позволяет выполнять прямы запросы в среде 1С:Предприятие версии 7.7
Для удоства написания запроса в консоль встроен метапарсер, позволяющий вместо системных имен 1С (вроде SC792 и тому подобных) использовать более понятные (Справочник.Товары и т.п.). Также консоль понимает русскоязычное написание основных служебных слов языка Transact-SQL (SELECT=ВЫБРАТЬ, FROM=ИЗ и т.п.), что позволяет писать запрос на русском языке.
Для работы консоли не нужны абсолютно никакие внешние компоненты (никаких 1C++, FormEx и т.п.). Единственые необходимые условия:
- База данных должна быть на сервере SQL
- Необходимо один раз запустить 1С:Предприятие от имени администратора (локального или доменного)
- Заходить в базу необходимо не в монопольном режиме
Описание
Для написания запроса необходимо не только уметь писать 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/
+, однозначно. Такую бы для 8.3
(1) Franco, чтобы из 8.3 подключаться к 7.7? Есть такие планы
(0) Типа запрос по АДО идёт? Провайдер, какой должен быть ?
+ типизации естественно нет, на выходе с запроса, так ?
(3) да, «ADODB.Connection». Провайдер sqloledb. Типизацию можно сделать, просто ваял для выгрузки в другую базу и для загрузки, подключаясь из другой базы. А там типизация — только лишние тормоза.
Но, фича нужная, да. Добавлю в ближайшее время
Имена табличек — парсинг DDS?
Ну и не вижу, есть ли $ВидСправочника и Как работаешь с значениями неопределенного Типа.
(5) нет. В DDS недостаточно информации для разбора метаданных.
(6) $ВидСправочника есть, используется для реквизитов типа справочник неопределенного вида. Добавлю в описание позже.
С неопределенными ещё не делал