[ELMA3] Получение табличной части из документа 1С в сценарии
Для того, чтобы иметь возможность работать со документами 1С в сценарии, необходимо подключиться к конфигурации 1С (подробно прочесть об этом можно в статье Подключение системы ELMA к конфигурации 1С через COMConnector) и выбрать в списке объектов необходимый документ 1С. Далее с ним можно работать, применяя методы 1С. Для разных версий системы 1С используются разные методы.
Для работы сценариев необходимо подключить сборки:
EleWise.ELMA.Integration1C Microsoft.CSharp
и пространства имен:
using EleWise.ELMA.Integration1C; using EleWise.ELMA.Integration1C.Data; using EleWise.ELMA.Integration1C.V81; using EleWise.ELMA.Model.Common; using EleWise.ELMA.Model.Entities; using EleWise.ELMA.Model.Managers; using EleWise.ELMA.Model.Types.Settings;
using EleWise.ELMA.Model.Services; using EleWise.ELMA.Services;
В данном примере мы рассмотрим получение табличной части из документа 1С версии 8.х.
Получение документа по дате и номеру
Получаем документ «План производства» по номеру и дате, где context.NomerDokumenta – номер документа, а context.DataDokumenta – дата документа.
Пример сценария с использованием PublicAPI
Текст сценария:
//Соединяемся с 1С var connector = PublicAPI.Services.Integration1C.GetComConnector("connect1c"); dynamic docRef = connector.GetFunctionValue("NewObject", "DocumentManager.ПланПроизводства"); var ДокументСсылка = docRef.НайтиПоНомеру(context.NomerDokumenta, context.DataDokumenta); // Получаем ссылку документ по номеру и дате if (!ДокументСсылка.Пустая()) { var Документ = ДокументСсылка.ПолучитьОбъект(); // Получаем документ dynamic ТабличнаяЧасть = Документ.СоставПлана.Выгрузить(); } else { Console.WriteLine("Документ не найден"); // Выводим в консоль «Документ не найден» }
Пример сценария без использования PublicAPI
Текст сценария:
//Соединяемся с 1С var service = Locator.GetServiceNotNull<Integration1CService>(); var provider = service.GetProvider("connect1c"); ComObject connector = service.GetComConnector("connect1c"); dynamic docRef = connector.GetFunctionValue("NewObject", "DocumentManager.ПланПроизводства"); var ДокументСсылка = docRef.НайтиПоНомеру(context.NomerDokumenta,context.DataDokumenta); // Получаем ссылку документ по номеру и дате if (!ДокументСсылка.Пустая()) { var Документ = ДокументСсылка.ПолучитьОбъект(); // Получаем документ dynamic ТабличнаяЧасть = Документ.СоставПлана.Выгрузить(); } else { Console.WriteLine("Документ не найден"); // Выводим в консоль «Документ не найден» }
Получение табличной части и запись в блок
Получаем табличную часть из документа и записываем данные в блок.
Текст сценария:
dynamic ТабличнаяЧасть = Документ.СоставПлана.Выгрузить(); // Получаем табличную часть int numberrow = ТабличнаяЧасть.Количество(); // Считаем количество записей в табличной части for(int i=0; i<numberrow; i++) // Проходим циклом по табличной части { dynamic temprow = ТабличнаяЧасть.Получить(i); // Получаем i элемент табличной части var newRow = InterfaceActivator.Create<P_Proizvodstvo_Plan>(); // Создаем новый элемент блока «План» newRow.Naimenovanie = temprow.Наименование; // Записываем «Наименование» в блок newRow.Plan = temprow.Количество; // Записываем «Количество» в блок context.Plan.Add(newRow); // Добавляем в блок элемент блока. }
Работа со справочником в табличной части
Если в табличной части используется справочник из 1С, необходимо в настройках интеграции с 1С подключить нужный справочник (подробно прочесть об этом можно в статье Подключение системы ELMA к конфигурации 1С через COMConnector).
Пример сценария с использованием PublicAPI
Текст сценария:
//Соединяемся с 1С var provider = PublicAPI.Services.Integration1C.GetProvider("connect1c") var connector = PublicAPI.Services.Integration1C.GetComConnector("connect1c"); dynamic docRef = connector.GetFunctionValue("NewObject", "DocumentManager.ПланПроизводства"); var ДокументСсылка = docRef.НайтиПоНомеру(context.NomerDokumenta, context.DataDokumenta); // Получаем ссылку на документ if (!ДокументСсылка.Пустая()) { var Документ = ДокументСсылка.ПолучитьОбъект(); // Получаем документ dynamic ТабличнаяЧасть = Документ.СоставПлана.Выгрузить(); // Получаем табличную часть int numberrow = ТабличнаяЧасть.Количество(); // Считаем количество записей в табличной части for (int i = 0; i < numberrow; i++) // Проходим циклом по табличной части { dynamic temprow = ТабличнаяЧасть.Получить(i); // Получаем i элмент табличной части var num = provider.LoadBookByComObject<Nomenklatura>(temprow.Номенклатура); // Получаем справочник "Номенклатура" из 1С if (num != null) { var newRow = InterfaceActivator.Create<P_Proizvodstvo_Plan>(); // Создаем новый элемент блока newRow.Nomenklatura = nomenklatura; // Записываем элемент справочника в переменную с типом "Номенклатура из 1С" newRow.Plan = temprow.Количество; // Записываем количество в "План" context.Plan.Add(newRow); // Добавляем лемент блока в блок } else { Console.WriteLine("null"); // Выводим в консоль "null" } } } else { Console.WriteLine("Документ не найден"); // Выводим в консоль «Документ не найден» }
Пример сценария без использования PublicAPI
Текст сценария:
//Соединяемся с 1С var service = Locator.GetServiceNotNull<Integration1CService>(); var provider = service.GetProvider("connect1c"); ComObject connector = service.GetComConnector("connect1c"); dynamic docRef = connector.GetFunctionValue("NewObject", "DocumentManager.ПланПроизводства"); var ДокументСсылка = docRef.НайтиПоНомеру(context.NomerDokumenta,context.DataDokumenta); // Получаем ссылку на документ if (!ДокументСсылка.Пустая()){ var Документ = ДокументСсылка.ПолучитьОбъект(); // Получаем документ dynamic ТабличнаяЧасть = Документ.СоставПлана.Выгрузить(); // Получаем табличную часть int numberrow = ТабличнаяЧасть.Количество(); // Считаем количество записей в табличной части for(int i=0; i<numberrow; i++) // Проходим циклом по табличной части { dynamic temprow = ТабличнаяЧасть.Получить(i); // Получаем i элмент табличной части var num = provider.LoadBookByComObject<Nomenklatura>(temprow.Номенклатура); // Получаем справочник "Номенклатура" из 1С if (num != null) { var newRow = InterfaceActivator.Create<P_Proizvodstvo_Plan>(); // Создаем новый элемент блока newRow.Nomenklatura = nomenklatura; // Записываем элемент справочника в переменную с типом "Номенклатура из 1С" newRow.Plan = temprow.Количество; // Записываем количество в "План" context.Plan.Add(newRow); // Добавляем лемент блока в блок } else { Console.WriteLine("null"); // Выводим в консоль "null" } } } else { Console.WriteLine("Документ не найден"); // Выводим в консоль «Документ не найден» }