[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("Документ не найден"); // Выводим в консоль «Документ не найден»
}