БП 3.0.63.15 и УТ 10.3.47.3 Отмена проведения документа после записи данных, КД 2.1

1. ajhedz 14.07.18 15:52 Сейчас в теме
Существует довольно избитая тема отмены проведения документов после обмена между ИБ БП 3.0 и УТ 10.3. Находил статьи о том, как это возможно реализовать, но в итоге ничего полезного не получилось (ввиду малого опыта, разумеется). Пытаюсь хотя бы просто отменить проведение полученных из УТ документов без проверки на их наличие в приемнике - впоследствии уже доработаю под первоначальную задачу. В УТ создаю новый документ ПоступлениеТоваровУслуг, после чего произвожу непосредственно обмен через прямое подключение из БП.
Для доработки используются типовые правила обмена.
В параметры обработчика "ПередЗагрузкойДанных" добавлен массив "ТаблицаДокументов".

<ПередЗагрузкойДанных>
Параметры.Вставить("ВалютаРегламентированногоУчета", ОбщегоНазначенияБПВызовСервераПовтИсп.ПолучитьВалютуРегламентированногоУчета());
Параметры.Вставить("ОбъектыКУдалению", Новый Массив);
Параметры.Вставить("ОсновнаяОрганизация", ОбщегоНазначенияБПВызовСервера.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация"));
Параметры.Вставить("ДокументыСОпределениемДопРеквизитов",Новый Массив);
Параметры.Вставить("ОсновныеДоговорыКонтрагентов", Новый Массив);
Параметры.Вставить("КлассификаторТНВЭД", Новый Массив);
//+
Параметры.Вставить("ТаблицаДокументов",Новый Массив);
//+
ТоварыТабличнаяЧасть = Новый ТаблицаЗначений();
ТоварыТабличнаяЧасть.Колонки.Добавить("Ссылка");
ТоварыТабличнаяЧасть.Колонки.Добавить("ТоварыТабличнаяЧасть", Новый ОписаниеТипов("ТаблицаЗначений"));
ТоварыТабличнаяЧасть.Индексы.Добавить("Ссылка");
Параметры.Вставить("ТоварыТабличнаяЧасть", ТоварыТабличнаяЧасть);
Параметры.Вставить("ДокументыЗагруженныеИзНесоовпадающихТиповДокументов", Новый Массив());
</ПередЗагрузкойДанных>
Показать


В обработчике "ПослеЗагрузкиДанных" в созданный ранее параметр добавляются ссылки из параметра ДокументыСОпределениемДопРеквизитов. После отработки части кода типовых правил добавлен цикл для отмены проведения документов по ранее полученным ссылкам. Соответственно, отмена проведения не происходит, пробовал использовать также и "ОтменитьПроведениеОбъектаВИБ". Но, видимо, недопонимаю, как происходит обработка данных.

<ПослеЗагрузкиДанных>Если РежимЗагрузкиДанныхВИнформационнуюБазу() Тогда

	Если Параметры.ДокументыСОпределениемДопРеквизитов.Количество() > 0 Тогда
		ТаблицаБанков = Новый ТаблицаЗначений();
		ТаблицаБанков.Колонки.Добавить("БИК", Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(100, ДопустимаяДлина.Переменная)));
		ТаблицаБанков.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.Банки"));
		ТаблицаБанков.Колонки.Добавить("Объект", Новый ОписаниеТипов("СправочникОбъект.Банки"));
		ТаблицаБанков.Индексы.Добавить("Ссылка");
		
		Для Каждого ДокументСсылка Из Параметры.ДокументыСОпределениемДопРеквизитов Цикл
			//+
			Параметры.ТаблицаДокументов.Добавить(ДокументСсылка);
			//+
			ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
			Если ДокументОбъект = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			ТипОбъекта = ТипЗнч(ДокументСсылка);
			РежимЗаписи = РежимЗаписиДокумента.Запись;
			
			Если ТипОбъекта = Тип("ДокументСсылка.АвансовыйОтчет") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ПоступлениеДопРасходов") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.РеализацияТоваровУслуг") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.СписаниеСРасчетногоСчета") ИЛИ // проверять отсюда
				 ТипОбъекта = Тип("ДокументСсылка.ПоступлениеНаРасчетныйСчет") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ВозвратТоваровОтПокупателя") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ВозвратТоваровпоставщику") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ИнвентаризацияТоваровНаСкладе") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ОприходованиеТоваров") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.СписаниеТоваров") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ПеремещениеТоваров") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ПриходныйКассовыйОрдер") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.РасходныйКассовыйОрдер") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ТребованиеНакладная") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.КомплектацияНоменклатуры") ИЛИ
				 ТипОбъекта = Тип("ДокументСсылка.ОтчетОРозничныхПродажах") //ИЛИ
				 // Не подключены к механизму заполнения счетов учета:
				 // ОтчетКомиссионераОПродажах, ОтчетКомитентуОПродажах, КорректировкаДолга, ГТДИмпорт, ОплатаПлатежнойКартой
				Тогда
				
				ДокументОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
				СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(ДокументОбъект, РежимЗаписи);
			ИначеЕсли ТипОбъекта = Тип("ДокументСсылка.ГТДИмпорт") Тогда
				Документы.ГТДИмпорт.ЗаполнитьСчетаУчетаВТабличнойЧасти(ДокументОбъект, "Товары");
			ИначеЕсли ТипОбъекта = Тип("ДокументСсылка.КорректировкаПоступления") Тогда
				ПараметрыИсправления = Документы.КорректировкаПоступления.СформироватьПараметрыИсправленияКорректировочногоДокумента(
					ДокументОбъект.ВидОперации, ДокументОбъект.Дата, ДокументОбъект.ДокументПоступления);
				ЗаполнитьЗначенияСвойств(ДокументОбъект, ПараметрыИсправления); 
			ИначеЕсли ТипОбъекта = Тип("ДокументСсылка.КорректировкаРеализации") Тогда
				ПараметрыИсправления = Документы.КорректировкаРеализации.СформироватьПараметрыИсправленияКорректировочногоДокумента(
					ДокументОбъект.ВидОперации, ДокументОбъект.ДокументРеализации, ДокументОбъект.ИсправляемыйДокументРеализации);
				ЗаполнитьЗначенияСвойств(ДокументОбъект, ПараметрыИсправления);
				
				ДокументОбъект.ИсходныйДокументРеализации = УчетНДСПереопределяемый.ПолучитьИсправляемыйДокументРеализации(ДокументОбъект.ДокументРеализации, Истина);

			ИначеЕсли ТипОбъекта = Тип("ДокументСсылка.СчетФактураПолученный") Тогда
				ДокументОснование = ДокументОбъект.ДокументОснование;
				Если ЗначениеЗаполнено(ДокументОснование) И ДокументОснование.ПолучитьОбъект() <> Неопределено Тогда
					СтруктураПараметров	= Новый Структура("Дата, Организация, ВидСчетаФактуры, ДокументОснование, Исправление");
					ЗаполнитьЗначенияСвойств(СтруктураПараметров, ДокументОбъект);
					ДокументОбъект.НДСПредъявленКВычету = Документы.СчетФактураПолученный.ПолучитьПорядокОтраженияВычетаПоУмолчанию(СтруктураПараметров);
				Иначе
					ТекстСобытия = "";
					Если Не ЗначениеЗаполнено(ДокументОснование) Тогда
						ТекстСобытия = "Не заполнен документ-основание";
					ИначеЕсли ДокументОснование.ПолучитьОбъект() = Неопределено Тогда
						ТекстСобытия = "Документ-основание не загружен в информационную базу";
					КонецЕсли;
					Если ТекстСобытия <> "" Тогда
						ЗаписьЖурналаРегистрации("Загрузка данных", УровеньЖурналаРегистрации.Предупреждение, Метаданные.Документы.СчетФактураПолученный,ДокументСсылка,ТекстСобытия);
					КонецЕсли;
				КонецЕсли;
			ИначеЕсли ТипОбъекта = Тип("ДокументСсылка.СчетНаОплатуПокупателю") Тогда
				РегистрыСведений.СтатусыДокументов.УстановитьСтатусыДокумента(ДокументСсылка, 
					Перечисления.СтатусОплатыСчета.СтатусНовогоДокумента(),
					Перечисления.СтатусыОтгрузки.СтатусНовогоДокумента());
			ИначеЕсли ТипОбъекта = Тип("СправочникСсылка.Банки") Тогда
				СтрокаБанка = ТаблицаБанков.Добавить();
				СтрокаБанка.БИК = ДокументОбъект.Код;
				СтрокаБанка.Ссылка = ДокументСсылка;
				СтрокаБанка.Объект = ДокументОбъект;
				Продолжить;
			КонецЕсли;
			
			ЗаписатьОбъектВИБ(ДокументОбъект,ТипОбъекта);

		КонецЦикла;
		Если ТаблицаБанков.Количество() > 0 Тогда
			Запрос = Новый Запрос();
			Запрос.Текст = "
			|ВЫБРАТЬ
			|	ТаблицаБанков.БИК КАК БИК,
			|	ТаблицаБанков.Ссылка КАК Ссылка
			|ПОМЕСТИТЬ ТаблицаБанков
			|ИЗ
			|	&ТаблицаБанков КАК ТаблицаБанков
			|;
			|ВЫБРАТЬ
			|	ТаблицаБанков.Ссылка,
			|	ВЫБОР	КОГДА КОЛИЧЕСТВО(*) > 1.00 ИЛИ МАКСИМУМ(КлассификаторБанков.Ссылка) ЕСТЬ NULL
			|			ТОГДА 2.00
			|			ИНАЧЕ 0.00
			|	КОНЕЦ КАК РучноеИзменение
			|ИЗ
			|	ТаблицаБанков КАК ТаблицаБанков
			|ЛЕВОЕ СОЕДИНЕНИЕ
			|	Справочник.КлассификаторБанков КАК КлассификаторБанков
			|ПО
			|	ТаблицаБанков.БИК = КлассификаторБанков.Код
			|СГРУППИРОВАТЬ ПО
			|	ТаблицаБанков.Ссылка
			|";
			Запрос.УстановитьПараметр("ТаблицаБанков", ТаблицаБанков);
			Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц();
			ВыборкаБанков = Запрос.Выполнить().Выбрать();
			Пока ВыборкаБанков.Следующий() Цикл
				СтрокаТаблицыЗначений = ТаблицаБанков.Найти(ВыборкаБанков.Ссылка, "Ссылка");
				Если СтрокаТаблицыЗначений <> Неопределено Тогда
					СтрокаТаблицыЗначений.Объект.РучноеИзменение = ВыборкаБанков.РучноеИзменение;
					ЗаписатьОбъектВИБ(СтрокаТаблицыЗначений.Объект,ТипЗнч(СтрокаТаблицыЗначений.Ссылка));
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
		Для Каждого ДокументСсылка Из Параметры.ДокументыСОпределениемДопРеквизитов Цикл
			
			ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
			Если ДокументОбъект = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			ТипОбъекта = ТипЗнч(ДокументСсылка);
			
			Если ТипОбъекта = Тип("ДокументСсылка.КорректировкаПоступления") Тогда
				
				Если ДокументОбъект.КорректироватьБУиНУ Тогда
					ДокументПоступленияСсылка = УчетНДСПереопределяемый.ПолучитьИсправляемыйДокументПоступления(ДокументОбъект.ДокументПоступления, Истина);
					
					РеквизитыДокументаПоступления = Неопределено;
					Если ЗначениеЗаполнено(ДокументПоступленияСсылка) Тогда
						РеквизитыДокументаПоступления = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументПоступленияСсылка, "Дата");
					КонецЕсли;
					ДатаДокументаПоступления	= ?(РеквизитыДокументаПоступления <> Неопределено, РеквизитыДокументаПоступления.Дата, '00010101');
					
					Если ЗначениеЗаполнено(ДокументПоступленияСсылка) 
						И Год(ДатаДокументаПоступления) < Год(ДокументОбъект.Дата) Тогда
						
						Если НЕ ЗначениеЗаполнено(ДокументОбъект.СтатьяПрочихДоходовИРасходов) Тогда
							ДокументОбъект.СтатьяПрочихДоходовИРасходов = ОбщегоНазначенияКлиентСервер.ПредопределенныйЭлемент("Справочник.ПрочиеДоходыИРасходы.ИсправительныеЗаписиПоОперациямПрошлыхЛет");
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
				
				ДокументОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
				СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(ДокументОбъект, РежимЗаписи);

			ИначеЕсли ТипОбъекта = Тип("ДокументСсылка.КорректировкаРеализации") Тогда
				
				ДокументОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);
				СчетаУчетаВДокументах.ЗаполнитьПередЗаписью(ДокументОбъект, РежимЗаписи);
				
			КонецЕсли;

			ЗаписатьОбъектВИБ(ДокументОбъект,ТипОбъекта);

		КонецЦикла;
	КонецЕсли;
	Если Параметры.КлассификаторТНВЭД.Количество() > 0 Тогда
		ПараметрыВыполнения = Новый Структура("ОбработкаЗавершена", Ложь);
		Справочники.КлассификаторТНВЭД.ЗаполнитьЕдиницуИзмеренияОтложенно(ПараметрыВыполнения)
		//ТаблицаКлассификатора = Справочники.КлассификаторТНВЭД.ТаблицаКлассификатораТНВЭД();
		//Для Каждого ЭлементКлассификатора Из Параметры.КлассификаторТНВЭД Цикл
		//	Справочники.КлассификаторТНВЭД.ЗаполнитьЕдиницуИзмерения(ЭлементКлассификатора , ТаблицаКлассификатора)
		//КонецЦикла;
	КонецЕсли;
	Справочники.НоменклатурныеГруппы.ПроверитьЗначениеОпцииИспользоватьНесколькоНоменклатурныхГру­пп();
	Справочники.Организации.ПерезаполнитьКонстантуИспользоватьНесколькоОрганизаций();
	Справочники.Склады.ПерезаполнитьКонстантуИспользоватьНесколькоСкладов();
	Справочники.Организации.ОбновитьИспользуемыеВидыОрганизаций();
	
	КоличествоОрганизаций = Справочники.Организации.КоличествоОрганизаций();
	ИспользуетсяНесколькоОрганизаций = Справочники.Организации.ИспользуетсяНесколькоОрганизаций();
	
	Если ИспользуетсяНесколькоОрганизаций = (КоличествоОрганизаций > 1) Тогда
		Если Параметры.ОсновныеДоговорыКонтрагентов.Количество() > 0 Тогда
			Для Каждого ОсновнойДоговорКонтрагента Из Параметры.ОсновныеДоговорыКонтрагентов Цикл
				РаботаСДоговорамиКонтрагентовБП.УстановитьОсновнойДоговорКонтрагента(ОсновнойДоговорКонтрагента);
			КонецЦикла;
		КонецЕсли;
	КонецЕсли;
	
КонецЕсли;
//+
Для Каждого ДокументСсылка Из Параметры.ТаблицаДокументов Цикл
	ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
	РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения;
	ДокументОбъект.Записать(РежимЗаписи);
КонецЦикла;
//+
</ПослеЗагрузкиДанных>
Показать


Может, кто-нибудь подскажет, в чем я заблудился и в какую сторону двигаться?
Найденные решения
2. ajhedz 16.07.18 23:04 Сейчас в теме
Вопрос разрешился самостоятельно.
Отмене документов мешали записи в Таблице Значений "ПолеДокументыДляОтложенногоПроведения" из модуля объекта обработки "КонвертацияОбъектовИнформационныхБаз".

После удаления из таблицы строк соответствующих необходимым для последующей отмены документов ссылок, синхронизация завершалась с отмененными для проведения документами.

Всем спасибо, все свободны, авось кому и пригодится.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ajhedz 16.07.18 23:04 Сейчас в теме
Вопрос разрешился самостоятельно.
Отмене документов мешали записи в Таблице Значений "ПолеДокументыДляОтложенногоПроведения" из модуля объекта обработки "КонвертацияОбъектовИнформационныхБаз".

После удаления из таблицы строк соответствующих необходимым для последующей отмены документов ссылок, синхронизация завершалась с отмененными для проведения документами.

Всем спасибо, все свободны, авось кому и пригодится.
3. mburkin 11 10.10.18 23:56 Сейчас в теме
А может мне кто объяснить что такое

ДокументОбъект.ДополнительныеСвойства.Вставить("ЗаполнитьСчетаУчетаПередЗаписью", Истина);


в обработчике После загрузки Данных?
У меня ругается -

Обработчик = ПослеЗагрузкиДанных (конвертация)
ОписаниеОшибки = Поле объекта не обнаружено (ДополнительныеСвойства)
ПозицияМодуля = ОбщийМодуль.СчетаУчетаВДокументах.Модуль(643)
КСообщенияОбОшибках = 23

Что это за ДополнительныеСвойства?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот