Перейти к содержанию

Запрос#

Запрос - сущность, олицетворяющая одну или несколько команд СУБД (MSSQL или 1C).

Структура#

Структура запроса описывается в виде json в файле с расширение .query.json.

  • rights - описывает права для данного объекта. Представляет собой объект. Для каждого действия (create, read, update, delete) задается массив ролей, для которых это действие будет доступно. В примере чтение данных доступно только для ролей super и qweqwe, остальные действия не доступны ни для одной роли. Обязательное свойство.
  • provider - описывает провайдер, по которому будет выполнен запрос. Представляет собой строковое поле. В случае если в качестве значения указано "1C" - то запрос будет выполнен в базе 1с, иначе - в MSSql.
  • readInMirror - если true, то запрос на чтение данных (sql-запрос, который указан в разделе select) будет выполняться в зеркале БД. Запрос не должен содержать инструкций на изменение данных в БД, иначе возникнет ошибка при его выполнении. По умолчанию значение false.
  • parameters - описывает параметры запроса. Представляет собой объект. Каждый параметр представляется в виде имя параметра - имя типа. Имя типа берется из словаря примитивов и является регистрозависимым значением. В примере у запроса два параметра: параметр с именем vcode и типом bigint и параметр с именем test и типом string.
  • select, insert, update, delete - описывают для каждого типа действия текст запроса и доступные параметры. Представляют собой объекты. Запрос должен содержать как минимум одно из этих свойств. В качестве значения свойства text указывается относительный путь к файлу с sql-скриптом, а в качестве значения свойства parameters в виде массива указываются имена параметров из объекта parameters запроса. В данном примере при чтении данных доступен параметр vcode и выполняется скрипт select * from Storage where vcode = @vcode. Если бы в качестве доступного параметра при чтении данных не был бы указан параметр с именем vcode, т.е. select.parameters = [], то чтение данных вызвало бы ошибку, так как sql-текст подразумевает наличие параметра с таким именем.
  • useContext - устаревшее свойство. Рекомендуется использовать useSessionContext. Описывает настройки использования пользовательского контекста при работе с данными с помощью этого запроса. Представляет собой объект. Для каждого действия (create, read, update, delete) задается булевое значение использовать контекст или нет. По умолчанию для всех действий значение true. В примере использование контекста отключается для всех действий. Подробнее в статье пользовательский контекст.
  • useSessionContext - описывает настройки использования пользовательского контекста при работе с данными с помощью этого запроса. Представляет собой объект. Для каждого действия (create, read, update, delete) задается булевое значение использовать контекст или нет. По умолчанию для всех действий значение true. В примере использование контекста отключается для всех действий. Подробнее в статье пользовательский контекст.

Описание#

Пример 1
{
  "rights": {
    "create": [],
    "read": ["super", "qweqwe"],
    "update": [],
    "delete": []
  },
  "parameters": {
    "vcode": "bigint",
    "test": "string"
  },
  "select": {
    "text": "./getStorage.sql",
    "parameters": ["vcode"]
  },
  "insert": {
    "text": "",
    "parameters": []
  },
  "update": {
    "text": "",
    "parameters": []
  },
  "delete": {
    "text": "",
    "parameters": []
  },
  "useContext": {
    "read": false,
    "create": false,
    "update": false,
    "delete": false
  }
}

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

Пример 2
{
  "rights": {
    "read": ["super", "qweqwe"]
  },
  "parameters": {
    "vcode": "bigint"
  },
  "select": {
    "text": "./getStorage.sql",
    "parameters": ["vcode"]
  },
  "useContext": {
    "read": false,
    "create": false,
    "update": false,
    "delete": false
  }
}

Текст запроса#

Пример 1
select * from Storage 
where vcode = @vcode

Запрос для 1С#

Следует заметить, что текст запроса пишется на языке JScript, который имеет различия с JavaScript. В теле скрипта в качестве глобальных переменных доступны следующие переменные:

  • COM1C - глобальный контекст внешнего соединения 1С указаный в default в файле externalConnections.config.
  • COM_[id] - глобальный контекст внешнего соединения 1С описаный в файле externalConnections.config.
  • Параметры запроса - переменные имеют то же имя, что и параметр, указанный в описании запроса.

Текст запроса должен оканчиваться возвратом значения(команда return).

Пример выборки контрагентов:
var select  = COM1C.Справочники.Контрагенты.Выбрать();
return select;
Пример создания и выполнения запросов с параметрами:
1
2
3
4
5
var query = COM1C.newObject("Query");
query.Text = 'ВЫБРАТЬ 1 КАК VCode, 2 как ПорядковыйНомер,"ИмяЧеловека" как ФИО,&testString КАК СТРПараметр, &Дата как ДатаПараметр';
query.SetParameter('testString', test);
query.SetParameter('Дата', dt);
return query.Execute().Unload();
Пример создания документа в 1С:
1
2
3
4
var newDoc = COM1C.Документы.Партия.СоздатьДокумент();
  newDoc.Дата = dt;
  newDoc.Записать();
return COM1C.Документы.Партия.Выбрать();

в данном случает test - параметр запроса типа string, dt - параметр типа Date; Можно пользоваться как латиницей, так и русскоязычными названиями методов. Так же можно вернуть примитивные типы (строка, дата, число, ...).

К примеру попробуем получить версию 1С:
return COM1C.Метаданные.Версия;
Пример запроса с множественными подключениями:
1
2
3
4
5
var versions = [];
versions.push(COM1C.Метаданные.Версия);
versions.push(COM_defaultId.Метаданные.Версия);
versions.push(COM_someId.Метаданные.Версия);
return versions.toString();

Примечание

Подключения COM1C и COM_defaultId являются одним и тем же, но в случае единичного подключения COM_defaultId не будет создан.

Табличный параметр#

В качестве параметра запроса может передаваться таблица, структура которой должна соответствовать описанию:

Описание#

Пример
{
  "rights": {
    "read": ["super", "qweqwe"],
    "create": ["super", "qweqwe"]
  },
  "parameters": {
    "test": "bigint",
    "tableParam":{
      "VCode":"bigint",
      "PCode":"bigint",
      "Name":"string",
      "level":"int"
    }
  },
  "insert": {
    "text": "./myQuery.sql",
    "parameters": ["test", "tableParam"]
  }
}

Описанием табличного параметра является словарь, ключами которого являются имена колонок, а значениями - типы. В качестве типов могут выступать только простые типы (нельзя указывать модели или другие табличные параметры)

Пример текста запроса с табличным параметром#

Файл myQuery.sql:
select * from @tableParam
where VCode >= isnull(@test, VCode)
1
2
3
select x."VCode", x."PCode", x."Name", x."level"
from json_to_recordset(:tableParam) AS x("VCode" bigint, "PCode" bigint, "Name" text, "level" int)
where x."VCode" >= COALESCE(:test, x."VCode")

Пример вызова запроса с табличным параметром#

Пример
import query from './queries/myQuery.query.json'

const source = new QuerySource(query);
source.insert({
  tableParam: [
    { VCode: 111, Name: 'Test99999' },
    { VCode: 112, Name: 'Test91239' },
    { VCode: 113, Name: '333333' }
  ]
})

См. также#