Как получить ссылку на объект в справочнике 1С:ERP, если у него нет кода

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

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

Проблема отсутствия кода в справочниках ERP

В типовой конфигурации 1С:ERP для многих справочников по умолчанию отключена автонумерация или само поле Код вообще не используется в пользовательском интерфейсе. Это сделано для того, чтобы не загромождать систему лишними данными и избежать дублирования логики, когда идентификация сущности происходит по другим признакам. Однако для разработчика это создает определенные трудности: мы не можем просто написать НайтиПоКоду("00001"). Рассмотрим альтернативные и более профессиональные способы решения этой задачи.

Способ 1: Использование Уникального Идентификатора (UUID)

Каждый объект в базе данных 1С имеет свой внутренний Уникальный Идентификатор (UUID/GUID). Это 36-символьная строка, которая однозначно определяет объект. Если нам нужно жестко привязаться к конкретному элементу в коде (например, для внешней печатной формы), мы можем использовать этот идентификатор.

Для начала выясним UUID нужной нам должности. Проанализируем пример запроса, который поможет нам вывести наименование и идентификатор всех элементов справочника:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Должности.Ссылка КАК Ссылка,
    |	Должности.Наименование КАК Наименование
    |ИЗ
    |	Справочник.Должности КАК Должности";

РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщить(ВыборкаДетальныеЗаписи.Наименование + " | Идентификатор: " + Строка(ВыборкаДетальныеЗаписи.Ссылка.УникальныйИдентификатор()));
КонецЦикла;

После того как мы получили строку идентификатора (например, "550e8400-e29b-41d4-a716-446655440000"), мы можем восстановить ссылку в коде нашей обработки следующим образом:


НужныйУИД = Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000");
СсылкаНаДолжность = Справочники.Должности.ПолучитьСсылку(НужныйУИД);

// Обязательно проверяем, существует ли такой объект в базе
Если СсылкаНаДолжность.ПолучитьОбъект() = Неопределено Тогда
    Сообщить("Внимание: Объект с указанным UUID не найден в базе данных!");
КонецЕсли;

Преимущества: Этот метод гораздо надежнее поиска по наименованию, так как пользователь может переименовать должность (например, с "Директор" на "Генеральный директор"), но UUID при этом останется прежним.

Недостатки: Если базу данных "развернут" из копии через выгрузку/загрузку XML или объект будет удален и создан заново вручную, UUID изменится, и код перестанет работать.

Способ 2: Использование Дополнительных реквизитов и сведений

Рассмотрим более гибкий подход, характерный именно для современных конфигураций на базе БСП (Библиотека стандартных подсистем). В 1С:ERP есть механизм Дополнительных реквизитов и сведений. Мы можем создать для справочника Должности дополнительный реквизит, например, "ТехническийКод" (тип: Строка) и прописать в нем уникальное значение для нашей печатной формы.

Разберем, как программно найти объект по значению этого дополнительного реквизита:


Функция НайтиДолжностьПоДопРеквизиту(ЗначениеМаркера) Экспорт
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |	ДолжностиДополнительныеРеквизиты.Ссылка КАК Ссылка
        |ИЗ
        |	Справочник.Должности.ДополнительныеРеквизиты КАК ДолжностиДополнительныеРеквизиты
        |ГДЕ
        |	ДолжностиДополнительныеРеквизиты.Свойство.Наименование = &ИмяРеквизита
        |	И ДолжностиДополнительныеРеквизиты.Значение = &ЗначениеМаркера";
    
    Запрос.УстановитьПараметр("ИмяРеквизита", "ТехническийКод (Должности)");
    Запрос.УстановитьПараметр("ЗначениеМаркера", ЗначениеМаркера);
    
    Результат = Запрос.Выполнить();
    Если Не Результат.Пустой() Тогда
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        Возврат Выборка.Ссылка;
    КонецЕсли;
    
    Возврат Справочники.Должности.ПустаяСсылка();
КонецФункции

Этот метод считается наиболее правильным для ERP, так как он позволяет не менять конфигурацию и при этом не зависеть от скрытых системных идентификаторов.

Способ 3: Поиск по Ответственным лицам (регистр сведений)

Если задача стоит в получении должности руководителя или главного бухгалтера организации для печатной формы, правильнее будет обратиться не напрямую к справочнику должностей, а к регистру сведений ОтветственныеЛицаОрганизаций. В ERP именно там хранится информация о том, кто и в какой должности подписывает документы.

Проанализируем ситуацию: нам нужно получить должность руководителя организации на определенную дату. Для этого воспользуемся методом СрезПоследних:


Менеджер = РегистрыСведений.ОтветственныеЛицаОрганизаций.СрезПоследних(Объект.Дата, Новый Структура("Организация, ОтветственноеЛицо", Объект.Организация, Перечисления.ОтветственныеЛицаОрганизаций.Руководитель));

Если ЗначениеЗаполнено(Менеджер) Тогда
    ДолжностьРуководителя = Менеджер.Должность;
    ФизическоеЛицо = Менеджер.ФизическоеЛицо;
КонецЕсли;

Используя этот подход, мы избавляемся от необходимости "зашивать" в код конкретные ссылки. Программа сама возьмет ту должность, которая актуальна для данной организации в данный момент времени.

Способ 4: Настройка параметров во внешней печатной форме

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

Выясним, как это работает:

  1. При добавлении ВПФ в информационную базу администратор открывает настройки обработки.
  2. В поле настроек (если это предусмотрено разработчиком) он выбирает нужную должность из справочника.
  3. В коде формирования печатной формы эти настройки считываются через механизм БСП ДополнительныеОтчетыИОбработки.ПолучитьНастройки().

Резюме: Для быстрого и разового решения во внешней обработке допустимо использовать UUID (Способ 1). Для надежного корпоративного решения лучше использовать Дополнительные реквизиты (Способ 2) или штатные механизмы Ответственных лиц (Способ 3). Поиск по наименованию НайтиПоНаименованию() крайне не рекомендуется из-за высокого риска ошибок при малейшем изменении текста пользователем.

← На главную