Как на форме документа в 1С показать, кто последний внес изменения

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

В процессе работы с многопользовательскими базами данных «1С:Предприятие» у бухгалтеров, менеджеров и руководителей часто возникает закономерный вопрос: «Кто и когда изменил этот документ?». Особенно остро эта проблема стоит для критически важных документов, таких как Поступление товаров и услуг (в современных редакциях — Приобретение товаров и услуг). Если в документе изменилась сумма, склад или контрагент, необходимо быстро найти ответственного, не тратя время на длительное расследование.

В этой статье мы подробно разберем несколько практических способов решения этой задачи в современных конфигурациях на управляемых формах (УТ 11.4, ERP, Комплексная автоматизация). Мы проанализируем как простые типовые механизмы, не требующие программирования, так и профессиональные методы разработки с использованием расширений и программного изменения интерфейса.

Различие понятий: «Автор» документа и «Последний изменивший»

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

В типовых конфигурациях 1С (например, Управление торговлей 11) у большинства документов уже есть стандартный реквизит Автор или Ответственный. Он заполняется автоматически при создании документа текущим авторизованным пользователем.

Если пользователям достаточно видеть только создателя документа, то программировать ничего не нужно. Достаточно воспользоваться стандартной возможностью настройки интерфейса:

  1. Откройте форму нужного документа.
  2. Нажмите кнопку Ещё в правом верхнем углу формы и выберите пункт Изменить форму.
  3. В появившемся дереве элементов найдите реквизит Ссылка.Автор (или Ссылка.Ответственный).
  4. Установите напротив него флажок и нажмите ОК.

Поле появится на форме в режиме «Только просмотр». Однако если вам действительно нужно видеть историю последующих корректировок и имя последнего редактора, перейдем к рассмотрению технических способов реализации.

Способ 1. Использование типового версионирования БСП (Рекомендуемый путь)

Самый правильный с точки зрения архитектуры способ — задействовать встроенный механизм Библиотеки Стандартных Подсистем (БСП) под названием «Версионирование объектов». Он позволяет не только зафиксировать автора изменений, но и детально увидеть, какие именно реквизиты или табличные части были изменены, а также сравнить любые две версии документа между собой.

Разберем по шагам, как настроить этот функционал:

  1. Перейдите в раздел НСИ и администрирование — Общие настройки.
  2. Раскройте группу История изменений и установите флажок Хранить историю изменений.
  3. Перейдите по ссылке Настройки хранения.
  4. Найдите в списке документ Приобретение товаров и услуг (или нужный вам документ поступления).
  5. В колонке «Вариант версионирования» выберите одно из значений:
    • Версионировать при записи — история будет создаваться при любом сохранении документа.
    • При проведении (рекомендуется) — версии будут записываться только при проведении или отмене проведения документа. Это существенно экономит место в базе данных, исключая промежуточные «черновые» сохранения.
  6. В колонке «Срок хранения» укажите разумный период (например, За последний месяц, За последние полгода), чтобы база данных не раздувалась со временем.

После этого на форме документа (в панели навигации или по кнопке Ещё — История изменений) пользователям станет доступен удобный отчёт. В нем наглядно видно список всех версий, дату изменения и имя пользователя, выполнившего операцию. Последняя запись в списке и будет являться автором финальной редакции.

Важное предостережение по оптимизации: Хранение истории версий может привести к быстрому росту размера базы данных (особенно таблицы регистра сведений ВерсииОбъектов). Чтобы избежать замедления работы системы, обязательно настройте регламентное задание Очистка устаревших версий объектов, которое будет автоматически удалять старые записи по настроенному вами расписанию.

Способ 2. Реализация через расширение конфигурации (Создание собственного реквизита)

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

Рассмотрим алгоритм реализации:

  1. Создайте новое расширение конфигурации (или откройте существующее) с назначением Адаптация.
  2. Добавьте в расширение документ ПриобретениеТоваровУслуг.
  3. В расширении добавьте к документу новый реквизит. Назовем его, например, ПоследнийРедактор с типом значения СправочникСсылка.Пользователи.
  4. Перенесите добавленный реквизит на форму документа (также добавленную в расширение) и установите для элемента формы свойство ТолькоПросмотр = Истина.
  5. Теперь нам необходимо обеспечить заполнение этого реквизита при каждой записи документа. Для этого перенесите в расширение обработчик события ПередЗаписью модуля объекта документа.

Напишем код обработчика, используя аннотацию &Перед:


&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    
    // Записываем текущего авторизованного пользователя системы
    ЭтотОбъект.ПоследнийРедактор = ПользователиИнформационнойБазы.ТекущийПользователь();
    
