Дочірній документ в пакеті

Відповісти
bandurovskiy
Повідомлень: 66
З нами з: 21 вересня 2012, 16:32
Звідки: Уездный город
Контактна інформація:

Дочірній документ в пакеті

Повідомлення bandurovskiy » 21 листопада 2019, 10:01

Всім доброго дня.
Цікавить наступне питання:
Яким чином за допомогою СОМ об'єктів знайти дочірній документ в пакеті
документів?

Приклад: Декларація акцизного податку. Код бланка: J0209507 до нього
існує дочірній документ (додаток) код бланка J0295007 - (вкладення 1)

Саму декларацію можливо отримати наступним чином:
код 1С 7,7:

Код: Виділити все

App = СоздатьОбъект("MEDOC.ZApplication");
//Шукаємо попередню декларацію АП
Дат = "'30.09.2019'";
ТаблицаДоков = App.DocumentsDataSet("PerDate >= " + Дат+ " AND CharCode = 'J0209507'");
//перевіряемо коль-во знайдених доків
ТаблицаДоков.RecordCount();
знайдених документів завжди більше 0.
Якщо щукаємо сам додаток по коду бланка:
ТаблицаДоков = App.DocumentsDataSet("PerDate >= " + Дат+ " AND CharCode = 'J0295007'");
ТаблицаДоков.RecordCount();
результат завжди = 0.
| Показать
Зображення
Пакет документів за допомогою Інтерфейсу IPacketDoc.
Методом Add (string parentExDocID, string childExDocID )
створюється нормально.

Inkognito
Повідомлень: 932
З нами з: 14 січня 2012, 14:26

Re: Дочірній документ в пакеті

Повідомлення Inkognito » 21 листопада 2019, 10:48

Якщо Ви створювали методами АПІ пакет, відповідно знайти додатки можна, маючі childExDocID. Якщо звичайно, childExDocID Ви пам'ятаєте, як генерували (статично або по принципу ИДДодатка1= "ИД"+"1"), а не Новый УникальныйИдентификатор()

bandurovskiy
Повідомлень: 66
З нами з: 21 вересня 2012, 16:32
Звідки: Уездный город
Контактна інформація:

Re: Дочірній документ в пакеті

Повідомлення bandurovskiy » 21 листопада 2019, 10:58

Не завжди пакет створювався методом API. В більшості випадків пакет створювався вручну.

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Дочірній документ в пакеті

Повідомлення Medoc Man » 21 листопада 2019, 12:14

bandurovskiy писав:
21 листопада 2019, 10:58
Не завжди пакет створювався методом API. В більшості випадків пакет створювався вручну.
Если документ создавался вручную - у него не будет ExDocID.
Вам нужно просто найти дочерний документ или что-то из него получить?
Человек-волшебник

bandurovskiy
Повідомлень: 66
З нами з: 21 вересня 2012, 16:32
Звідки: Уездный город
Контактна інформація:

Re: Дочірній документ в пакеті

Повідомлення bandurovskiy » 21 листопада 2019, 12:35

Вам нужно просто найти дочерний документ или что-то из него получить?
Найти дочерний документ и получить значения полей таблицы ТАВ1.

Medoc Man
Повідомлень: 739
З нами з: 07 червня 2018, 14:28
Звідки: Kiev

Re: Дочірній документ в пакеті

Повідомлення Medoc Man » 21 листопада 2019, 15:42

bandurovskiy писав:
21 листопада 2019, 12:35
Вам нужно просто найти дочерний документ или что-то из него получить?
Найти дочерний документ и получить значения полей таблицы ТАВ1.
Не знаю как насчёт Декларации по акцизу, но на примере Декларации по НДС у меня получилось так:
1. Поиск дочернего документа через DocumentsDataSet.
2. Получение данных дочернего документа через OpenOrCreateByExDocID.

Сначала, через DocumentsDataSet я смог получить количество документов (общее в пакете и отдельно дочерних):
Отакої | Показать
1.jpg
1.jpg (618.64 Кіб) Переглянуто 215 разів
Затем, на основании тех документов, что в наличии в M.E.Doc и с помощью OpenOrCreateByExDocID я получил данные из дочернего документа (Приложения 5 к Декларации):
Як він це робить?? | Показать
2.jpg
2.jpg (605.66 Кіб) Переглянуто 215 разів
Как я выше писал, если документ создавался в M.E.Doc вручную - у него не будет присутствовать ExDocID, что не даст получить данные по нему.
Я создавал Декларацию по НДС с помощью того же OpenOrCreateByExDocID и, как писал уважаемый Incognito, для упрощения использовал для дочерних документов присваивание ExDocID главного документа (родительского) с добавлением "-N", где N - номер приложения Декларации.
После, имея из DocumentsDataSet список дочерних документов, которые присутствуют в M.E.Doc, я через OpenOrCreateByExDocID обращаюсь к дочернему документу и через его DataSet определённой таблицы получаю данные.

Код, с которым у меня это получилось, привожу ниже:
Он таки волшбеник | Показать
DocumentsDataSet:

Код: Виділити все

