[ELMA3] Получение остатков из регистра накопления 1С
В приведенном примере рассматривается процесс подсчета остатков материалов (элементы справочника «Номенклатура»). Пользователь в системе ELMA заполняет блок с материалами, выбирая их из справочника 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 = "Не найдено";
}
}
}
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 = "Не найдено";
}
}
}
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 = "Не найдено";
}
}
}
В результате получаем сведения об остатках на складах.

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