Что раньше - курица или яйцо? Как правильно выгрузить элемент1, содержащий ссылку на элемент2, и элемент2, у которого владелец - элемент1?
Ключевая проблема - то, что всё это не по guid выгружается, а по полям поиска.
Т. е., скажем, контрагент выгружается с полями поиска по ИНН и КПП. Среди реквизитов контрагента выгружается основной счёт. И сам этот основной счёт тоже с поиском: по номеру счёта, банку и владельцу-контрагенту.
И если сначала в базе-приёмнике записывать контрагента, то он не сможет определить основной счёт, т. к. тот ещё не записан. Если сначала основной счёт - то тот не сможет найти себе владельца, т. к. ещё не записан контрагент.
Почему не по guid - по нему не получится в силу особенностей баз.
Сейчас выгружаю контрагентов, их основные счета выгружаются перед ними (что логично), соответственно, остаются без владельцев.
Пытался в ПКО "контрагенты"/ПКС "основной счёт" передать этот счёт в параметр, с использованием соответствующего правила выгрузки счетов. Думал, уже на стороне приёмника может чего получится вытащить из этого параметра и разрулить. Безуспешно (в параметре <Пусто/>).
Если не придумается ничего лучше, то думаю отключить выгрузку основного счёта у контрагента, и уже в событии "после выгрузки в файл" у ПКО Контрагенты записывать этот основной счёт при помощи "ВыгрузитьПоПравилу". Лучше контрагент без основного счёта, чем счёт без владельца. Тем более, может, соображу, как при записи счёта записывать его в основные к (уже записанному к этому времени) контрагенту.
Отсюда вопрос. Может, всё же можно это как-то красивее сделать, чтоб и контрагент с основным счётом был, и счёт с владельцем, без таких извращений?
Т. е., скажем, контрагент выгружается с полями поиска по ИНН и КПП. Среди реквизитов контрагента выгружается основной счёт. И сам этот основной счёт тоже с поиском: по номеру счёта, банку и владельцу-контрагенту.
И если сначала в базе-приёмнике записывать контрагента, то он не сможет определить основной счёт, т. к. тот ещё не записан. Если сначала основной счёт - то тот не сможет найти себе владельца, т. к. ещё не записан контрагент.
Почему не по guid - по нему не получится в силу особенностей баз.
Сейчас выгружаю контрагентов, их основные счета выгружаются перед ними (что логично), соответственно, остаются без владельцев.
Пытался в ПКО "контрагенты"/ПКС "основной счёт" передать этот счёт в параметр, с использованием соответствующего правила выгрузки счетов. Думал, уже на стороне приёмника может чего получится вытащить из этого параметра и разрулить. Безуспешно (в параметре <Пусто/>).
Если не придумается ничего лучше, то думаю отключить выгрузку основного счёта у контрагента, и уже в событии "после выгрузки в файл" у ПКО Контрагенты записывать этот основной счёт при помощи "ВыгрузитьПоПравилу". Лучше контрагент без основного счёта, чем счёт без владельца. Тем более, может, соображу, как при записи счёта записывать его в основные к (уже записанному к этому времени) контрагенту.
Отсюда вопрос. Может, всё же можно это как-то красивее сделать, чтоб и контрагент с основным счётом был, и счёт с владельцем, без таких извращений?
Найденные решения
Спасибо всем за идеи. Кому попадаются только умные задачи - остаётся только порадоваться за него.
Раз ничего интереснее не придумалось, сделал так, как и собирался.
В ПКО контрагента отключил ПКС ОсновноеКонтактноеЛицо и ОсновнойБанковскийСчет
Туда же в "После выгрузки в файл" добавил
чтоб эти данные писались не перед Контрагентами, а после.
в ПКО "БанковскиеСчета" (и "КонтактныеЛица") добавил ПКС с "передавать данные в параметр ", параметр назвал "Основное", и ему в "перед выгрузкой" воткнул
Да, тут эти данные оказались в Исходящих.
В итоге в приёмник в таких случаях (когда выгружаются не просто счета и контактные лица, а по ссылке из контрагентов) с этими счетами и КЛ попадает название реквизита Контрагента, который надо заполнить своими ссылками.
В ПКО БанковскиеСчета (и похожее в КЛ) в "После загрузки" добавил
, где алгоритм выглядит как
При выгрузке контрагентов со счетами и КЛ, которые они за собой тянут, в пустую базу всё встаёт правильно. Если выгружать в пустую базу отдельно счета, то они в стандартном режиме тянут перед собой контрагентов-владельцев, но за отсутствием информации об "основное" в основные счета к нему не записываются.
Раз ничего интереснее не придумалось, сделал так, как и собирался.
В ПКО контрагента отключил ПКС ОсновноеКонтактноеЛицо и ОсновнойБанковскийСчет
Туда же в "После выгрузки в файл" добавил
ОсновноеКонтактноеЛицо = Источник.ОсновноеКонтактноеЛицо;
Если ЗначениеЗаполнено(ОсновноеКонтактноеЛицо) Тогда
Основное = Новый Структура("Основное", "ОсновноеКонтактноеЛицо");
ВыгрузитьПоПравилу(ОсновноеКонтактноеЛицо, , , Основное, "КонтактныеЛица");
КонецЕсли;
ОсновнойБанковскийСчет = Источник.ОсновнойБанковскийСчет;
Если ЗначениеЗаполнено(ОсновнойБанковскийСчет) Тогда
Основное = Новый Структура("Основное", "ОсновнойБанковскийСчет");
ВыгрузитьПоПравилу(ОсновнойБанковскийСчет, , , Основное,"БанковскиеСчета");
КонецЕсли;
Показатьчтоб эти данные писались не перед Контрагентами, а после.
в ПКО "БанковскиеСчета" (и "КонтактныеЛица") добавил ПКС с "передавать данные в параметр ", параметр назвал "Основное", и ему в "перед выгрузкой" воткнул
Если ТипЗнч(ИсходящиеДанные) = Тип("Структура") И ИсходящиеДанные.Свойство("Основное") Тогда
Значение = ИсходящиеДанные.Основное;
ИсходящиеДанные.Удалить("Основное");
Иначе
Отказ = Истина;
КонецЕсли;
Да, тут эти данные оказались в Исходящих.
В итоге в приёмник в таких случаях (когда выгружаются не просто счета и контактные лица, а по ссылке из контрагентов) с этими счетами и КЛ попадает название реквизита Контрагента, который надо заполнить своими ссылками.
В ПКО БанковскиеСчета (и похожее в КЛ) в "После загрузки" добавил
Владелец = Объект.Владелец;
Выполнить(Алгоритмы.ЗаполнитьСобойРеквизитВладельца);
, где алгоритм выглядит как
Основное = ПараметрыОбъекта["Основное"];
Если ЗначениеЗаполнено(Владелец) И ЗначениеЗаполнено(Основное) Тогда
СсылкаОбъекта = "";
Выполнить(Алгоритмы.ПолучитьСсылкуОбъекта);
Если Владелец[Основное] <> СсылкаОбъекта Тогда
ВладелецОбъект = Владелец.ПолучитьОбъект();
ВладелецОбъект[Основное] = СсылкаОбъекта;
ВладелецОбъект.ОбменДанными.Загрузка = Истина;
ВладелецОбъект.Записать();
КонецЕсли;
КонецЕсли;
ПоказатьПри выгрузке контрагентов со счетами и КЛ, которые они за собой тянут, в пустую базу всё встаёт правильно. Если выгружать в пустую базу отдельно счета, то они в стандартном режиме тянут перед собой контрагентов-владельцев, но за отсутствием информации об "основное" в основные счета к нему не записываются.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Беду бедовую Вы описываете. Мне кажется, как раз это и есть корень зла и причина извращений. А в чем состоит "особенность баз", что никак нельзя перейти к выгрузке по UUID? Нельзя ли как-то забороть эту причину?
Ключевая проблема - то, что всё это не по guid выгружается, а по полям поиска
.
Беду бедовую Вы описываете. Мне кажется, как раз это и есть корень зла и причина извращений. А в чем состоит "особенность баз", что никак нельзя перейти к выгрузке по UUID? Нельзя ли как-то забороть эту причину?
(2)
Баз - бухгалтерий штук 20, организаций и того больше. Их делали всяко-разными способами. В том числе размножали из рабочих баз ДТшками. Ну а чего? Удобно же! Уже и учётные политики настроены, и многое другое готово. А раз есть какие-то элементы, которые не нужны в конкретной базе - чего б их не переименовать в нужные? Да и новых одинаковых элементов в разных базах подобавляли.
А "упс" случился тогда, когда встал вопрос о том, чтоб сделать центральную базу для управления НСИ, в которую слить всю НСИ из остальных баз.
Баз - бухгалтерий штук 20, организаций и того больше. Их делали всяко-разными способами. В том числе размножали из рабочих баз ДТшками. Ну а чего? Удобно же! Уже и учётные политики настроены, и многое другое готово. А раз есть какие-то элементы, которые не нужны в конкретной базе - чего б их не переименовать в нужные? Да и новых одинаковых элементов в разных базах подобавляли.
А "упс" случился тогда, когда встал вопрос о том, чтоб сделать центральную базу для управления НСИ, в которую слить всю НСИ из остальных баз.
(1)
Алгоритм элементарный:
1. Выгружаем Контрагента.
2. Выгружаем Расчётный Счёт.
3. У контрагента - указываем Расчётный Счёт (из п.2). Каким образом - любым, удобным Вам, лично.
Отсюда вопрос. Может, всё же можно это как-то красивее сделать, чтоб и контрагент с основным счётом был, и счёт с владельцем, без таких извращений?
ответ -
Алгоритм элементарный:
1. Выгружаем Контрагента.
2. Выгружаем Расчётный Счёт.
3. У контрагента - указываем Расчётный Счёт (из п.2). Каким образом - любым, удобным Вам, лично.
(6)в источнике есть контрагент1 и 3-и расчетных счета р1,р2,р3. у контрагент1 в реквизите ОсновнойРс указан счет р2.
при конвертации по вашему элементарному алгоритму в приемник попадает сначала контрагент, а так как в этот момент р/с еще не загружены, то реквизит ОсновнойРс у него остается незаполненным, и мы теряем информацию о том, какой именно из загруженных впоследствии р/с должен быть основным.
Если на 1 конт только 1р/с тогда, да, работать будет, при загрузке р/с в приемнике можно проверить заполнен ли у владельца основнойРс и если нет, подставлять себя
при конвертации по вашему элементарному алгоритму в приемник попадает сначала контрагент, а так как в этот момент р/с еще не загружены, то реквизит ОсновнойРс у него остается незаполненным, и мы теряем информацию о том, какой именно из загруженных впоследствии р/с должен быть основным.
Если на 1 конт только 1р/с тогда, да, работать будет, при загрузке р/с в приемнике можно проверить заполнен ли у владельца основнойРс и если нет, подставлять себя
Все это решаемо установкой приоритетов выгрузки. К примеру можно создать еще одно правило для контрагентов (без заполнения счета), в банковских счетах для владельца указать это правило, выгрузить банковские счета, далее выгрузить контрагентов по правилу, в котором уже есть банковский счет. Т.к. к моменту выгрузки ссылки на счета уже будут в приемнике, то загрузка пройдет нормально. (думаю такая схема будет отрабатывать, правда не самый оптимальный вариант получается)
Спасибо всем за идеи. Кому попадаются только умные задачи - остаётся только порадоваться за него.
Раз ничего интереснее не придумалось, сделал так, как и собирался.
В ПКО контрагента отключил ПКС ОсновноеКонтактноеЛицо и ОсновнойБанковскийСчет
Туда же в "После выгрузки в файл" добавил
чтоб эти данные писались не перед Контрагентами, а после.
в ПКО "БанковскиеСчета" (и "КонтактныеЛица") добавил ПКС с "передавать данные в параметр ", параметр назвал "Основное", и ему в "перед выгрузкой" воткнул
Да, тут эти данные оказались в Исходящих.
В итоге в приёмник в таких случаях (когда выгружаются не просто счета и контактные лица, а по ссылке из контрагентов) с этими счетами и КЛ попадает название реквизита Контрагента, который надо заполнить своими ссылками.
В ПКО БанковскиеСчета (и похожее в КЛ) в "После загрузки" добавил
, где алгоритм выглядит как
При выгрузке контрагентов со счетами и КЛ, которые они за собой тянут, в пустую базу всё встаёт правильно. Если выгружать в пустую базу отдельно счета, то они в стандартном режиме тянут перед собой контрагентов-владельцев, но за отсутствием информации об "основное" в основные счета к нему не записываются.
Раз ничего интереснее не придумалось, сделал так, как и собирался.
В ПКО контрагента отключил ПКС ОсновноеКонтактноеЛицо и ОсновнойБанковскийСчет
Туда же в "После выгрузки в файл" добавил
ОсновноеКонтактноеЛицо = Источник.ОсновноеКонтактноеЛицо;
Если ЗначениеЗаполнено(ОсновноеКонтактноеЛицо) Тогда
Основное = Новый Структура("Основное", "ОсновноеКонтактноеЛицо");
ВыгрузитьПоПравилу(ОсновноеКонтактноеЛицо, , , Основное, "КонтактныеЛица");
КонецЕсли;
ОсновнойБанковскийСчет = Источник.ОсновнойБанковскийСчет;
Если ЗначениеЗаполнено(ОсновнойБанковскийСчет) Тогда
Основное = Новый Структура("Основное", "ОсновнойБанковскийСчет");
ВыгрузитьПоПравилу(ОсновнойБанковскийСчет, , , Основное,"БанковскиеСчета");
КонецЕсли;
Показатьчтоб эти данные писались не перед Контрагентами, а после.
в ПКО "БанковскиеСчета" (и "КонтактныеЛица") добавил ПКС с "передавать данные в параметр ", параметр назвал "Основное", и ему в "перед выгрузкой" воткнул
Если ТипЗнч(ИсходящиеДанные) = Тип("Структура") И ИсходящиеДанные.Свойство("Основное") Тогда
Значение = ИсходящиеДанные.Основное;
ИсходящиеДанные.Удалить("Основное");
Иначе
Отказ = Истина;
КонецЕсли;
Да, тут эти данные оказались в Исходящих.
В итоге в приёмник в таких случаях (когда выгружаются не просто счета и контактные лица, а по ссылке из контрагентов) с этими счетами и КЛ попадает название реквизита Контрагента, который надо заполнить своими ссылками.
В ПКО БанковскиеСчета (и похожее в КЛ) в "После загрузки" добавил
Владелец = Объект.Владелец;
Выполнить(Алгоритмы.ЗаполнитьСобойРеквизитВладельца);
, где алгоритм выглядит как
Основное = ПараметрыОбъекта["Основное"];
Если ЗначениеЗаполнено(Владелец) И ЗначениеЗаполнено(Основное) Тогда
СсылкаОбъекта = "";
Выполнить(Алгоритмы.ПолучитьСсылкуОбъекта);
Если Владелец[Основное] <> СсылкаОбъекта Тогда
ВладелецОбъект = Владелец.ПолучитьОбъект();
ВладелецОбъект[Основное] = СсылкаОбъекта;
ВладелецОбъект.ОбменДанными.Загрузка = Истина;
ВладелецОбъект.Записать();
КонецЕсли;
КонецЕсли;
ПоказатьПри выгрузке контрагентов со счетами и КЛ, которые они за собой тянут, в пустую базу всё встаёт правильно. Если выгружать в пустую базу отдельно счета, то они в стандартном режиме тянут перед собой контрагентов-владельцев, но за отсутствием информации об "основное" в основные счета к нему не записываются.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот