sql1cv8

package module
v0.0.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 16, 2021 License: MIT Imports: 13 Imported by: 0

README

sql1cv8

tag go version godoc go report build codecov

Описание

Модуль для преобразования метаданных 1Cv8 в объекты базы данных в запросах.

Получение сопоставления метаданных и объектов базы данных берётся напрямую из базы из служебных таблиц. Работает только с базами данных SQL Server.

Для работы с базой данных используется драйвер от denisenkom, так что смотрите Connection Parameters and DSN для правильного написания строки подключения.

Для написания использовалась официальная документация:

Установка

Ничем не отличается от установки других модулей

go get -u github.com/mopo3ilo/sql1cv8

Использование

Описание модуля

Модуль экспортирует достаточно мало типов и методов. Их описание можно посмотреть как в самом коде, так и на pkg.go.dev

Могу дать только одну рекомендацию: желательно использовать метод LoadNewer вместо LoadFromDB, т.к. загрузка метаданных из базы затратна. Рекомендуемый метод сравнивает версию метаданных в файле и в базе данных, и обновляет файл только в том случае, если объекты были изменены.

Пример работы с модулем
package main

import (
  "fmt"
  "github.com/mopo3ilo/sql1cv8"
)

const (
  connectionString string = "sqlserver://..."
  metadataFileName string = "metadata.json"
)

var srcQuery string = `
SELECT items.[$Ссылка] AS item_id
      ,items.[$Код] AS item_code
      ,items.[$Наименование] AS item_descr
FROM [$Справочник.Номенклатура] AS items
WHERE items.[$ПометкаУдаления] = 0
`

func main() {
  m, err := sql1cv8.LoadNewer(connectionString, metadataFileName)
  if err != nil {
    panic(err)
  }
  fmt.Printf("Версия метаданных: %s\n", m.Version)

  qry, err := m.Parse(srcQuery)
  if err != nil {
    panic(err)
  }
  fmt.Println("Результат:\n%s", qry)
}

Все объекты объекты метаданных должны быть заключены в конструкцию [$...]. Смотрите примеры, чтобы стало понятнее.

Поддерживаемые объекты метаданных

Стандартные объекты:

  • Константа.ИмяКонстанты
    • КлючЗаписи
    • ИмяПараметра
  • Перечисление.ИмяПеречисления
    • Ссылка
    • Порядок
  • Перечисление.ИмяПеречисления.ИмяЗначения
  • Задача.ИмяЗадачи
    • Ссылка
    • Версия
    • ПометкаУдаления
    • БизнесПроцесс
    • ТочкаМаршрута
    • Дата
    • Номер
    • Наименование
    • Выполнена
    • ИмяПараметра
  • Задача.ИмяЗадачи.ТабличнаяЧасть.ИмяТабличнойЧасти
    • Ссылка
    • КлючЗаписи
    • НомерСтроки
    • ИмяПараметра
  • БизнесПроцесс.ИмяБизнесПроцесса
    • Ссылка
    • Версия
    • ПометкаУдаления
    • Дата
    • Завершен
    • Номер
    • ВедущаяЗадача
    • Стартован
    • ИмяПараметра
  • БизнесПроцесс.ИмяБизнесПроцесса.ТабличнаяЧасть.ИмяТабличнойЧасти
    • Ссылка
    • КлючЗаписи
    • НомерСтроки
    • ИмяПараметра
  • БизнесПроцесс.ИмяБизнесПроцесса.ТочкиМаршрута
    • Ссылка
    • Порядок
  • БизнесПроцесс.ИмяБизнесПроцесса.ТочкиМаршрута.ИмяТочкиМаршрута
  • ПланВидовХарактеристик.ИмяПланаВидовХарактеристик
    • Ссылка
    • Версия
    • ПометкаУдаления
    • Предопределенное
    • Родитель
    • Владелец
    • Группа
    • Код
    • Наименование
    • ТипЗначения
    • ИмяПараметра
  • ПланВидовХарактеристик.ИмяПланаВидовХарактеристик.ТабличнаяЧасть.ИмяТабличнойЧасти
    • Ссылка
    • КлючЗаписи
    • НомерСтроки
    • ИмяПараметра
  • Справочник.ИмяСправочника
    • Ссылка
    • Версия
    • ПометкаУдаления
    • Предопределенное
    • Родитель
    • Владелец
    • Группа
    • Код
    • Наименование
    • ИмяПараметра
  • Справочник.ИмяСправочника.ТабличнаяЧасть.ИмяТабличнойЧасти
    • Ссылка
    • КлючЗаписи
    • НомерСтроки
    • ИмяПараметра
  • Документ.ИмяДокумента
    • Ссылка
    • Версия
    • ПометкаУдаления
    • Дата
    • Префикс
    • Номер
    • Проведен
    • ИмяПараметра
  • Документ.ИмяДокумента.ТабличнаяЧасть.ИмяТабличнойЧасти
    • Ссылка
    • КлючЗаписи
    • НомерСтроки
    • ИмяПараметра
  • РегистрСведений.ИмяРегистраСведений
    • Период
    • Регистратор
    • ВидРегистратора
    • НомерСтроки
    • Активность
    • ИмяПараметра
  • РегистрСведений.ИмяРегистраСведений.ИтогиСрезПоследних
    • Период
    • Регистратор
    • ВидРегистратора
    • ИмяПараметра
  • РегистрСведений.ИмяРегистраСведений.ИтогиСрезПервых
    • Период
    • Регистратор
    • ВидРегистратора
    • ИмяПараметра
  • РегистрНакопления.ИмяРегистраНакопления
    • Период
    • Регистратор
    • ВидРегистратора
    • НомерСтроки
    • Активность
    • ВидДвижения
    • ХэшИзмерений
    • ИмяПараметра
  • РегистрНакопления.ИмяРегистраНакопления.Остатки
    • Период
    • Разделитель
    • ХэшИзмерений
    • ИмяПараметра
  • РегистрНакопления.ИмяРегистраНакопления.Обороты
    • Период
    • Разделитель
    • ХэшИзмерений
    • ИмяПараметра

