Как вместо ID автора отображать имя пользователя в списке документов 1С

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

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

Различие между пользователями ИБ и справочником Пользователи

Для начала проанализируем архитектуру системы 1С. В платформе существует два уровня работы с пользователями. Первый — это Пользователи информационной базы (ИБ). Они создаются в Конфигураторе (или программно) и необходимы исключительно для авторизации в системе. У них есть логин, пароль и внутренний идентификатор (UUID).

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

Шаг 1: Создание справочника и изменение типа реквизита

Рассмотрим пошагово, как перейти от хранения UUID к хранению ссылки. Выясним, какие действия необходимо предпринять в конфигураторе:

  1. Создадим справочник с именем Пользователи. В его свойствах на вкладке «Данные» убедимся, что «Длина наименования» достаточна для хранения ФИО (например, 100 символов).
  2. В этом справочнике создадим дополнительный реквизит ИдентификаторПользователяИБ с типом УникальныйИдентификатор. Это поле понадобится нам для связи элемента справочника с конкретной учетной записью из списка пользователей ИБ.
  3. Перейдем в наш документ и изменим тип реквизита Автор. Вместо УникальныйИдентификатор выберем СправочникСсылка.Пользователи.

После этого в форме списка документа поле Автор начнет отображать текст наименования, так как платформа по умолчанию выводит «Основное представление» ссылки.

Шаг 2: Связывание пользователя ИБ со справочником

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


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

Шаг 3: Автоматическое заполнение автора в документе

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


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
    Если ЭтоНовый() Тогда
        // Вызываем нашу функцию получения ссылки на справочник
        Если НЕ ЗначениеЗаполнено(Автор) Тогда
            Автор = ОбщийМодульПользователи.ПолучитьТекущегоПользователя();
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

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

Оптимизация через параметры сеанса

Создадим в дереве метаданных «Параметр сеанса» с именем ТекущийПользователь и типом СправочникСсылка.Пользователи. Инициализируем его один раз в модуле сеанса:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    Если ТребуемыеПараметры = Неопределено Или ТребуемыеПараметры.Найти("ТекущийПользователь") <> Неопределено Тогда
        ПараметрыСеанса.ТекущийПользователь = ОбщийМодульПользователи.ПолучитьТекущегоПользователя();
    КонецЕсли;
КонецПроцедуры

Теперь в любом месте кода (в документах, справочниках, отчетах) заполнение автора будет происходить мгновенно через обращение к ПараметрыСеанса.ТекущийПользователь, без лишних запросов к базе данных.

Настройка отображения в динамических списках

Если после смены типа данных на «Ссылка» в списке все равно отображается не то, что вы ожидали, проверим настройки динамического списка формы. Рассмотрим два варианта настройки:

  1. Стандартное представление: Убедитесь, что в свойствах справочника Пользователи на закладке «Основные» поле «Основное представление» установлено в значение «В виде наименования». Это гарантирует, что 1С будет выводить имя во всех связанных полях.
  2. Произвольный запрос: Если вам нужно вывести не только имя, но и, например, отдел автора, используйте «Произвольный запрос» в настройках динамического списка. Выясним, как это выглядит в конструкторе запроса:
    
    ВЫБРАТЬ
        ДокументПродажа.Ссылка,
        ДокументПродажа.Дата,
        ДокументПродажа.Номер,
        ДокументПродажа.Автор,
        ДокументПродажа.Автор.Подразделение КАК ПодразделениеАвтора
    ИЗ
        Документ.Продажа КАК ДокументПродажа
    

Использование Библиотеки стандартных подсистем (БСП)

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

Подведем итог: для корректного отображения имени автора в 1С необходимо использовать ссылочный тип данных, связывать пользователей ИБ со справочником и использовать параметры сеанса для быстрой подстановки данных. Использование типа УникальныйИдентификатор в реквизитах — это тупиковый путь, который усложняет построение отчетов и лишает пользователя возможности удобной навигации и фильтрации данных.

← На главную