Как фиксировать историю событий и дополнений к документу в 1С без его блокировки?

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

При разработке учетных систем, CRM или подсистем технической поддержки (Helpdesk) часто возникает типовая архитектурная задача: необходимо фиксировать историю работы с заявкой или документом. Пользователи и бизнес-процессы должны оставлять комментарии, прикреплять звонки, письма, фиксировать списание ТМЦ и промежуточные статусы. При этом основной документ должен оставаться неизменным, защищенным от случайного редактирования и не блокироваться другими сеансами.

Рассмотрим подробнее основные способы реализации ленты событий и логов в парадигме платформы 1С:Предприятие.

Почему не стоит писать историю в табличную часть документа

Проанализируем распространенную ошибку начинающих разработчиков — добавление табличной части ИсторияСобытий непосредственно в сам документ заявки. Такой подход имеет критические недостатки:

  1. Транзакционные блокировки: при записи новой строки в табличную часть блокируется весь документ целиком. Если с заявкой работают параллельно несколько пользователей или фоновое регламентное задание, неизбежно возникнут конфликты блокировок.
  2. Изменение версии объекта: перезапись документа модифицирует служебные реквизиты, увеличивает номер версии и может инициировать повторное проведение или проверки в подписках на события.
  3. Ограничения прав доступа: если документ закрыт от редактирования или проведен, для добавления комментария пользователю придется временно снимать запрет на запись документа либо выполнять запись в привилегированном режиме, что нарушает правила разграничения прав (RLS).

Вариант 1: Использование независимого регистра сведений

Разберем классический и надежный способ — создание независимого непериодического регистра сведений ИсторияСобытийЗаявок.

Структура регистра может выглядеть следующим образом:

  1. Измерения: Заявка (тип: ДокументСсылка.Заявка), ИдентификаторСобытия (тип: УникальныйИдентификатор или Строка).
  2. Реквизиты: ДатаСобытия (тип: Дата), Автор (тип: СправочникСсылка.Пользователи), ВидСобытия (тип: ПеречислениеСсылка.ВидыСобытийЗаявок), Текст (тип: Строка), ДокументСобытия (составной ссылочный тип для привязки созданных документов).

Посмотрим на пример добавления записи в лог без изменения основного документа:


МенеджерЗаписи = РегистрыСведений.ИсторияСобытийЗаявок.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Заявка = СсылкаНаЗаявку;
МенеджерЗаписи.ИдентификаторСобытия = Новый УникальныйИдентификатор;
МенеджерЗаписи.ДатаСобытия = ТекущаяДатаСеанса();
МенеджерЗаписи.Автор = ПользователиИнформационнойБазы.ТекущийПользователь();
МенеджерЗаписи.ВидСобытия = Перечисления.ВидыСобытийЗаявок.Комментарий;
МенеджерЗаписи.Текст = "Уточнили требования у клиента по телефону.";
МенеджерЗаписи.Записать();

На форме заявки создаем динамический список с отбором по текущему документу. Это позволяет пользователям добавлять новые комментарии и просматривать полную историю даже в режиме «Только просмотр» для самой заявки.

Вариант 2: Использование механизма «Система взаимодействия»

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

  1. Обсуждение жестко связывается с конкретной ссылкой на объект (документ, задачу, элемент справочника).
  2. Сообщения, файлы, упоминания пользователей (через @) хранятся на сервере взаимодействия и не утяжеляют транзакции основной базы данных.
  3. Интерфейс чата отображается непосредственно на форме объекта и доступен для чтения и отправки сообщений без разблокировки формы документа.

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

Вариант 3: Подсистема «Взаимодействия» и заметки из БСП

Если в конфигурации используется Библиотека стандартных подсистем (БСП), оптимальным решением будет применение готовых механизмов:

  1. Заметки пользователя: подходят для фиксации свободных текстовых заметок, не требующих сложной бизнес-логики.
  2. Подсистема «Взаимодействия»: предоставляет готовые документы ТелефонныйЗвонок, ЭлектронноеПисьмо, ЗапланированноеВзаимодействие, СообщениеSMS.

Чтобы привязать типовые взаимодействия к новому документу заявки, достаточно включить тип ДокументСсылка.Заявка в состав ОпределяемыйТип.ПредметВзаимодействия. После этого в документе автоматически становится доступна панель регистрации входящих и исходящих коммуникаций с полной историей переписки и звонков.

Вариант 4: Ввод на основании и критерии отбора

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

Разберем по шагам, как организовать доступ к цепочке документов:

  1. Создаем документы хозяйственных операций (например, РасходнаяНакладная, СписаниеТоваров) с реквизитом ДокументОснование (тип: ДокументСсылка.Заявка).
  2. Настраиваем объект метаданных КритерийОтбора (или используем подсистему БСП «Связанные документы»), включив в состав отбора реквизиты оснований подчиненных документов.
  3. На форму заявки выводим команду просмотра связанных документов (структуры подчиненности). Пользователь в любой момент может открыть исходный документ и провалиться в любую подчиненную операцию.

Вариант 5: Сборная лента событий (Timeline) на форме

Если требуется объединить в один хронологический список разнородные события (письма, задачи, списания, комментарии), на форме заявки настраивается динамический список с произвольным запросом. Запрос объединяет данные из нескольких таблиц через оператор ОБЪЕДИНИТЬ ВСЕ:


ВЫБРАТЬ
	История.ДатаСобытия КАК Период,
	История.Автор КАК Автор,
	История.ВидСобытия КАК ВидСобытия,
	История.Текст КАК Описание,
	История.ДокументСобытия КАК СсылкаНаОбъект
ИЗ
	РегистрСведений.ИсторияСобытийЗаявок КАК История
ГДЕ
	История.Заявка = &ТекущаяЗаявка

ОБЪЕДИНИТЬ ВСЕ

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

Такой интерфейс обеспечивает быстрый и наглядный доступ ко всем этапам жизненного цикла документа без риска блокировок и конфликтов версий.

← На главную