|
Перенос данных по правилам Конвертации, нужен совет! | ☑ | ||
---|---|---|---|---|
0
tciban
26.12.22
✎
08:24
|
Уважаемые коллеги! Есть УТ 10.3 (несколько переписанная) и есть Бухгалтерия 3.0, как водиться нетронутая, исправно обновляемая и все такое. И есть обмен между ними, точнее выгрузка документов из УТ в Бух, сделан по правилам конвертации 2.0
В чем загвоздка? В УТ есть разные у контрагентов договоры, всякое там, а бухгалтерии нужно что бы все операции контрагента проходили по одному, основному, договору и все. Без всяких изысков. Ну т.е. при переносе документа если у контрагента нет еще договора (новый к примеру) - переносим и делаем основным, если же уже есть у контрагента договор основной - то его везде и ставим в переносимый документ. Хорошо, сделал я в правилах общий алгоритм и вызываю его для каждого объекта в обработчике соббытий "После загрузки". Вот он, этот алгоритм: Если Объект.Метаданные().Реквизиты.Найти("Контрагент") <> Неопределено И Объект.Метаданные().Реквизиты.Найти("ДоговорКонтрагента") <> Неопределено Тогда Если ЗначениеЗаполнено(Объект.Контрагент) И ТипЗнч(Объект.Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда ОсновнойДоговор = РегистрыСведений.ОсновныеДоговорыКонтрагента.Получить(Новый Структура("Организация, Контрагент, ВидДоговора", Объект.Организация, Объект.Контрагент, Объект.ДоговорКонтрагента.ВидДоговора)).Договор; Если ЗначениеЗаполнено(ОсновнойДоговор) Тогда Объект.ДоговорКонтрагента = ОсновнойДоговор; Иначе МЗ = РегистрыСведений.ОсновныеДоговорыКонтрагента.СоздатьМенеджерЗаписи(); МЗ.Организация = Объект.Организация; МЗ.Контрагент = Объект.Контрагент; МЗ.ВидДоговора = Объект.ДоговорКонтрагента.ВидДоговора; МЗ.Договор = Объект.ДоговорКонтрагента; МЗ.Записать(); ОсновнойДоговор = Объект.ДоговорКонтрагента; КонецЕсли; ЕстьТЧ = Объект.Метаданные().ТабличныеЧасти.Найти("РасшифровкаПлатежа") <> Неопределено; //надо установить договор Если ЕстьТЧ Тогда Для Каждого Стр Из Объект.РасшифровкаПлатежа Цикл Стр.ДоговорКонтрагента = ОсновнойДоговор; КонецЦикла; КонецЕсли; КонецЕсли; КонецЕсли; И все бы хорошо, и вроде работает. Но иногда при переносе вдруг как замениться у какого нибудь контрагента основной договор на новый или того хуже - сделается 2 совершенно одинаковых договора и все разъезжается :( И не пойму что делать и как отловить где у меня ошибка! Подскажите, уважаемые коллеги и своего опыта - где копать, или как сделать иначе? А то опыта (уж так сложилось) у меня работы с првилами маловато, как то раньше без этого обходился. |
|||
1
Мимохожий Однако
26.12.22
✎
08:43
|
Если лечить со стороны бухгалтерии, то достаточно пометить на удаление второй договор (дубль созданный позже) и заменить на первый. А то,что лежит под словом "иногда" требует дополнительного исследования.
|
|||
2
программистище
26.12.22
✎
09:15
|
проверяй что у тебя в "Организация, Контрагент, ВидДоговора"
возможно не находит и создает |
|||
3
tciban
26.12.22
✎
09:31
|
(2) Спасибо, это учту сейчас прям.
А вообще я уже от отчаяния решил расширение навесить на справочник Договоры, там событие ПриЗаписи отлавливать. Но потом понял, что совершенно не знаю что делать в этом событии. Ну вот пишем мы справочник и что? Максимум могу залогировать факт создания нового договора, когда и так уже есть основной. Даже отказ зафигачить не могу - весь перенос встанет и все... |
|||
4
unbred
26.12.22
✎
09:32
|
сначала по УИДу проверяй, если не нашёл, тогда уже свои проверки вколачивай.
|
|||
5
tciban
26.12.22
✎
09:36
|
(4) А вот тут не понял - а что проверять по УИДу, если мне вовсе и не нужен исходный договор из УТ?
|
|||
6
Builder
26.12.22
✎
10:02
|
(0) Добавь проверку на основной договор в "Договоры"-"После загрузки"
|
|||
7
Dmitrii
гуру
26.12.22
✎
10:15
|
(0) >> вдруг как ... сделается 2 совершенно одинаковых договора.
Это логично. Ты же делаешь всё в событии ПослеЗагрузки. То есть и документ и договор уже загружены в базу. Не знаю какие правила поиска указаны у тебя в правилах для справочника ДоговорыКонтрагентов, но, по всей видимости, по этим правилам поиска договор не находится и создаётся новый. >> вдруг как замениться у какого-нибудь контрагента основной договор на новый. Это маловероятно. Тут возможны несколько вариантов. 1. Кто-то из пользователей меняет основной договор после загрузки. 2. Где-то ещё происходит запись основного договора. Например, есть отдельные правила для регистра ОсновныеДоговорыКонтрагента. Или в правилах обмена для самого справочника ДоговорыКонтрагентов или для другого(их) документа(ов). 3. Основной договор вообще не был указан у контрагента. То есть договор нужного вида в базе уже был (создан вручную или загружался), но он не был указан в качестве основного. По твоим правилам загрузился новый элемент справочника ДоговорыКонтрагентов и установился основным (была добавлена запись в регистр ОсновныеДоговорыКонтрагента). Это то, что сразу приходит в голову. Варианты решения могут быть разными. На первый взгляд, самый простой - написать правила поиска для справочника ДоговорыКонтрагентов. В ПоляхПоиска написать алгоритм поиска по регистру ОсновныеДоговорыКонтрагента и если поиск успешен, то установить значение СсылкаНаОбъект. Но этот вариант подходит только в том случае, если данная подмена (все договоры - на основной) используется для всех документов. Если для отдельных документов надо как-то по-другому загружать договоры, то так делать нельзя. |
|||
8
tciban
26.12.22
✎
11:05
|
(7) Верно, метод которым я делаю - неправильный, надо как то изменить поиск договора при переносе, но как и где это сделать!
|
|||
9
tciban
26.12.22
✎
11:07
|
(7) для всех документов так, видимо надо исправить правила поиска договора. Но разве не ищет сначала по умолчанию по УИД?
|
|||
10
mistеr
26.12.22
✎
11:14
|
(0) Может я чего-то не вижу, но по-моему, все просто. Какой договор стоит в УТ пофиг. В БП ставим основной, если он есть. Если нет, то тут же создаем, не из УТ-шного, а просто по шаблону, и делаем основным.
|
|||
11
tciban
26.12.22
✎
11:20
|
(10) Ну звучит то правильно, но где, в каком месте это прописать? В правилах, в каком то обработчике события?
|
|||
12
KJlag
26.12.22
✎
11:22
|
(0) Если вам вообще не нужны договоры из УТ
отключить вообще выгрузку свойства ДоговорыКонтрагентов у документов, и проводить поиск нужного Договора в ПослеЗагрузки, а если не нашли то создаем по шаблону как предложили в (10)? |
|||
13
mistеr
26.12.22
✎
11:23
|
(11) Можно в ПКС договора, можно в ПКО документа ПослеЗагрузки
|
|||
14
tciban
26.12.22
✎
11:25
|
(12) О! А что, так можно было?
|
|||
15
Builder
26.12.22
✎
11:30
|
(14) Да, кстати, не успел в (6) дописать то.
В правилах договоров галка "Не создавать новые если не найдено". Там же проверка на основной договор в "Договоры"-"После загрузки", если найден и не основной. в документах "после загрузки" такой код: Объект.ДоговорКонтрагента = РаботаСДоговорамиКонтрагентовБП.ДоговорКонтрагентаИзОбъекта(Объект); |
|||
16
tciban
26.12.22
✎
12:06
|
(15) Вот спасибо! Кажется я сегодня решу эту проблему раз и навсегда!
|
|||
17
Builder
26.12.22
✎
12:12
|
(16) Ну это не факт, но у меня такая схема работает.
Еще расширение добавлено - банковская выписка если создает договор - делает его сразу основным. |
|||
18
tciban
28.12.22
✎
10:49
|
(15) опросец такой - если по реквизитам загружаемых документов понятно, вы делаете Объект.ДоговорКонтрагента = РаботаСДоговорамиКонтрагентовБП.ДоговорКонтрагентаИзОбъекта(Объект);
то ТЧ РасшифровкаПлатежа как в ней договор заполняете? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |