Имя: Пароль:
1C
1С v8
Перенос данных по правилам Конвертации, нужен совет!
,
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) опросец такой - если по реквизитам загружаемых документов понятно, вы делаете Объект.ДоговорКонтрагента = РаботаСДоговорамиКонтрагентовБП.ДоговорКонтрагентаИзОбъекта(Объект);
то ТЧ РасшифровкаПлатежа как в ней договор заполняете?
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой