При разработке конфигурации с нуля начинающие программисты часто сталкиваются с ситуацией, когда в реквизитах документа сохраняется УникальныйИдентификатор (UUID) пользователя информационной базы. В результате в списках документов вместо понятного имени «Иванов Иван» отображается длинная строка символов. В этой статье мы подробно разберем, почему использование типа УникальныйИдентификатор напрямую является ошибкой, и как правильно реализовать механизм хранения и отображения автора документа.
Для начала проанализируем архитектуру системы 1С. В платформе существует два уровня работы с пользователями. Первый — это Пользователи информационной базы (ИБ). Они создаются в Конфигураторе (или программно) и необходимы исключительно для авторизации в системе. У них есть логин, пароль и внутренний идентификатор (UUID).
Второй уровень — это Справочник Пользователи, который создается разработчиком в дереве метаданных. Платформа 1С устроена так, что в реквизитах документов и других объектов следует использовать ссылки на объекты метаданных (справочники), а не их внутренние идентификаторы. Если мы укажем тип реквизита СправочникСсылка.Пользователи, система автоматически подставит в список «Наименование» этого справочника (строковое представление), а не его ID.
Рассмотрим пошагово, как перейти от хранения UUID к хранению ссылки. Выясним, какие действия необходимо предпринять в конфигураторе:
Пользователи. В его свойствах на вкладке «Данные» убедимся, что «Длина наименования» достаточна для хранения ФИО (например, 100 символов).ИдентификаторПользователяИБ с типом УникальныйИдентификатор. Это поле понадобится нам для связи элемента справочника с конкретной учетной записью из списка пользователей ИБ.Автор. Вместо УникальныйИдентификатор выберем СправочникСсылка.Пользователи.После этого в форме списка документа поле Автор начнет отображать текст наименования, так как платформа по умолчанию выводит «Основное представление» ссылки.
Теперь разберем, как наполнить справочник данными и связать их с текущим сеансом. Нам нужно, чтобы при входе в систему программа понимала, какому элементу справочника Пользователи соответствует текущий залогинившийся пользователь. Рассмотрим пример кода, который можно разместить в модуле управляемого приложения или в специальном общем модуле, вызываемом при старте:
Функция ПолучитьТекущегоПользователя() Экспорт
ТекПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
ИдентификаторИБ = ТекПользовательИБ.УникальныйИдентификатор;
СсылкаНаПользователя = Справочники.Пользователи.НайтиПоРеквизиту("ИдентификаторПользователяИБ", ИдентификаторИБ);
Если СсылкаНаПользователя.Пустая() Тогда
// Если пользователя нет в справочнике, создадим его
НовыйПользователь = Справочники.Пользователи.СоздатьЭлемент();
НовыйПользователь.Наименование = ТекПользовательИБ.ПолноеИмя;
НовыйПользователь.ИдентификаторПользователяИБ = ИдентификаторИБ;
НовыйПользователь.Записать();
СсылкаНаПользователя = НовыйПользователь.Ссылка;
КонецЕсли;
Возврат СсылкаНаПользователя;
КонецФункции
Чтобы пользователю не приходилось каждый раз выбирать себя из списка при создании документа, реализуем автоматическое заполнение. Проанализируем ситуацию: наиболее подходящий момент для установки автора — это создание нового объекта или его первая запись. Посмотрим на пример кода в модуле объекта документа:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ЭтоНовый() Тогда
// Вызываем нашу функцию получения ссылки на справочник
Если НЕ ЗначениеЗаполнено(Автор) Тогда
Автор = ОбщийМодульПользователи.ПолучитьТекущегоПользователя();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Важный момент: поиск в справочнике при каждой записи документа может замедлить работу системы. Для оптимизации рекомендуем использовать Параметры сеанса. Разберем этот механизм подробнее.
Создадим в дереве метаданных «Параметр сеанса» с именем ТекущийПользователь и типом СправочникСсылка.Пользователи. Инициализируем его один раз в модуле сеанса:
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Или ТребуемыеПараметры.Найти("ТекущийПользователь") <> Неопределено Тогда
ПараметрыСеанса.ТекущийПользователь = ОбщийМодульПользователи.ПолучитьТекущегоПользователя();
КонецЕсли;
КонецПроцедуры
Теперь в любом месте кода (в документах, справочниках, отчетах) заполнение автора будет происходить мгновенно через обращение к ПараметрыСеанса.ТекущийПользователь, без лишних запросов к базе данных.
Если после смены типа данных на «Ссылка» в списке все равно отображается не то, что вы ожидали, проверим настройки динамического списка формы. Рассмотрим два варианта настройки:
Пользователи на закладке «Основные» поле «Основное представление» установлено в значение «В виде наименования». Это гарантирует, что 1С будет выводить имя во всех связанных полях.
ВЫБРАТЬ
ДокументПродажа.Ссылка,
ДокументПродажа.Дата,
ДокументПродажа.Номер,
ДокументПродажа.Автор,
ДокументПродажа.Автор.Подразделение КАК ПодразделениеАвтора
ИЗ
Документ.Продажа КАК ДокументПродажа
Как справедливо отметили участники обсуждения, в профессиональной разработке редко «изобретают велосипед». В составе БСП (Библиотека стандартных подсистем) уже есть готовая подсистема «Пользователи», которая берет на себя все задачи по синхронизации пользователей ИБ и элементов справочника, хранению настроек и прав доступа. Рассмотрим преимущества интеграции БСП:
Пользователи уже создан и настроен.Пользователи.ТекущийПользователь().Подведем итог: для корректного отображения имени автора в 1С необходимо использовать ссылочный тип данных, связывать пользователей ИБ со справочником и использовать параметры сеанса для быстрой подстановки данных. Использование типа УникальныйИдентификатор в реквизитах — это тупиковый путь, который усложняет построение отчетов и лишает пользователя возможности удобной навигации и фильтрации данных.