Получение остатков из регистра накопления 1С

В приведенном примере рассматривается процесс подсчета остатков материалов (элементы справочника «Номенклатура»). Пользователь в системе ELMA заполняет блок с материалами, выбирая их из справочника 1С «Номенклатура», получает остатки материалов на складах на заданную или текущую дату. Информация получается отбором по регистру накопления «Остатки материалов».

Регистр накопления
Это объект прикладного решения системы 1С Предприятие, механизм учета движения средств (финансов, товаров, материалов и т.д.). Регистр накопления образует многомерную систему измерений и позволяет "накапливать" числовые данные в разрезе нескольких измерений. Например, в таком регистре можно накапливать информацию об остатках товаров в разрезе номенклатуры и склада или информацию об объемах продаж в разрезе номенклатуры и подразделения компании.

Схема процесса

Цель достигается двумя способами: с использованием методов менеджера регистра, с использованием запроса.

Контекст процесса:

  • Data, дата;
  • MaterialsList, блок;
    • Material, номенклатура (Справочник 1С);
    • Count, строка

Структура регистра накопления «Остатки материалов»:


Для работы сценариев необходимо подключить сборку Microsoft.CSharp, и пространства имен:

using EleWise.ELMA.CRM.Models;
using EleWise.ELMA.Integration1C;
using EleWise.ELMA.Integration1C.Data;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Security.Services;
using EleWise.ELMA.Services;
using EleWise.ELMA.Integration1C.V81;

На старте процесса заполняется блок с материалами, выбирается дата.

Сценарий с использованием методов менеджера регистра

public void Script1(Context context)
  {
   //Получаем доступ к 1С
   var service = Locator.GetServiceNotNull<Integration1CService>();
   //Инициализация подключения "1Ssys"
   ComObject connector = service.GetComConnector("1Ssys");
   //Получаем доступ к справочнику "Номенклатура"
   dynamic reference = connector.GetFunctionValue("NewObject", "CatalogManager.Номенклатура");
   //Получаем доступ к менеджеру регистров накопления
   dynamic register = connector.GetFunctionValue("NewObject", "AccumulationRegistersManager");
   //Перебираем заполненные в блоке значения
   foreach (var item in context.MaterialsList)
   {
    //Получаем объект "Структура", в дальнейшем используем ее как фильтр.
    dynamic structure = connector.GetFunctionValue("NewObject", "Структура");
    var obj = reference.НайтиПоКоду(item.Material.Kod).ПолучитьОбъект();
    structure.Вставить("Материал", obj.ссылка);
    //Получаем остатки
    var count = register.ОстаткиМатериалов.Остатки(context.Data, structure, "Материал");
    try
    {
     //Присваиваем значение элементу блока
     item.Count = count.Получить(0).Количетсво.ToString();
    }
    catch
    {
     //Присваиваем значение "Не найдено", если данных не найдено.
     item.Count = "Не найдено";
    }
   }
  } 
Создание аналогичного скрипта с использованием PublicAPI
Актуальная документация по PublicAPI доступна по ссылке
Сценарий,указанный ниже, актуален для версии PublicAPI 3.8 и выше
public void Script1(Context context)
{
    //Получаем доступ к 1С
    //Инициализация подключения "1Ssys"
    ComObject connector = PublicAPI.Services.Integration1C.GetComConnector("1Ssys");
    //Получаем доступ к справочнику "Номенклатура"
    dynamic reference = connector.GetFunctionValue("NewObject", "CatalogManager.Номенклатура");
    //Получаем доступ к менеджеру регистров накопления
    dynamic register = connector.GetFunctionValue("NewObject", "AccumulationRegistersManager");
    //Перебираем заполненные в блоке значения
    foreach (var item in context.MaterialsList)
    {
        //Получаем объект "Структура", в дальнейшем используем ее как фильтр.
        dynamic structure = connector.GetFunctionValue("NewObject", "Структура");
        var obj = reference.НайтиПоКоду(item.Material.Kod).ПолучитьОбъект();
        structure.Вставить("Материал", obj.ссылка);
        //Получаем остатки
        var count = register.ОстаткиМатериалов.Остатки(context.Data, structure, "Материал");
        try
        {
            //Присваиваем значение элементу блока
            item.Count = count.Получить(0).Количетсво.ToString();
        }
        catch
        {
            //Присваиваем значение "Не найдено", если данных не найдено.
            item.Count = "Не найдено";
        }
    }
}

Сценарий с использованием запроса

В данном запросе будут получены остатки на текущую дату.

public void Script2(Context context)
  {
   //Получаем доступ к 1С
   var service = Locator.GetServiceNotNull<Integration1CService>();
   //Инициализация подключения "1Ssys"
   ComObject connector = service.GetComConnector("1Ssys");
   //Перебираем заполненные в блоке значения
   foreach (var item in context.MaterialsList)
   {
    //Формируем запрос и получаем значения
    string ТекстЗапроса = "ВЫБРАТЬ " +
     "ОстаткиМатериаловОстатки.Материал.Ссылка, " +
     "ОстаткиМатериаловОстатки.Склад.Ссылка, " +
     "ОстаткиМатериаловОстатки.КоличетсвоОстаток " +
     "ИЗ РегистрНакопления.ОстаткиМатериалов.Остатки КАК ОстаткиМатериаловОстатки " +
     "ГДЕ ОстаткиМатериаловОстатки.Материал.Код = \"" + item.Material.Kod + "\"";
    dynamic Запрос = connector.GetFunctionValue("NewObject", "Запрос");
    Запрос.Текст = ТекстЗапроса;
    dynamic Результат = connector.GetFunctionValue("NewObject", "ТаблицаЗначений");
    Результат = Запрос.Выполнить().Выгрузить();
    try
    {
     //Присваиваем значение элементу блока
     item.Count = Результат.Получить(0).КоличетсвоОстаток.ToString();
    }
    catch
    {
     //Присваиваем значение "Не найдено", если данных не найдено.
     item.Count = "Не найдено";
    }
   }
  }
Создание аналогичного скрипта с использованием PublicAPI
Актуальная документация по PublicAPI доступна по ссылке
Сценарий,указанный ниже, актуален для версии PublicAPI 3.8 и выше
public void Script2(Context context)
{
    //Получаем доступ к 1С
    //Инициализация подключения "1Ssys"
    ComObject connector = PublicAPI.Services.Integration1C.GetComConnector("1Ssys");
    //Перебираем заполненные в блоке значения
    foreach (var item in context.MaterialsList)
    {
        //Формируем запрос и получаем значения
        string ТекстЗапроса = "ВЫБРАТЬ " +
            "ОстаткиМатериаловОстатки.Материал.Ссылка, " +
            "ОстаткиМатериаловОстатки.Склад.Ссылка, " +
            "ОстаткиМатериаловОстатки.КоличетсвоОстаток " +
            "ИЗ РегистрНакопления.ОстаткиМатериалов.Остатки КАК ОстаткиМатериаловОстатки " +
            "ГДЕ ОстаткиМатериаловОстатки.Материал.Код = \"" + item.Material.Kod + "\"";
        dynamic Запрос = connector.GetFunctionValue("NewObject", "Запрос");
        Запрос.Текст = ТекстЗапроса;
        dynamic Результат = connector.GetFunctionValue("NewObject", "ТаблицаЗначений");
        Результат = Запрос.Выполнить().Выгрузить();
        try
        {
            //Присваиваем значение элементу блока
            item.Count = Результат.Получить(0).КоличетсвоОстаток.ToString();
        }
        catch
        {
            //Присваиваем значение "Не найдено", если данных не найдено.
            item.Count = "Не найдено";
        }
    }
}

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

Аналогичным образом можно получить, к примеру, обороты регистра.