[ELMA3] Получение табличной части из документа 1С в сценарии
Для того, чтобы иметь возможность работать со документами 1С в сценарии, необходимо подключиться к конфигурации 1С (подробно прочесть об этом можно в статье Подключение системы ELMA к конфигурации 1С через COMConnector) и выбрать в списке объектов необходимый документ 1С. Далее с ним можно работать, применяя методы 1С. Для разных версий системы 1С используются разные методы.
Для работы сценариев необходимо подключить сборки:
1 2 | EleWise.ELMA.Integration1C Microsoft.CSharp |
и пространства имен:
1 2 3 4 5 6 7 8 9 | 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 2 3 4 5 6 7 8 9 10 11 12 13 | //Соединяемся с 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | //Соединяемся с 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( "Документ не найден" ); // Выводим в консоль «Документ не найден» } |
Получение табличной части и запись в блок
Получаем табличную часть из документа и записываем данные в блок.
Текст сценария:
1 2 3 4 5 6 7 8 9 10 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | //Соединяемся с 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | //Соединяемся с 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( "Документ не найден" ); // Выводим в консоль «Документ не найден» } |