В процессе разработки крупных корпоративных систем или специализированных решений на платформе 1С:Предприятие 8 часто возникает задача оптимизации интерфейса под нужды конечных пользователей. Одним из таких требований является исключение определенных документов или форм из системной панели "История" (история работы пользователя).
Например, в логике прикладного решения может быть заложено, что некоторый технический или транзитный документ не должен открываться пользователем напрямую. Его представление неинформативно в общем списке истории, а сам документ должен открываться исключительно в контексте другой, более сложной формы (например, в рамках специализированного рабочего места или обработки). Если пользователи активно используют панель истории для быстрого перехода к недавним задачам, появление там вспомогательных документов только засоряет интерфейс и путает людей. Разберем по шагам, как устроен этот механизм на уровне платформы 1С и какими способами можно решить эту задачу.
Прежде чем переходить к реализации конкретных решений, проанализируем, как именно платформа 1С фиксирует переходы по формам:
ДокументОбъект, СправочникОбъект, ПланВидовХарактеристикОбъект и т. д._usersworkhistory. Платформа хранит ограниченное количество записей (обычно до 200 последних событий) для каждого пользователя и автоматически удаляет устаревшие записи при добавлении новых.ИсторияРаботыПользователя (тип МенеджерИсторииРаботыПользователя).ИсторияРаботыПользователя.Добавить(), либо полностью очистить всю историю текущего пользователя через метод ИсторияРаботыПользователя.Очистить().Поскольку стандартного флага вроде "Не показывать в истории" для форм документов не существует, рассмотрим четыре действенных способа обхода этого ограничения.
Это самый чистый, надежный и рекомендуемый способ с точки зрения стандартов разработки 1С. Если форма не связана напрямую с объектом базы данных через основной реквизит, платформа не станет автоматически регистрировать её открытие в истории.
Рассмотрим подробнее алгоритм реализации этого метода:
ДокументОбъект.ИмяВашегоДокумента. Мы можем использовать произвольные реквизиты формы для отображения данных.Посмотрим на пример кода, который иллюстрирует открытие такой формы и передачу в нее данных без фиксации в истории:
// Пример вызова произвольной формы из контекста другой формы
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("СсылкаНаДокумент", ТекущийДокументСсылка);
ОткрытьФорму("Документ.ИмяВашегоДокумента.Форма.ПроизвольнаяФормаПросмотра", ПараметрыОткрытия);
В модуле самой произвольной формы в обработчике ПриСозданииНаСервере мы считываем данные документа и заполняем реквизиты формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("СсылкаНаДокумент") Тогда
СсылкаНаДокумент = Параметры.СсылкаНаДокумент;
// Программно заполняем реквизиты формы из данных документа
ЗаполнитьДанныеФормыИзДокумента(СсылкаНаДокумент);
Иначе
Отказ = Истина; // Не разрешаем открывать форму без контекста
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДанныеФормыИзДокумента(Знач СсылкаНаДокумент)
// Получаем данные документа без блокировки и лишней нагрузки
ДанныеДокумента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(СсылкаНаДокумент, "Номер, Дата, Контрагент, СуммаДокумента");
// Заполняем реквизиты нашей "чистой" формы
ОбъектНомер = ДанныеДокумента.Номер;
ОбъектДата = ДанныеДокумента.Дата;
ОбъектКонтрагент = ДанныеДокумента.Контрагент;
ОбъектСумма = ДанныеДокумента.СуммаДокумента;
КонецПроцедуры
Поскольку форма не связана с объектом напрямую, пользователь работает с данными, а платформа "не видит" факта открытия самого документа и не добавляет его в историю открытых.
Если вам приходится работать с типовой конфигурацией, которую крайне нежелательно снимать с поддержки или изменять напрямую, мы можем использовать механизм расширений. Мы перехватим событие получения формы и подменим стандартную форму на нашу форму-заглушку или обработку.
Рассмотрим, как реализовать этот перехват в модуле менеджера документа через расширение:
&Вместо("ОбработкаПолученияФормы")
Процедура Расш_ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительныеПараметры, СтандартнаяОбработка)
// Проверяем, что запрашивается именно основная форма документа
Если ВидФормы = "ФормаОбъекта" Тогда
// Анализируем контекст вызова. Если документ открывается не из разрешенного места:
Если Не Параметры.Свойство("РазрешенныйКонтекст") Тогда
// Перенаправляем пользователя на форму-обработку, которая не пишет историю
ВыбраннаяФорма = "Обработка.ПросмотрДокументовБезИстории.Форма.ФормаПросмотра";
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот способ позволяет гибко управлять поведением системы, не затрагивая при этом основной код конфигурации и сохраняя возможность легкого обновления системы.
Иногда задача стоит шире: требуется, чтобы определенная группа пользователей (например, внешние аудиторы, временные сотрудники или операторы ввода данных) вообще не оставляла "следов" своего пребывания в системе и не захламляла свою историю какими-либо документами.
В платформе 1С предусмотрена специальная настройка ролей, которая позволяет отключить сохранение истории работы для конкретного пользователя:
СохранениеДанныхПользователя).Важное следствие: При отключении этого права платформа полностью блокирует сохранение любых персональных данных сеанса. У пользователя перестанет работать не только история открытых документов, но и история вводимых данных в полях выбора, список "Избранное", а также персональные настройки положения окон и ширины колонок в списках. Этот метод радикален, но идеально подходит для создания терминальных или "гостевых" учетных записей.
Если архитектура системы не позволяет быстро переписать формы на произвольные, а скрыть документ из истории нужно "здесь и сейчас", некоторые разработчики используют очистку истории при закрытии формы документа.
Проанализируем этот метод. В модуле формы документа мы можем прописать очистку в событии закрытия:
&НаКлиенте
Процедура ПослеЗакрытия(ПараметрыЗакрытия)
// Очищаем всю историю работы текущего пользователя за сеанс
ИсторияРаботыПользователя.Очистить();
КонецПроцедуры
Внимание: проанализируем критический недостаток данного метода!
Метод ИсторияРаботыПользователя.Очистить() не умеет удалять записи выборочно. Он полностью сотрет абсолютно все записи в панели истории пользователя, накопленные за текущий сеанс работы. Пользователь потеряет ссылки на все ранее открытые им полезные документы и справочники, что гарантированно вызовет раздражение и жалобы на неудобство работы. Используйте данный метод только в крайних случаях, когда очистка истории сеанса является частью требований безопасности.
Мы рассмотрели различные варианты решения задачи скрытия документов из истории работы пользователя в 1С. Наиболее архитектурно верным решением является использование произвольных несвязанных форм (Способ 1), так как оно точечно решает проблему без побочных эффектов для остального интерфейса программы. Использование расширений (Способ 2) отлично подойдет для кастомизации типовых решений, а ограничение прав (Способ 3) поможет настроить специализированные рабочие места.