Связь дочернего объекта между двумя объектами

Авдейчик

Продвинутый
Добрый день, столкнулся с проблемой. У меня на работе как и у многих присутствуют КЛИЕНТЫ и ПОСТАВЩИКИ. Схемы работы бывают разные: у КЛИЕНТА может быть много ПОСТАВЩИКОВ и наоборот. Иногда случается так, что ПОСТАВЩИК или КЛИЕНТ может быть один у соответственно разных КЛИЕНТА и ПОСТАВЩИКА. Как это работает: В форме связи с объектом КЛИЕНТ я могу создать клиента и в дочернем объекте присвоить ему ПОСТАВЩИКА, который отобразится в объекте поставщик. Таких ПОСТАВЩИКОВ я могу к полю КЛИЕНТ сделать бесконечно много и все работает. Пока все четко. Но если создать еще одного КЛИЕНТА, а к нему добавить уже существующего в дочернем объекте ПОСТАВЩИКА первого КЛИЕНТА, то, соответственно он покидает поле у первого КЛИЕНТА. Как я уже говорил выше нужно чтобы один и тот же поставщик мог отображаться в дочернем объекте каждого поля формы связи с КЛИЕНТОМ. Чтобы было наглядно понятней прикрепляю файл с программой. Попробуйте в Форме связи сделать клиента, присвоить ему поставщика, сделать еще одного клиента и присвоить ему того же поставщика. Не знаю как это сделать
 

Вложения

Vladimir

Администратор
Команда форума
Добрый день!
Всё верно - при построении такой схемы, у каждого поставщика будет меняться ссылка на клиента. И в результате поставщик будет иметь ссылку на последнего клиента, которому он был добавлен.
Наиболее часто аналогичная ситуация возникает, когда в проекте есть список товаров и разработчик просто создаёт в заказе дочерний список со списком, в котором у записи есть лишь ссылка на товар. В результате товар имеет ссылку об использовании только в последнем заказе.

Использование обратной ссылки в объекте клиентов на объект поставщиков - задачу не решает. Она реализует тип связи "один-к-одному" и в Вашем случае её использование недопустимо. Тем более, что в объекте поставщиков нет такой же обратной ссылки на клиента (что надо было бы сделать при правильном построении взаимной связи между клиентом и поставщиком.

Чтобы не возникало такой коллизии - надо добавлять промежуточный объект, вроде "Список поставщиков", который имеет ссылку на поставщика. В нём можно добавить поля ссылок на поля этого-же объекта (чтобы сразу видеть нужную информацию), а также добавить данные, которые могут касаться именно привязки поставщика к данному клиенту.
В форме клиентов удаляется дочерний список "Поставщик" и вместо него добавляется "Список поставщиков".
В объекте "Поставщик" удаляется лишняя системная ссылка на клиента ("~Клиент"), а у клиента - ссылка на поставщика и обратная связь.

Теперь в объекте "Список поставщиков" можно добавить фильтр по поставщику и увидеть, какие клиенты к нему привязаны.

---

Другой вариант, более удобный именно в Вашем случае - это создать связь "много-ко-многим", добавив в форме клиентов дочерний список с равнозначной связью (а не подчинённой).
При этом создаётся системный объект с двумя ссылками на объект клиентов и объект поставщиков ("~Клиент-Поставщик"). Можно также создать форму связи на базе поставщиков и добавить в ней дочерний равнозначный объект клиентов. При этом программа увидит, что можно использовать уже существующий системный объект обратной связи и будет использовать его для этой формы (не создавая дублирующего).

Теперь в обоих формах вы будете видеть взаимные списки. Можно добавить переходы по правой кнопки к соответствующим формам, чтобы быстро переходить между ними (например для формирования документов).

Обратите внимание, что если в системном объекте "~Клиент-Поставщик" нет других полей, кроме ссылок на клиента и поставщика, выбор в дочернем равнозначном списке производится лишь из списка записей - через одно диалоговое окно.
Если в системном объекте добавить дополнительные поля, то после выбора записи из объекта-источника, будет открываться дополнительное окно для заполнения остальных полей в этом объекте связи.
 
Последнее редактирование модератором:

Авдейчик

Продвинутый
Понял, нужно попробовать, но я не могу выбрать связь равнозначную, не разрешает, что сделать ?
 

Vladimir

Администратор
Команда форума
Тип связи устанавливается при её создании, поэтому изменить уже нельзя. При подчинённой связи в дочернем объекте создаётся системное поле ссылки на родительский объекта, а при равнозначной связи - создаётся системный объект со ссылками на оба пользовательских объекта.
Надо удалить из списка дочерних связей уже существующую и создать новую.
По хорошему и в дочернем объекте надо удалить созданное ранее системное поле ссылки. Автоматически оно не удаляется, так как пользователь может удалить подчинённый объект случайно и тогда его повторное добавление не приведёт к потере уже существующих значений в поле.
 

Авдейчик

Продвинутый
Спасибо, после смены на равнозначный в дочерних объектах отображаются одинаковые поля) правда теперь проблема, что они неактивны) т.е теперь нельзя прямо в дочернем объекте создать поле ( в моем случае поставщика) но можно выбирать из списка, в целом не страшно, но то, что нельзя перейти на это поле или вообще открыть его детализацию - проблема =(
 

Авдейчик

Продвинутый
Еще вопрос, я когда в равнозначной связи в дочернем объекте выбираю "создать" мне дает список из уже созданных полей, чтобы я условно выбрал нужное, но вот есть момент, что их станет 400-1000 или больше, и как там их искать ? есть ли возможность поставить фильтр ?
 

Vladimir

Администратор
Команда форума
нельзя прямо в дочернем объекте создать поле ( в моем случае поставщика) но можно выбирать из списка, в целом не страшно, но то, что нельзя перейти на это поле или вообще открыть его детализацию - проблема =(
Да, при работе с равнозначной связью допускается только выбор уже существующих записей в объекте. Создание новых там невозможно.
Перейти можно в контекстном меню записи дочернего списка, назначив свойство "Переход к":
Свойство перехода для дочернего объекта.jpg

когда в равнозначной связи в дочернем объекте выбираю "создать" мне дает список из уже созданных полей, чтобы я условно выбрал нужное, но вот есть момент, что их станет 400-1000 или больше, и как там их искать ? есть ли возможность поставить фильтр ?
Надо включить фильтр в объекте. Все фильтры, которые установлены для объекта, отображаются и при выборе данных из этого объекта.
Эту возможность можно использовать для задания различных фильтров в форме объекта и при выборе данных по полю ссылки из этого объекта.
 

Авдейчик

Продвинутый
Не долго моя музыка играла) подскажите, что не так сделал ? Выскакивает ошибка при попытках редактировать запись или создать новую. Заметил, что ошибка появляется следующим образом: по умолчанию стоит у каждой строки "новая строка" да\нет, соответственно изменяя положение этих самых строк я и заметил, что через какое-то время программу выкидывает, а когда заходишь в объекте не отображается ничего (а в дочернем почему-то отображается). При возврате все на свои места (строки без новых) все снова видно.
 
Последнее редактирование модератором:

Anti

Администратор
Команда форума
Пришлите, пожалуйста, на адрес support@runabase.ru копию проекта, для того, чтобы мы изучили ошибку.
Удалите из неё важные данные, сделайте оптимизацию базы, чтобы гарантированно удалить информацию об удалённых записях.
И укажите в письме, какому полю вы меняли размещение на строке.
 
Сверху Снизу