КонецПроцедуры

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

Способ 3. Платформенный механизм «История данных» (Современный подход)

Начиная с версии платформы 8.3.11, фирма «1С» реализовала встроенный на уровне СУБД механизм «История данных». Это мощная альтернатива классическому версионированию БСП, работающая гораздо быстрее и эффективнее.

Если для документа в свойствах метаданных включено свойство ИсторияДанных (установлено значение Использовать), платформа автоматически протоколирует все изменения. Мы можем программно обратиться к этому механизму при открытии формы документа и динамически вывести имя последнего редактора, не создавая новые реквизиты в таблицах базы данных.

Разберем, как получить эти данные с помощью программного кода. Создадим в модуле формы документа (или в расширении формы) процедуру:


&НаСервере
Функция ПолучитьПоследнегоИзменившегоНаСервере(ДокументСсылка)
    
    УстановитьПривилегированныйРежим(Истина);
    
    // Проверяем, записан ли документ
    Если ДокументСсылка.Пустая() Тогда
        Возврат "Новый документ (еще не записан)";
    КонецЕсли;
    
    Попытка
        // Получаем историю версий объекта через менеджер истории данных
        ВыборкаВерсий = ИсторияДанных.ВыбратьВерсии(ДокументСсылка);
        
        ПоследнийАвтор = "";
        ПоследняяДата = Дата(1, 1, 1);
        
        // Обходим версии, чтобы найти самую последнюю
        Пока ВыборкаВерсий.Следующий() Цикл
            ДанныеВерсии = ВыборкаВерсий.Получить();
            Если ДанныеВерсии.ДатаВерсии > ПоследняяДата Тогда
                ПоследняяДата = ДанныеВерсии.ДатаВерсии;
                ПоследнийАвтор = Строка(ДанныеВерсии.Автор);
            КонецЕсли;
        КонецЦикла;
        
        Если ЗначениеЗаполнено(ПоследнийАвтор) Тогда
            Возврат ПоследнийАвтор + " (" + Формат(ПоследняяДата, "ДФ='дд.ММ.гггг ЧЧ:мм'") + ")";
        КонецЕсли;
    Исключение
        // Обработка ситуации, если история данных для объекта отключена или недоступна
        Возврат "История изменений недоступна";
    КонецПопытки;
    
    Возврат "Нет данных об изменениях";
    
КонецФункции

Теперь нам достаточно вызвать эту функцию при создании формы на сервере и вывести результат в информационную надпись (декорацию) на форме:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Динамически создаем декорацию на форме для отображения автора изменений
    ИнформацияОбИзменении = ПолучитьПоследнегоИзменившегоНаСервере(Объект.Ссылка);
    
    ЭлементДекорация = Элементы.Добавить("ИнфоПоследнееИзменение", Тип("ДекорацияФормы"), Элементы.ГруппаШапка);
    ЭлементДекорация.Вид = ВидДекорацииФормы.Надпись;
    ЭлементДекорация.Заголовок = "Последний изменил: " + ИнформацияОбИзменении;
    ЭлементДекорация.ПредупреждениеПриРедактировании = Ложь;
    
КонецПроцедуры

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

Опасный антипаттерн: Чтение Журнала регистрации

Иногда начинающие разработчики пытаются решить задачу вывода автора изменений простым путем — программным чтением системного Журнала регистрации при открытии формы с помощью функции ВыгрузитьЖурналРегистрации().

Внимание: это грубейшая ошибка проектирования!

Журнал регистрации в современных версиях 1С (особенно в формате хранения SQLite .lgd) может достигать огромных размеров. Запрос к журналу регистрации при каждом открытии формы документа приведет к тому, что интерфейс у пользователя будет зависать на несколько секунд или даже минут. Нагрузка на дисковую подсистему сервера возрастет в разы, что парализует работу всей компании. Никогда не используйте этот метод для оперативного отображения данных в интерфейсе пользователя.

Резюме и выводы

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

  1. Если вам важен аудит изменений и минимизация программирования — включайте типовое версионирование БСП. Это стандартный, проверенный временем и безопасный способ ведения истории.
  2. Если бизнес-процессы требуют вывода имени редактора строго в поле формы, и вы не боитесь добавлять новые реквизиты — используйте механизм расширений для добавления реквизита и заполнения его в событии ПередЗаписью.
  3. Если вы хотите использовать передовые технологии платформы и избежать создания «лишних» реквизитов — задействуйте платформенную «Историю данных» с динамическим выводом информации на управляемую форму.
← На главную