Что лучше использовать в 1С: ПолучитьСсылку() по уникальному идентификатору или НайтиПоКоду()?

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

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

Техническая разница в механизмах работы

Рассмотрим подробнее, что происходит «под капотом» системы при вызове этих методов. Это поможет нам понять, почему один метод может работать быстрее другого.

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

Метод НайтиПоКоду(), напротив, всегда инициирует немедленный запрос к базе данных. Система должна выполнить поиск в таблице, чтобы вернуть либо найденную ссылку, либо ПустаяСсылка(). Даже если поле «Код» индексировано, это все равно полноценная операция поиска на уровне СУБД.

Сравнение производительности: замеры

Для того чтобы не быть голословными, обратимся к результатам практических тестов производительности на файловой базе данных. Выясним, как меняется время выполнения при увеличении количества обрабатываемых объектов.

Результаты для метода ПолучитьСсылку (по GUID):

  1. 1 объект — 0,000 сек.
  2. 100 объектов — 0,002 сек.
  3. 10 000 объектов — 0,154 сек.
  4. 100 000 объектов — 1,582 сек.

Результаты для метода НайтиПоКоду (по полному коду):

  1. 1 объект — 0,002 сек.
  2. 100 объектов — 0,144 сек.
  3. 10 000 объектов — 6,218 сек.
  4. 100 000 объектов — 56,117 сек.

Как мы видим из замеров, ПолучитьСсылку() работает в десятки раз быстрее при массовой обработке. Это связано с тем, что GUID является первичным ключом (Primary Key) в таблицах SQL. Поиск по нему — это поиск по кластерному индексу, что является максимально эффективной операцией для любой СУБД.

Риски жесткого кодирования (Hardcoding)

Несмотря на высокую скорость работы с GUID, использование «зашитых» идентификаторов в коде программы считается плохой практикой. Разберем, к каким проблемам это может привести:

  1. Нечитаемость кода: Согласитесь, конструкция Справочники.Склады.ПолучитьСсылку(Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000")) выглядит абсолютно неинформативно. Понять, какой именно склад имеется в виду, без обращения к базе данных невозможно.
  2. Перенос данных: Если вы выгружаете данные в другую базу через XML или COM-соединение, GUID объектов могут измениться (если не настроена синхронизация по идентификаторам). В этом случае ваш код просто перестанет работать, так как ПолучитьСсылку() вернет объект, которого не существует в новой базе.
  3. Человеческий фактор: Пользователи могут удалить элемент и создать точно такой же визуально, но с новым GUID. В итоге логика, завязанная на идентификатор, «сломается».

С другой стороны, поиск по коду (НайтиПоКоду("00001")) чуть более понятен человеку, но он еще более хрупок. Коды часто меняются при перенумерации справочников или просто по желанию ответственных лиц. Логика программы, завязанная на строковые коды, крайне нестабильна.

Альтернативные и правильные подходы

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

1. Предопределенные элементы

Если какой-то элемент справочника критически важен для работы алгоритма, самым верным решением будет сделать его предопределенным в конфигураторе. В этом случае обращение к нему будет выглядеть так:

СкладОсновной = Справочники.Склады.ОсновнойСклад;

Это максимально быстрый метод, который поддерживается платформой на уровне кэширования, и он абсолютно надежен при переносе данных.

2. Использование настроек и констант

Вместо того чтобы искать склад по коду или GUID в коде, создайте Константу или РегистрСведений (например, «НастройкиПрограммы»), куда пользователь сам выберет нужный элемент один раз. Проанализируем пример кода:


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

3. Метод ЗначениеИзСтрокиВнутр

Существует еще один специфический способ получения ссылки, который иногда упоминается как самый быстрый, но он относится к «низкоуровневым» и использовать его стоит с осторожностью:


Функция ПолучитьНужноеЗначение() Экспорт
    Возврат ЗначениеИзСтрокиВнутр("{""#"",1a939fe1-f2a6-4652-ad43-dfd31bf9a664,37:b13500151719e9e311dcbe91e4466d63}");
КонецФункции

Этот метод фактически восстанавливает объект из внутреннего строкового представления 1С. Однако он еще менее читаем, чем прямой GUID.

Выводы и рекомендации

Подведем итог нашему исследованию:

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

← На главную