Procedure GetPacketDocsCount(Button)
	
	Medoc = New COMObject("MEDOC.ZApplication");
	 
	VATDocs = New Array(10);
        VATDocs[0] = "J0200120";	// Главный документ Декларации по НДС
        VATDocs[1] = "J0200520";	// Приложение 1 к Декларации по НДС
        VATDocs[2] = "J0215220";	// Приложение 2 к Декларации по НДС
	VATDocs[3] = "J0200620";	// Приложение 3 к Декларации по НДС
	VATDocs[4] = "J0299820";	// Приложение 4 к Декларации по НДС	 
	VATDocs[5] = "J0215120";	// Приложение 5 к Декларации по НДС
	VATDocs[6] = "J0299320";	// Приложение 6 к Декларации по НДС
	VATDocs[7] = "J0215720";	// Приложение 7 к Декларации по НДС
	VATDocs[8] = "J0215820";	// Приложение 8 к Декларации по НДС
	VATDocs[9] = "J0215320";	// Приложение 9 к Декларации по НДС
	
	DocPerDate = "01.10.2019";
	
	TotalAmount = 0;
	ChildAmount = 0;
	
	VATChildDocsInMedoc = new Array;
	
	For Each VATDoc In VATDocs Do
		DataSetQuery = "PerDate >= '" + DocPerDate + "' AND CharCode = '" + VATDoc + "'";
		Count = Medoc.DocumentsDataSet(DataSetQuery).RecordCount();
		
        	Message("VAT Declaration | There is " + String(Count) + " '" + VATDoc + "' document(s) in M.E.Doc.");
		
		If Count <> 0 Then			
			TotalAmount = TotalAmount + 1;
		EndIf;
		
		If VATDoc <> "J0200120" AND Count <> 0 Then
			ChildAmount = ChildAmount + 1;
			VATChildDocsInMedoc.Add(VATDoc);
		EndIf;
		
	EndDo;
	
	Message(Chars.LF + "---------" + Chars.LF);

	Message("Total amount of VAT Declaration documents in M.E.Doc: " + TotalAmount);
	Message("Amount of VAT Declaration child documents in M.E.Doc: " + ChildAmount);
	
	ParentExDocID = GetParentExDocID();
	
	For Each ChildDoc in VATChildDocsInMedoc Do
		 Message("     '" + ChildDoc + "' is present in M.E.Doc.");
		 GetChildDocumentData(ChildDoc, DocPerDate, ParentExDocID);
	EndDo;			
	 	 	 
EndProcedure
GetParentExDocID() - это просто маленькая процедура получения ExDocID главного (родительского) документа.

OpenOrCreateByExDocID:

Код: Виділити все

Procedure GetChildDocumentData(Charcode, Perdate, ParentExDocID)
	
	Var ChildExDocID;
	
	If Charcode = "J0200520" Then
		ChildExDocID = ParentExDocID + "-1";
	ElsIf Charcode = "J0215220" Then
		ChildExDocID = ParentExDocID + "-2";
	ElsIf Charcode = "J0200620" Then
		ChildExDocID = ParentExDocID + "-3";
	ElsIf Charcode = "J0299820" Then
		ChildExDocID = ParentExDocID + "-4";
	ElsIf Charcode = "J0215120" Then
		ChildExDocID = ParentExDocID + "-5"
	ElsIf Charcode = "J0299320" Then
		ChildExDocID = ParentExDocID + "-6";
	ElsIf Charcode = "J0215720" Then
		ChildExDocID = ParentExDocID + "-7";
	ElsIf Charcode = "J0215820" Then
		ChildExDocID = ParentExDocID + "-8";
	ElsIf Charcode = "J0215320" Then
		ChildExDocID = ParentExDocID + "-9";
	EndIf;

	Medoc = New COMObject("MEDOC.ZApplication");
		
	//Пример на Приложении 5 Декларации по НДС
	If Charcode = "J0215120" Then
		ChildDocument = Medoc.OpenOrCreateByExDocID(Charcode,0,Perdate,,ChildExDocID,0);		
		ChildDataSet = ChildDocument.DataSets("TAB1"); 
							
		INN = String(ChildDataSet.Fields.Item("TAB1_A2").Value);
		MONTH = String(ChildDataSet.Fields.Item("TAB1_A5").Value);
		YEAR = Format(ChildDataSet.Fields.Item("TAB1_B5").Value, "ЧГ=0");
		SUM = String(ChildDataSet.Fields.Item("TAB1_A3").Value);
		TAXSUM = String(ChildDataSet.Fields.Item("TAB1_A4").Value);
			
		Message("          '" + Charcode + "' | Table 1 | Row 1: " + Chars.LF +
				"               Partner's individual tax number: " + INN + Chars.LF +
				"               Operation's period: " + MONTH + "." + YEAR + Chars.LF +
				"               Tax base sum: " + SUM + " UAH" + Chars.LF +
				"               VAT sum: " + TAXSUM + " UAH" + Chars.LF);
		
	EndIf;
				
EndProcedure
Писал под 1С 8.3 и проверял на Бухгалтерии 1.2.51.1.
У Вас, насколько я понял, используется 7.7. Если сможете имплементировать то, что выше - на здоровье.
P.S.: Прошу прощения за код 1С на английском, но мне так проще :roll:
Человек-волшебник

Відповісти

Повернутись до “Модуль «Інтеграція»”