При разработке прикладных решений на базе Библиотеки стандартных подсистем (БСП) часто возникает задача: отобразить и дать возможность редактировать контактную информацию (КИ) одного объекта непосредственно в форме другого. Например, редактировать контакты физического лица прямо из карточки контактного лица или документа. Разберем по шагам, как устроен этот механизм, с какими сложностями блокировок можно столкнуться и как правильно организовать работу с интерфейсом.
Проанализируем базовую концепцию БСП. Для того чтобы форма основного объекта могла изменять данные связанного справочника, этот связанный объект должен быть представлен на форме не просто ссылкой, а полноценным объектом.
Рассмотрим порядок реализации:
ФизическоеЛицоОбъект) с типом СправочникОбъект.ФизическиеЛица. Именно поэтому при обращении на клиенте доступны свойства объекта, включая ФизическоеЛицоОбъект.Ссылка.ПолучитьОбъект() и его помещение в созданный реквизит формы.УправлениеКонтактнойИнформацией вызываются повторно для второго объекта. В них передается путь к реквизиту связанного объекта и имя группы формы, куда следует динамически внедрить элементы управления КИ.ПередЗаписьюНаСервере или ПослеЗаписиНаСервере вызывается запись связанного объекта, если реквизит формы был модифицирован.Выясним причину частой ошибки при блокировке данных. Платформенный метод ЗаблокироватьДанныеДляРедактирования имеет контекст выполнения: Сервер, толстый клиент, внешнее соединение. На тонком клиенте вызвать этот метод напрямую нельзя.
Посмотрим на пример вызова серверной процедуры для установки блокировки:
&НаСервере
Процедура ЗаблокироватьСвязанныйОбъектНаСервере()
Если Не ФизическоеЛицоОбъект.Ссылка.Пустая() Тогда
ЗаблокироватьДанныеДляРедактирования(
ФизическоеЛицоОбъект.Ссылка,
ФизическоеЛицоОбъект.ВерсияДанных,
УникальныйИдентификатор
);
КонецЕсли;
КонецПроцедуры
Параметр ВерсияДанных обеспечивает механизм оптимистической блокировки. Если связанный объект уже был изменен и записан в другой сессии параллельно, система сгенерирует исключение, защищая данные от неконтролируемого перезаписывания.
Разберем ситуацию, когда в одной форме требуется вывести контактную информацию сразу для двух объектов одного типа (например, двух физических лиц). В этом случае стандартный генератор БСП может выдать ошибку неуникальности имен элементов формы, так как имена генерируются по шаблону с использованием идентификаторов видов КИ.
Рассмотрим способы обхода этой проблемы:
ГруппаКИ_ПервоеЛицо и ГруппаКИ_ВтороеЛицо).УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(), выведя строковые представления в обычные надписи или поля только для чтения.В современных версиях БСП контактная информация перенесена из периодических регистров сведений непосредственно в табличные части объектов-владельцев. Проанализируем архитектурные причины этого решения: