В процессе разработки на платформе 1С:Предприятие перед программистом часто встает задача получения конкретной ссылки на элемент справочника или другого объекта метаданных. Обычно выбор стоит между использованием метода ПолучитьСсылку() с передачей в него УникальныйИдентификатор (GUID) или поиском по строковому коду через НайтиПоКоду(). На первый взгляд кажется, что это вопрос лишь удобства написания кода, но на самом деле за этим кроются серьезные различия в производительности, стабильности и архитектурной чистоте решения. В этой статье мы подробно разберем, какой метод и в каких ситуациях стоит применять.
Рассмотрим подробнее, что происходит «под капотом» системы при вызове этих методов. Это поможет нам понять, почему один метод может работать быстрее другого.
Метод МенеджерСправочника.ПолучитьСсылку(УИД) обладает уникальной особенностью: он не обращается к базе данных в момент вызова. Проанализируем ситуацию: система просто создает в оперативной памяти объект ссылки, используя переданный GUID. Проверка того, существует ли реальный объект с таким идентификатором в таблице СУБД, откладывается до того момента, пока вы не попытаетесь прочитать свойства этой ссылки (например, Ссылка.Наименование). Если объекта нет, вы получите «битую» ссылку, но сам метод ПолучитьСсылку() отработает мгновенно.
Метод НайтиПоКоду(), напротив, всегда инициирует немедленный запрос к базе данных. Система должна выполнить поиск в таблице, чтобы вернуть либо найденную ссылку, либо ПустаяСсылка(). Даже если поле «Код» индексировано, это все равно полноценная операция поиска на уровне СУБД.
Для того чтобы не быть голословными, обратимся к результатам практических тестов производительности на файловой базе данных. Выясним, как меняется время выполнения при увеличении количества обрабатываемых объектов.
Результаты для метода ПолучитьСсылку (по GUID):
Результаты для метода НайтиПоКоду (по полному коду):
Как мы видим из замеров, ПолучитьСсылку() работает в десятки раз быстрее при массовой обработке. Это связано с тем, что GUID является первичным ключом (Primary Key) в таблицах SQL. Поиск по нему — это поиск по кластерному индексу, что является максимально эффективной операцией для любой СУБД.
Несмотря на высокую скорость работы с GUID, использование «зашитых» идентификаторов в коде программы считается плохой практикой. Разберем, к каким проблемам это может привести:
Справочники.Склады.ПолучитьСсылку(Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000")) выглядит абсолютно неинформативно. Понять, какой именно склад имеется в виду, без обращения к базе данных невозможно.ПолучитьСсылку() вернет объект, которого не существует в новой базе.С другой стороны, поиск по коду (НайтиПоКоду("00001")) чуть более понятен человеку, но он еще более хрупок. Коды часто меняются при перенумерации справочников или просто по желанию ответственных лиц. Логика программы, завязанная на строковые коды, крайне нестабильна.
Разберем, как реализовать получение ссылки правильно, следуя современным стандартам разработки (например, стандартам БСП).
1. Предопределенные элементы
Если какой-то элемент справочника критически важен для работы алгоритма, самым верным решением будет сделать его предопределенным в конфигураторе. В этом случае обращение к нему будет выглядеть так:
СкладОсновной = Справочники.Склады.ОсновнойСклад;
Это максимально быстрый метод, который поддерживается платформой на уровне кэширования, и он абсолютно надежен при переносе данных.
2. Использование настроек и констант
Вместо того чтобы искать склад по коду или GUID в коде, создайте Константу или РегистрСведений (например, «НастройкиПрограммы»), куда пользователь сам выберет нужный элемент один раз. Проанализируем пример кода:
// Получаем ссылку из константы, которую заполнил пользователь
СкладДляОтгрузки = Константы.ОсновнойСкладДляПродаж.Получить();
Если СкладДляОтгрузки.Пустая() Тогда
Сообщить("В настройках не указан основной склад!");
КонецЕсли;
3. Метод ЗначениеИзСтрокиВнутр
Существует еще один специфический способ получения ссылки, который иногда упоминается как самый быстрый, но он относится к «низкоуровневым» и использовать его стоит с осторожностью:
Функция ПолучитьНужноеЗначение() Экспорт
Возврат ЗначениеИзСтрокиВнутр("{""#"",1a939fe1-f2a6-4652-ad43-dfd31bf9a664,37:b13500151719e9e311dcbe91e4466d63}");
КонецФункции
Этот метод фактически восстанавливает объект из внутреннего строкового представления 1С. Однако он еще менее читаем, чем прямой GUID.
Подведем итог нашему исследованию:
ПолучитьСсылку() по GUID технически быстрее, чем НайтиПоКоду(), и его оправдано применять только в специализированных обработках обмена данными или высоконагруженных циклах, где производительность критична, а GUID гарантированно не изменится.Помните, что выигрыш нескольких миллисекунд на методе поиска не имеет смысла, если последующий запрос к базе данных выполняется несколько минут. Оптимизируйте код комплексно, отдавая приоритет надежности и читаемости.