[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 = "Не найдено"; } } }
В результате получаем сведения об остатках на складах.
Аналогичным образом можно получить, к примеру, обороты регистра.