Чтобы в обмене из УНФ в БП не уходили лишние организации

В УНФ в узле обмена с бухгалтерией стоит обмен только по одной организации. Однако по какой-то непонятной причине в бухгалтерию уходят еще и другие элементы справочника «Организации».

Как-то ранее я разбирался в вопросе и обнаружил, что «лишние» организации добавляются в процедуре УзлыДляРегистрацииПоУсловиюВыгружатьПриНеобходимости, там работает запрос:

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ШапкаПланаОбмена.Ссылка КАК Узел
ИЗ
    ПланОбмена.СинхронизацияДанныхЧерезУниверсальныйФормат КАК ШапкаПланаОбмена
ЛЕВОЕ СОЕДИНЕНИЕ
    РегистрСведений.ДанныеОбъектовДляРегистрацииВОбменах КАК ДанныеОбъектовДляРегистрацииВОбменах
ПО
    ШапкаПланаОбмена.Ссылка = ДанныеОбъектовДляРегистрацииВОбменах.УзелИнформационнойБазы
    И ДанныеОбъектовДляРегистрацииВОбменах.Ссылка = &Объект
ГДЕ
         НЕ ШапкаПланаОбмена.ЭтотУзел
    И    ШапкаПланаОбмена.РежимВыгрузкиСправочников = ЗНАЧЕНИЕ(Перечисление.РежимыВыгрузкиОбъектовОбмена.ВыгружатьПриНеобходимости)
    И НЕ ШапкаПланаОбмена.ПометкаУдаления
    И    ДанныеОбъектовДляРегистрацииВОбменах.Ссылка = &Объект

Даже обсуждал это на Мисте, но объяснения, почему так происходит, не получил.

В итоге, не стал разбираться, почему так происходит, просто решил удалять такие «лишние записи» по мере их появления, перед записью набора регистра сведений.

Однако столкнулся с проблемой, что когда я пытаюсь записать пустой набор записей, получаю платформенную ошибку » Запись не верна! Набор записей, принадлежащий менеджеру записи должен содержать ровно 1 запись «:

Эта ошибка даже не отключается записью в режиме обмена данными — загрузка — истина.

По поводу ошибки спросил на Мисте. Но, увы, тоже ничего не подсказали.

Тогда я пошел обходным путем. Вообще, перед записью вызывается дважды — сначала записывается пустой набор записей для удаления предыдущей записи, потом записывается нормальный набор, где 1С ожидает видеть одну запись.

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

Итоговый код вышел таким:


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

В нем даже есть защита от зацикливания, потому что если запись с пустой организацией есть, ее нужно сначала удалить. Всё очень хитро!

Объем: 2 час. Среда: 1.6.24.107.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментариев 5

  1. Zuko:

    А ведь можно было анализировать ПРИзаписи (по сути действие после) и там создавать набор записей и очищать его

  2. Ник:

    Думаю, нужно внимательнее присмотреться к РежимВыгрузкиСправочников.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *