В процессе разработки конфигураций на платформе «1С:Предприятие 8» часто возникает задача организации взаимодействия между двумя объектами. Типичный сценарий: один пользователь (например, врач) создает документ с назначениями, а другой пользователь (медсестра) должен увидеть эти данные в своем рабочем интерфейсе и отметить факт выполнения. Рассмотрим, как правильно спроектировать такую связь, чтобы избежать дублирования данных и обеспечить корректную работу системы.
Самый простой и очевидный путь — использование реквизита типа ДокументСсылка. Разберем, как это работает на практике. В документе-приемнике (например, «Работа с пациентами») создается реквизит ДокументОснование. Это позволяет платформе отслеживать структуру подчиненности.
Проанализируем ситуацию, когда пользователь хочет минимизировать количество кликов. Для этого мы можем программно создавать второй документ при проведении первого. Важно помнить, что ссылка на новый объект доступна только после его записи. Посмотрим на пример кода, который можно разместить в модуле объекта первого документа:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
// Проверим, не создан ли уже связанный документ
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РаботаСПациентами ГДЕ ДокументОснование = &Основание";
Запрос.УстановитьПараметр("Основание", ЭтотОбъект.Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
НовыйДок = Документы.РаботаСПациентами.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.Пациент = ЭтотОбъект.Пациент;
НовыйДок.ДокументОснование = ЭтотОбъект.Ссылка;
НовыйДок.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
КонецПроцедуры
Преимущество: стандартная структура подчиненности, прозрачная связь объектов. Недостаток: при изменении данных в первом документе придется писать сложный код для обновления данных во втором, что может привести к блокировкам и потере консистентности.
Выясним причину, по которой прямое связывание документов может быть неудобным. Если основной задачей второго документа является лишь простановка отметки «Выполнено», то дублирование всей таблицы назначений в два документа — это избыточная операция. Вместо этого рассмотрим использование Регистров сведений.
Разберем логику:
НазначенияПациентам).Пример структуры регистра сведений:
Пациент, ВидРаботы, НомерСтрокиНазначения.СтатусВыполнения (Булево), ДатаВыполнения.Проанализируем ситуацию: медсестре не обязательно владеть отдельным физическим документом. Мы можем создать форму, где в верхней части отображаются данные пациента, а в нижней — динамический список, построенный на запросе к регистру сведений или к табличной части документа-основания.
Для того чтобы данные обновлялись в реальном времени, когда врач вносит изменения, мы можем использовать механизм оповещений. В форме документа врача добавим:
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Оповестить("ОбновитьДанныеНазначений", ЭтотОбъект.Ссылка, ЭтотОбъект);
КонецПроцедуры
А в форме медсестры пропишем обработчик:
&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
Если ИмяСобытия = "ОбновитьДанныеНазначений" Тогда
// Обновляем данные на форме или динамический список
Элементы.СписокНазначений.Обновить();
КонецЕсли;
КонецПроцедуры
Рассмотрим инструмент платформы, который часто забывают — Критерии отбора. Если вы создадите критерий отбора (например, «СвязанныеДокументыПоПациенту»), вы сможете без написания кода вывести на форму любого документа список всех связанных с ним объектов. Это значительно повышает удобство навигации для пользователя без увеличения «кликабельности» интерфейса.
Если вы все же решили использовать два документа, важно решить проблему «актуальности». Рассмотрим ситуацию: медсестра уже поставила отметку о выполнении, а врач решил удалить это назначение в первом документе. Чтобы система не «сломалась», придерживайтесь следующих правил:
Подписка на событие с источником ДокументОбъект.РегистрацияПациента и событием ПриЗаписи. В обработчике подписки найдите все связанные документы «Работа с пациентами» и обновите в них состав работ.Подведем итог: наиболее гибким и производительным решением для медицинских и сервисных систем является использование регистров сведений в качестве «прослойки» между документами. Это позволяет хранить историю изменений, избегать блокировок объектов при одновременной работе нескольких пользователей и легко строить отчетность по выполненным работам.