Что раньше - курица или яйцо? Как правильно выгрузить элемент1, содержащий ссылку на элемент2, и элемент2, у которого владелец - элемент1?

1. Vlad1917 56 08.05.20 01:28 Сейчас в теме
Ключевая проблема - то, что всё это не по guid выгружается, а по полям поиска.

Т. е., скажем, контрагент выгружается с полями поиска по ИНН и КПП. Среди реквизитов контрагента выгружается основной счёт. И сам этот основной счёт тоже с поиском: по номеру счёта, банку и владельцу-контрагенту.
И если сначала в базе-приёмнике записывать контрагента, то он не сможет определить основной счёт, т. к. тот ещё не записан. Если сначала основной счёт - то тот не сможет найти себе владельца, т. к. ещё не записан контрагент.

Почему не по guid - по нему не получится в силу особенностей баз.

Сейчас выгружаю контрагентов, их основные счета выгружаются перед ними (что логично), соответственно, остаются без владельцев.
Пытался в ПКО "контрагенты"/ПКС "основной счёт" передать этот счёт в параметр, с использованием соответствующего правила выгрузки счетов. Думал, уже на стороне приёмника может чего получится вытащить из этого параметра и разрулить. Безуспешно (в параметре <Пусто/>).

Если не придумается ничего лучше, то думаю отключить выгрузку основного счёта у контрагента, и уже в событии "после выгрузки в файл" у ПКО Контрагенты записывать этот основной счёт при помощи "ВыгрузитьПоПравилу". Лучше контрагент без основного счёта, чем счёт без владельца. Тем более, может, соображу, как при записи счёта записывать его в основные к (уже записанному к этому времени) контрагенту.
Отсюда вопрос. Может, всё же можно это как-то красивее сделать, чтоб и контрагент с основным счётом был, и счёт с владельцем, без таких извращений?
Найденные решения
12. Vlad1917 56 08.05.20 15:37 Сейчас в теме
Спасибо всем за идеи. Кому попадаются только умные задачи - остаётся только порадоваться за него.
Раз ничего интереснее не придумалось, сделал так, как и собирался.
В ПКО контрагента отключил ПКС ОсновноеКонтактноеЛицо и ОсновнойБанковскийСчет
Туда же в "После выгрузки в файл" добавил
ОсновноеКонтактноеЛицо = Источник.ОсновноеКонтактноеЛицо;
Если ЗначениеЗаполнено(ОсновноеКонтактноеЛицо) Тогда
	Основное = Новый Структура("Основное", "ОсновноеКонтактноеЛицо");
	ВыгрузитьПоПравилу(ОсновноеКонтактноеЛицо, , , Основное, "КонтактныеЛица");
КонецЕсли;

ОсновнойБанковскийСчет = Источник.ОсновнойБанковскийСчет;
Если ЗначениеЗаполнено(ОсновнойБанковскийСчет) Тогда
	Основное = Новый Структура("Основное", "ОсновнойБанковскийСчет");
	ВыгрузитьПоПравилу(ОсновнойБанковскийСчет, , , Основное,"БанковскиеСчета");
КонецЕсли;
Показать

чтоб эти данные писались не перед Контрагентами, а после.


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

Да, тут эти данные оказались в Исходящих.
В итоге в приёмник в таких случаях (когда выгружаются не просто счета и контактные лица, а по ссылке из контрагентов) с этими счетами и КЛ попадает название реквизита Контрагента, который надо заполнить своими ссылками.

В ПКО БанковскиеСчета (и похожее в КЛ) в "После загрузки" добавил
Владелец = Объект.Владелец;
Выполнить(Алгоритмы.ЗаполнитьСобойРеквизитВладельца);

, где алгоритм выглядит как
Основное = ПараметрыОбъекта["Основное"];
Если ЗначениеЗаполнено(Владелец) И ЗначениеЗаполнено(Основное) Тогда
	СсылкаОбъекта = "";
	Выполнить(Алгоритмы.ПолучитьСсылкуОбъекта);
	Если Владелец[Основное] <> СсылкаОбъекта Тогда
		ВладелецОбъект = Владелец.ПолучитьОбъект();
		ВладелецОбъект[Основное] = СсылкаОбъекта;
		ВладелецОбъект.ОбменДанными.Загрузка = Истина;
		ВладелецОбъект.Записать();
	КонецЕсли;
КонецЕсли;
Показать


При выгрузке контрагентов со счетами и КЛ, которые они за собой тянут, в пустую базу всё встаёт правильно. Если выгружать в пустую базу отдельно счета, то они в стандартном режиме тянут перед собой контрагентов-владельцев, но за отсутствием информации об "основное" в основные счета к нему не записываются.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ab_initio 95 08.05.20 05:13 Сейчас в теме
(1)
Ключевая проблема - то, что всё это не по guid выгружается, а по полям поиска
.
Беду бедовую Вы описываете. Мне кажется, как раз это и есть корень зла и причина извращений. А в чем состоит "особенность баз", что никак нельзя перейти к выгрузке по UUID? Нельзя ли как-то забороть эту причину?
Vlad1917; +1 Ответить
11. Vlad1917 56 08.05.20 14:56 Сейчас в теме
(2)
Баз - бухгалтерий штук 20, организаций и того больше. Их делали всяко-разными способами. В том числе размножали из рабочих баз ДТшками. Ну а чего? Удобно же! Уже и учётные политики настроены, и многое другое готово. А раз есть какие-то элементы, которые не нужны в конкретной базе - чего б их не переименовать в нужные? Да и новых одинаковых элементов в разных базах подобавляли.
А "упс" случился тогда, когда встал вопрос о том, чтоб сделать центральную базу для управления НСИ, в которую слить всю НСИ из остальных баз.
3. пользователь 08.05.20 07:22
Сообщение было скрыто модератором.
...
4. Salavat 14 08.05.20 08:04 Сейчас в теме
(1)
Отсюда вопрос. Может, всё же можно это как-то красивее сделать, чтоб и контрагент с основным счётом был, и счёт с владельцем, без таких извращений?
ответ -

Алгоритм элементарный:

1. Выгружаем Контрагента.
2. Выгружаем Расчётный Счёт.
3. У контрагента - указываем Расчётный Счёт (из п.2). Каким образом - любым, удобным Вам, лично.
5. karamazoff 98 08.05.20 08:30 Сейчас в теме
(4)а если расчетных счетов у кк несколько, какой указывать основным?
6. Salavat 14 08.05.20 08:43 Сейчас в теме
(5)
(какойто глупый вопрос - моё мнение)
какой (кому - спросите) нужно - тот и указывайте.

Если тотже, который в источнике, основной (обычная ситуация - для переноса) - это и есть ответ.
8. karamazoff 98 08.05.20 09:40 Сейчас в теме
(6)в источнике есть контрагент1 и 3-и расчетных счета р1,р2,р3. у контрагент1 в реквизите ОсновнойРс указан счет р2.
при конвертации по вашему элементарному алгоритму в приемник попадает сначала контрагент, а так как в этот момент р/с еще не загружены, то реквизит ОсновнойРс у него остается незаполненным, и мы теряем информацию о том, какой именно из загруженных впоследствии р/с должен быть основным.
Если на 1 конт только 1р/с тогда, да, работать будет, при загрузке р/с в приемнике можно проверить заполнен ли у владельца основнойРс и если нет, подставлять себя
7. nomad_irk 76 08.05.20 08:59 Сейчас в теме
(1)Могу предложить кардинальный вариант решения задачи: создать регистр сведений "основные счета контрагентов" в обеих базах.

В ПКО для Контрагенты/БанковскиеСчета выключен флажок "не выгружать объекты свойств источника по ссылкам"?
9. Salavat 14 08.05.20 09:46 Сейчас в теме
(7)
согласен - один из тупых методов решения, тупых задач.
Скрытый текст
10. maks_20 165 08.05.20 11:06 Сейчас в теме
Все это решаемо установкой приоритетов выгрузки. К примеру можно создать еще одно правило для контрагентов (без заполнения счета), в банковских счетах для владельца указать это правило, выгрузить банковские счета, далее выгрузить контрагентов по правилу, в котором уже есть банковский счет. Т.к. к моменту выгрузки ссылки на счета уже будут в приемнике, то загрузка пройдет нормально. (думаю такая схема будет отрабатывать, правда не самый оптимальный вариант получается)
Vlad1917; +1 Ответить
12. Vlad1917 56 08.05.20 15:37 Сейчас в теме
Спасибо всем за идеи. Кому попадаются только умные задачи - остаётся только порадоваться за него.
Раз ничего интереснее не придумалось, сделал так, как и собирался.
В ПКО контрагента отключил ПКС ОсновноеКонтактноеЛицо и ОсновнойБанковскийСчет
Туда же в "После выгрузки в файл" добавил
ОсновноеКонтактноеЛицо = Источник.ОсновноеКонтактноеЛицо;
Если ЗначениеЗаполнено(ОсновноеКонтактноеЛицо) Тогда
	Основное = Новый Структура("Основное", "ОсновноеКонтактноеЛицо");
	ВыгрузитьПоПравилу(ОсновноеКонтактноеЛицо, , , Основное, "КонтактныеЛица");
КонецЕсли;

ОсновнойБанковскийСчет = Источник.ОсновнойБанковскийСчет;
Если ЗначениеЗаполнено(ОсновнойБанковскийСчет) Тогда
	Основное = Новый Структура("Основное", "ОсновнойБанковскийСчет");
	ВыгрузитьПоПравилу(ОсновнойБанковскийСчет, , , Основное,"БанковскиеСчета");
КонецЕсли;
Показать

чтоб эти данные писались не перед Контрагентами, а после.


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

Да, тут эти данные оказались в Исходящих.
В итоге в приёмник в таких случаях (когда выгружаются не просто счета и контактные лица, а по ссылке из контрагентов) с этими счетами и КЛ попадает название реквизита Контрагента, который надо заполнить своими ссылками.

В ПКО БанковскиеСчета (и похожее в КЛ) в "После загрузки" добавил
Владелец = Объект.Владелец;
Выполнить(Алгоритмы.ЗаполнитьСобойРеквизитВладельца);

, где алгоритм выглядит как
Основное = ПараметрыОбъекта["Основное"];
Если ЗначениеЗаполнено(Владелец) И ЗначениеЗаполнено(Основное) Тогда
	СсылкаОбъекта = "";
	Выполнить(Алгоритмы.ПолучитьСсылкуОбъекта);
	Если Владелец[Основное] <> СсылкаОбъекта Тогда
		ВладелецОбъект = Владелец.ПолучитьОбъект();
		ВладелецОбъект[Основное] = СсылкаОбъекта;
		ВладелецОбъект.ОбменДанными.Загрузка = Истина;
		ВладелецОбъект.Записать();
	КонецЕсли;
КонецЕсли;
Показать


При выгрузке контрагентов со счетами и КЛ, которые они за собой тянут, в пустую базу всё встаёт правильно. Если выгружать в пустую базу отдельно счета, то они в стандартном режиме тянут перед собой контрагентов-владельцев, но за отсутствием информации об "основное" в основные счета к нему не записываются.
Оставьте свое сообщение

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