Как связать два документа между собой в 1С и обеспечить синхронизацию данных?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Сфера услуг, туризм и социальный сектор
← На главную

В процессе разработки конфигураций на платформе «1С:Предприятие 8» часто возникает задача организации взаимодействия между двумя объектами. Типичный сценарий: один пользователь (например, врач) создает документ с назначениями, а другой пользователь (медсестра) должен увидеть эти данные в своем рабочем интерфейсе и отметить факт выполнения. Рассмотрим, как правильно спроектировать такую связь, чтобы избежать дублирования данных и обеспечить корректную работу системы.

Способ 1: Использование стандартного механизма «ДокументОснование»

Самый простой и очевидный путь — использование реквизита типа ДокументСсылка. Разберем, как это работает на практике. В документе-приемнике (например, «Работа с пациентами») создается реквизит ДокументОснование. Это позволяет платформе отслеживать структуру подчиненности.

Проанализируем ситуацию, когда пользователь хочет минимизировать количество кликов. Для этого мы можем программно создавать второй документ при проведении первого. Важно помнить, что ссылка на новый объект доступна только после его записи. Посмотрим на пример кода, который можно разместить в модуле объекта первого документа:


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    // Проверим, не создан ли уже связанный документ
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РаботаСПациентами ГДЕ ДокументОснование = &Основание";
    Запрос.УстановитьПараметр("Основание", ЭтотОбъект.Ссылка);
    
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        НовыйДок = Документы.РаботаСПациентами.СоздатьДокумент();
        НовыйДок.Дата = ТекущаяДата();
        НовыйДок.Пациент = ЭтотОбъект.Пациент;
        НовыйДок.ДокументОснование = ЭтотОбъект.Ссылка;
        НовыйДок.Записать(РежимЗаписиДокумента.Запись);
    КонецЕсли;
КонецПроцедуры

Преимущество: стандартная структура подчиненности, прозрачная связь объектов. Недостаток: при изменении данных в первом документе придется писать сложный код для обновления данных во втором, что может привести к блокировкам и потере консистентности.

Способ 2: Хранение данных в регистрах сведений (Архитектурно верный подход)

Выясним причину, по которой прямое связывание документов может быть неудобным. Если основной задачей второго документа является лишь простановка отметки «Выполнено», то дублирование всей таблицы назначений в два документа — это избыточная операция. Вместо этого рассмотрим использование Регистров сведений.

Разберем логику:

  1. Врач проводит документ «Регистрация пациентов».
  2. При проведении данные о назначениях записываются в регистр сведений (например, НазначенияПациентам).
  3. Медсестра открывает свой АРМ или документ, который динамически считывает данные из этого регистра.
  4. При установке галочки «Выполнено» обновляется только запись в регистре, а не весь документ врача.

Пример структуры регистра сведений:

Способ 3: Визуализация данных через динамические списки

Проанализируем ситуацию: медсестре не обязательно владеть отдельным физическим документом. Мы можем создать форму, где в верхней части отображаются данные пациента, а в нижней — динамический список, построенный на запросе к регистру сведений или к табличной части документа-основания.

Для того чтобы данные обновлялись в реальном времени, когда врач вносит изменения, мы можем использовать механизм оповещений. В форме документа врача добавим:


&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    Оповестить("ОбновитьДанныеНазначений", ЭтотОбъект.Ссылка, ЭтотОбъект);
КонецПроцедуры

А в форме медсестры пропишем обработчик:


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

Способ 4: Использование Критериев отбора

Рассмотрим инструмент платформы, который часто забывают — Критерии отбора. Если вы создадите критерий отбора (например, «СвязанныеДокументыПоПациенту»), вы сможете без написания кода вывести на форму любого документа список всех связанных с ним объектов. Это значительно повышает удобство навигации для пользователя без увеличения «кликабельности» интерфейса.

Рекомендации по синхронизации при изменении данных

Если вы все же решили использовать два документа, важно решить проблему «актуальности». Рассмотрим ситуацию: медсестра уже поставила отметку о выполнении, а врач решил удалить это назначение в первом документе. Чтобы система не «сломалась», придерживайтесь следующих правил:

  1. Приоритет данных: определите, какой документ является мастером данных. Обычно это документ врача.
  2. Подписки на события: используйте объект Подписка на событие с источником ДокументОбъект.РегистрацияПациента и событием ПриЗаписи. В обработчике подписки найдите все связанные документы «Работа с пациентами» и обновите в них состав работ.
  3. Контроль выполнения: запретите редактирование строк в документе врача, если в документе медсестры по этой строке уже стоит статус «Выполнено».

Подведем итог: наиболее гибким и производительным решением для медицинских и сервисных систем является использование регистров сведений в качестве «прослойки» между документами. Это позволяет хранить историю изменений, избегать блокировок объектов при одновременной работе нескольких пользователей и легко строить отчетность по выполненным работам.

← На главную