У перечисления и точки маршрута поле "Порядок" является порядковым номером значения, модуль может возвращать это число из объекта вида:

  • Перечисление.ИмяПеречисления.ИмяЗначения
  • БизнесПроцесс.ИмяБизнесПроцесса.ТочкиМаршрута.ИмяТочкиМаршрута

Также в некоторых ситуация можно использовать сокращение, которое будет возвращать не значение "Порядок", а значение "Ссылка". Работает это так, что данные сокращения будут преобразовываться в подзапрос. Прошу обратить внимание, что в кострукции выглядит именно [$$...], с двойным символом доллара. Пример:

-- [$$Перечисление.ФормыОплаты.Наличная]
(select top 1 _KeyField from _Enum1273 where _EnumOrder = 1)
-- [$$БизнесПроцесс.Задание.ТочкиМаршрута.Выполнить]
(select top 1 _KeyField from _BPrPoints1298 where _RoutePointOrder = 3)

В регистрах или составных типах нередко указывается вид ссылки, который ссылается на какой-то обект метаданных по сути является бинарным значением, модуль так же может возвращать это значение из объекта вида:

  • ОбъектМетаданных.ВидСсылки

Если какой-то параметр имеет составной тип, то к параметру следует добавлять суффикс:

  • ИмяПараметра.Тип
  • ИмяПараметра.Булево
  • ИмяПараметра.Число
  • ИмяПараметра.Дата
  • ИмяПараметра.Строка
  • ИмяПараметра.Двоичный
  • ИмяПараметра.ВидСсылки
  • ИмяПараметра.Ссылка

Список типов полей:

  • Тип.NULL
  • Тип.Неопределено
  • Тип.Булево
  • Тип.Число
  • Тип.Дата
  • Тип.Строка
  • Тип.Двоичный
  • Тип.Ссылка
Примеры написания запросов

Модуль понимает алиасы для таблиц, поэтому оба следующих запроса будут работать корректно.

SELECT [$Справочник.Номенклатура].[$Ссылка]
      ,[$Справочник.Номенклатура].[$Код]
      ,[$Справочник.Номенклатура].[$Наименование]
FROM [$Справочник.Номенклатура]

SELECT items.[$Ссылка]
      ,items.[$Код]
      ,items.[$Наименование]
FROM [$Справочник.Номенклатура] AS items

Однако модулю обязательно нужно указывать, к какому объекту метаданных относится параметр, в противном случае он не сможет его распознать. Например в следующем запросе параметры не распознаются.

SELECT [$Ссылка]
      ,[$Код]
      ,[$Наименование]
FROM [$Справочник.Номенклатура]

В данном примере показывается как можно использовать перечисления.

SELECT items.[$Ссылка] AS item_id
      ,items.[$Код] AS item_code
      ,items.[$Наименование] AS item_descr
      ,CASE item_types.[$Порядок]
        WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.БезОсобенностейУчета] THEN 'Без особенностей учета'
        WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.АлкогольнаяПродукция] THEN 'Алгольная (спиртосодежащая) продукция'
        WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.СодержитДрагоценныеМатериалы] THEN 'Содержит драгоценные металлы или камни'
        WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.ПродукцияМаркируемаяДляГИСМ] THEN 'Продукция, маркируемая для ГИСМ'
        WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.КиЗГИСМ] THEN 'Контрольный (идентификационный) знак (КиЗ) ГИСМ'
        ELSE ''
      END AS item_type
FROM [$Справочник.Номенклатура] AS items
JOIN [$Перечисление.ОсобенностиУчетаНоменклатуры] AS item_types
  ON items.[$ОсобенностьУчета] = item_types.[$Ссылка]

Теперь получим список реализованного за период. Намеренно использую вложенный запрос из предыдущего примера, чтобы показать, что они тоже нормально распознаются модулем.

DECLARE @offset INT
SELECT TOP 1 @offset = -Offset FROM _YearOffset

SELECT DATEADD(YEAR, @offset, headers.[$Дата]) AS doc_date
      ,headers.[$Номер] AS doc_no
      ,items.item_code
      ,items.item_descr
      ,items.item_type
      ,lines.[$Количество] AS quantity
      ,lines.[$Сумма] AS amount
FROM [$Документ.РеализацияТоваровУслуг] AS headers
JOIN [$Документ.РеализацияТоваровУслуг.ТабличнаяЧасть.Товары] AS lines
  ON headers.[$Ссылка] = lines.[$Ссылка]
JOIN (
  SELECT items.[$Ссылка] AS item_id
        ,items.[$Код] AS item_code
        ,items.[$Наименование] AS item_descr
        ,CASE item_types.[$Порядок]
          WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.БезОсобенностейУчета] THEN 'Без особенностей учета'
          WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.АлкогольнаяПродукция] THEN 'Алгольная (спиртосодежащая) продукция'
          WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.СодержитДрагоценныеМатериалы] THEN 'Содержит драгоценные металлы или камни'
          WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.ПродукцияМаркируемаяДляГИСМ] THEN 'Продукция, маркируемая для ГИСМ'
          WHEN [$Перечисление.ОсобенностиУчетаНоменклатуры.КиЗГИСМ] THEN 'Контрольный (идентификационный) знак (КиЗ) ГИСМ'
          ELSE ''
        END AS item_type
  FROM [$Справочник.Номенклатура] AS items
  JOIN [$Перечисление.ОсобенностиУчетаНоменклатуры] AS item_types
    ON items.[$ОсобенностьУчета] = item_types.[$Ссылка]
) AS items
  ON lines.[$Номенклатура] = items.item_id
WHERE DATEADD(YEAR, @offset, headers.[$Дата]) BETWEEN '2021-01-01' AND '2022-01-01'
  AND headers.[$Проведен] = 1

В данном примере мы получим список реализованного товара из регистра в котором можно увидеть использование вида ссылки.

DECLARE @offset INT
SELECT TOP 1 @offset = -Offset FROM _YearOffset

SELECT DATEADD(YEAR, @offset, reg.[$Период]) AS period
      ,headers.[$Номер] AS doc_no
      ,items.[$Код] AS item_code
      ,items.[$Наименование] AS item_descr
      ,CASE reg.[$ВидДвижения]
        WHEN 0
        THEN reg.[$ВНаличии]
        ELSE -reg.[$ВНаличии]
      END AS quantity
FROM [$РегистрНакопления.ТоварыНаСкладах] AS reg
JOIN [$Документ.РеализацияТоваровУслуг] AS doc
  ON reg.[$Регистратор] = doc.[$Ссылка]
  AND reg.[$ВидРегистратора] = [$Документ.РеализацияТоваровУслуг.ВидСсылки]
JOIN [$Справочник.Номенклатура] AS items
  ON reg.[$Номенклатура] = items.[$Ссылка]
WHERE DATEADD(YEAR, @offset, reg.[$Период]) BETWEEN '2021-01-01' AND '2021-12-31'

Следующий пример демострирует работу с составными типами. Объекты выдуманны, лень было искать в конфигурации.

DECLARE @offset INT
SELECT TOP 1 @offset = -Offset FROM _YearOffset

SELECT items.[$Код] AS item_code
      ,items.[$Наименование] AS item_descr
      ,CASE items.[$Источник.Тип]
        WHEN [$Тип.Ссылка] THEN doc.[$Номер] + ' от ' + CONVERT(NVARCHAR(10), DATEADD(YEAR, @offset, doc[$Дата]), 104)
        WHEN [$Тип.Строка] THEN items.[$Источник.Строка]
        ELSE ''
      END AS source
FROM [$Справочник.Номенклатура] AS items
LEFT JOIN [$Документ.ЗагрузкаНоменклатуры] AS doc
  ON items.[$Источник.Ссылка] = doc.[$Ссылка]
  AND items.[$Источник.ВидСсылки] = [$Документ.ЗагрузкаНоменклатуры.ВидСсылки]
WHERE items.[$Группа] = 1
  AND items.[$ПометкаУдаления] = 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Metadata

type Metadata struct {
	Version string             // Версия метаданных
	Objects map[string]*Object // Объекты метаданных первого уровня. Это либо таблицы, либо какие-то констаты вроде типов полей для составных типов, значения перечислений и виды ссылок
}

Metadata метаданные

func LoadFromDB

func LoadFromDB(cs string) (m Metadata, err error)

LoadFromDB возвращает метаданные. В качестве параметров принимает строковую переменную: cs - строка подключения, описание которой можно посмотреть по ссылке https://github.com/denisenkom/go-mssqldb#connection-parameters-and-dsn. Возвращает объект Metadata.

func LoadFromFile

func LoadFromFile(s string) (m Metadata, err error)

LoadFromFile возвращает метаданные из файла. В качестве параметров принимает строковую переменную: s - имя файла, в котором хранится кэш метаданных в формате json. Возвращает объект Metadata.

func LoadNewer

func LoadNewer(cs, s string) (m Metadata, err error)

LoadNewer возвращает метаданные из базы данных, либо из файла, если объекты в базе не менялись. В качестве параметров принимает две строковые переменные: cs - строка подключения, описание которой можно посмотреть по ссылке https://github.com/denisenkom/go-mssqldb#connection-parameters-and-dsn; s - имя файла, в котором хранится кэш метаданных в формате json. Возвращает объект Metadata.

func (Metadata) Parse

func (m Metadata) Parse(src string) (res string, err error)

Parse преобразует в тексте имена метаданных в имена базы данных. В качестве параметров принимает строковую переменную: src - текст запроса. Возвращает изменённый запрос res.

func (Metadata) SaveToFile

func (m Metadata) SaveToFile(s string) (err error)

SaveToFile сохраняет метаданные в файл. В качестве параметров принимает строковую переменную: s - имя файла, в котором хранится кэш метаданных в формате json.

type Object

type Object struct {
	UUID     string             // Идентификатор
	Number   string             // Номер объекта DBNames
	DBName   string             // Имя в базе данных
	CVName   string             // Имя в конфигурации
	Synonyms map[string]string  // Синонимы объекта
	Params   map[string]*Object // Параметры объекта
}

Object объект метаданных

func (*Object) RTRefBin

func (o *Object) RTRefBin() (string, error)

RTRefBin возвращает ВидСсылки типа BINARY(4).

func (*Object) RTRefInt

func (o *Object) RTRefInt() (string, error)

RTRefInt возвращает ВидСсылки типа INT.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL