Исполнение запросов в 1С из сценария ELMA

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

Запросы 1С – это способ получения данных из БД 1С. Язык запросов 1С – это отдельный язык, схожий с SQL-запросами, но имеющий некоторые отличия. Язык запросов 1С имеет синтаксис на английском и русском языках. В случае использования английского языка запросы схожи со стандартными SQL-запросами.

Работа с запросами 1С происходит в несколько этапов:

  • составление запроса;
  • подстановка параметров в запрос;
  • исполнение запроса;
  • обработка результатов запроса.

В статье будет рассмотрен пример работы с запросом 1C через COMconnector.

Описание сценария

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

  • Kontragent1C – контекстная переменная, содержащая переменную типа Справочник 1С Контрагенты;
  • dogovory – контекстная переменная типа Выпадающий список, в которую будет записан результат запроса для отображения пользователю;
  • УПП (8.2) – наименование подключаемой конфигурации 1С.

В сценарии будет произведено подключение к 1С, создание нового объект 1С типа Запрос, исполнение запроса, создание нового объекта 1С типа Таблица значений, запись результата запроса в таблицу значений, обработка полученного результата, запись результата в выпадающий список.

Используемое пространство имен:

using EleWise.ELMA.Services;
using EleWise.ELMA.Integration1C;
using EleWise.ELMA.Integration1C.Data;
using EleWise.ELMA.Integration1C.V82;

Подключаемые сборки:

EleWise.ELMA.Integration1C
Microsoft.CSharp

public void addDDLDogovor(Context context) // заполнение выпадающего списка договоров
{
  //Инициализация подключения к 1с.
  var service = Locator.GetServiceNotNull<Integration1CService>();
  ComObject connector = service.GetComConnector("УПП(8.2)"); 
  //Получение кода элемента справочника 1с Контрагенты. Код будет использован в качестве параметра в запросе.
  string kodKontragent1c = context.Kontragent1S.Kod;
  //Cоставление текста запроса на языка запросов 1С, в качестве параметра использован код Контрагента
  string ТекстЗапроса = "ВЫБРАТЬ ДоговорыКонтрагентов.Код, ДоговорыКонтрагентов.Наименование " +
	"ИЗ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов " +
	"ГДЕ ДоговорыКонтрагентов.Владелец.ГоловнойКонтрагент.Код = \"" + kodKontragent1c + "\"";
  //Создание нового объекта типа Запрос
  dynamic Запрос = connector.GetFunctionValue("NewObject", "Запрос");
  //Заносим текст запроса в соответствующий атрибут Запроса.
  Запрос.Текст = ТекстЗапроса;
  //Создание нового объекта типа Таблица значений для записи результатов запроса.
  dynamic Результат = connector.GetFunctionValue("NewObject", "ТаблицаЗначений");
  //Исполнение запроса, выгрузка результата в Таблицу значений
  Результат = Запрос.Выполнить().Выгрузить(); 
  //Подсчет строк в таблице значений
  var n = Результат.Количество(); 
  //Инициализация и очистка выпадающего списка.
  var dogovory = context.GetSettingsFor(m=> m.Dogovory).As<DropDownListSettings>();
  dogovory.Items.Clear();
  //Перебор всех строк в таблице значений
  for (int i = 0; i < n; i++)
  {
	//создание строки выпадающего списка. запись в строку данных из Таблицы значений.
	var item = new DropDownItem(Результат.Получить(i).Код,Результат.Получить(i).Наименование);
	//Добавление в выпадающий список новой строки
	dogovory.Items.Add(item);
  }
  //Сохранение выпадающего списка. 
  dogovory.Save();
}
Создание аналогичного скрипта с использованием PublicAPI
Актуальная документация по PublicAPI доступна по ссылке
Сценарий,указанный ниже, актуален для версии PublicAPI 3.8 и выше
public void addDDLDogovor(Context context) // заполнение выпадающего списка договоров
{
    //Инициализация подключения к 1с.
    var connector = PublicAPI.Services.Integration1C.GetComConnector("УПП(8.2)");
    //Получение кода элемента справочника 1с Контрагенты. Код будет использован в качестве параметра в запросе.
    string kodKontragent1c = context.Kontragent1S.Kod;
    //Cоставление текста запроса на языка запросов 1С, в качестве параметра использован код Контрагента
    string ТекстЗапроса = "ВЫБРАТЬ ДоговорыКонтрагентов.Код, ДоговорыКонтрагентов.Наименование " +
        "ИЗ Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов " +
        "ГДЕ ДоговорыКонтрагентов.Владелец.ГоловнойКонтрагент.Код = \"" + kodKontragent1c + "\"";
    //Создание нового объекта типа Запрос
    dynamic Запрос = connector.GetFunctionValue("NewObject", "Запрос");
    //Заносим текст запроса в соответствующий атрибут Запроса.
    Запрос.Текст = ТекстЗапроса;
    //Создание нового объекта типа Таблица значений для записи результатов запроса.
    dynamic Результат = connector.GetFunctionValue("NewObject", "ТаблицаЗначений");
    //Исполнение запроса, выгрузка результата в Таблицу значений
    Результат = Запрос.Выполнить().Выгрузить();
    //Подсчет строк в таблице значений
    var n = Результат.Количество();
    //Инициализация и очистка выпадающего списка.
    var dogovory = context.GetSettingsFor(m => m.Dogovory).As<DropDownListSettings>();
    dogovory.Items.Clear();
    //Перебор всех строк в таблице значений
    for (int i = 0; i < n; i++)
    {
        //создание строки выпадающего списка. запись в строку данных из Таблицы значений.
        var item = new DropDownItem(Результат.Получить(i).Код, Результат.Получить(i).Наименование);
        //Добавление в выпадающий список новой строки
        dogovory.Items.Add(item);
    }
    //Сохранение выпадающего списка. 
    dogovory.Save();
}

По исполнению сценария в выпадающем списке Dogovory будут содержаться названия всех договоров, закрепленных за определенным контрагентом.