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