logo

[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

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA с 3.8 включительно до 3.12.1 включительно.

Текст сценария:

//Соединяемся с 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

Примечание
Актуальная документация по PublicAPI доступна по ссылке.
Внимание!
Сценарий, указанный ниже, актуален для версий системы ELMA с 3.8 включительно до 3.12.1 включительно.

Текст сценария:

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