Как найти номенклатуру по ID (GUID) в 1С: подробное руководство

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

В практике разработчика 1С часто возникает задача поиска объекта в базе данных, если известен только его уникальный идентификатор (GUID). Это может быть необходимо при интеграции систем, загрузке данных из внешних источников (Excel, SQL, JSON) или при отладке механизмов обмена. В этой статье мы подробно разберем, как реализовать поиск номенклатуры по ID, рассмотрим нюансы работы с "битыми" ссылками и выберем наиболее эффективные методы проверки существования объекта.

Базовый метод: использование объекта УникальныйИдентификатор

Самый простой и быстрый способ получить ссылку на объект, зная его строковый ID, — это использование метода ПолучитьСсылку. Разберем этот процесс по шагам. Для начала нам нужно преобразовать текстовую строку формата 0c62da98-f8dd-11e6-aa3c-0025900af3ff в специальный объект платформы УникальныйИдентификатор.

Рассмотрим пример кода, который можно разместить в обработчике нажатия кнопки на форме:


// Предположим, что ИдентификаторТекст — это строковое поле на форме
ИдентификаторОбъект = Новый УникальныйИдентификатор(ИдентификаторТекст);
НайденнаяСсылка = Справочники.Номенклатура.ПолучитьСсылку(ИдентификаторОбъект);

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

Проблема "призрачных" ссылок и проверка на существование

Проанализируем важную особенность метода ПолучитьСсылку: он всегда возвращает ссылку, даже если объекта с таким ID в базе данных никогда не существовало. Это так называемая "битая" или "призрачная" ссылка. Если мы просто выведем результат пользователю, он может увидеть пустую строку или надпись "Объект не найден", но сама переменная не будет пустой.

Чтобы убедиться, что номенклатура действительно существует в базе, нам нужно проверить наличие данных. Рассмотрим простой, но не самый оптимальный способ проверки через обращение к реквизиту:


НоменклатураСсылка = Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор(ИдентификаторТекст));

Если ЗначениеЗаполнено(НоменклатураСсылка.Наименование) Тогда
    // Объект найден и данные считаны
    ОбъектНайден = Истина;
Иначе
    // Скорее всего, объекта с таким ID нет в базе
    ОбъектНайден = Ложь;
КонецЕсли;

Этот метод заставляет систему обратиться к базе данных. Однако, если объект не существует, обращение к Наименование вернет пустую строку, а если существует — система подгрузит весь объект в кэш. Разберем более правильный подход далее.

Эффективная проверка существования через запрос

Для того чтобы не нагружать систему лишним чтением данных (особенно если у номенклатуры много реквизитов или тяжелые табличные части), рекомендуется использовать запрос. Это наиболее профессиональный способ проверки существования записи в SQL-таблице.

Выясним, как составить такой запрос:


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

Запрос.УстановитьПараметр("Ссылка", НужнаяСсылка);
РезультатЗапроса = Запрос.Выполнить();

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

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

Массовый поиск номенклатуры по списку ID

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

  1. Сначала мы собираем все строковые ID в массив.
  2. Преобразуем массив строк в массив объектов УникальныйИдентификатор.
  3. Передаем этот массив в запрос с условием ГДЕ Ссылка В (&МассивИдентификаторов).

Посмотрим на пример реализации:


МассивGUID = Новый Массив;
Для Каждого СтрID Из СписокСтроковыхID Цикл
    Попытка
        МассивGUID.Добавить(Новый УникальныйИдентификатор(СтрID));
    Исключение
        // Обработка некорректного формата строки
    КонецПопытки;
КонецЦикла;

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Номенклатура.Ссылка,
    |	Номенклатура.Наименование
    |ИЗ
    |	Справочник.Номенклатура КАК Номенклатура
    |ГДЕ
    |	Номенклатура.Ссылка В (&МассивGUID)";

Запрос.УстановитьПараметр("МассивGUID", МассивGUID);
ТаблицаРезультатов = Запрос.Выполнить().Выгрузить();

Такой подход позволяет получить все существующие объекты за одно обращение к базе данных, что значительно ускоряет работу обработки.

Важные нюансы: форматирование и типы ID

Рассмотрим подводные камни, с которыми можно столкнуться при реализации поиска.

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

2. Внешние ID vs Системные GUID. Иногда под "ID номенклатуры" пользователи подразумевают артикул, код или идентификатор из другой системы (например, "ID битрикса" или "код в SAP"), который хранится в дополнительном реквизите. В этом случае метод ПолучитьСсылку не сработает. Нужно использовать поиск по реквизиту:


НайденнаяСсылка = Справочники.Номенклатура.НайтиПоРеквизиту("ИдентификаторВоВнешнейСистеме", ЗначениеID);

3. Регистр символов. Хотя GUID в 1С обычно отображается в нижнем регистре, платформа при создании объекта УникальныйИдентификатор из строки нечувствительна к регистру (A-F или a-f), что облегчает задачу программисту.

Альтернатива: Навигационные ссылки

Если ваша задача — просто быстро открыть карточку номенклатуры в пользовательском интерфейсе, зная её ID, можно воспользоваться механизмом навигационных ссылок. Нажмите Shift+F11 в программе, и вы увидите окно перехода по ссылке. Формат такой ссылки для справочника выглядит следующим образом: e1cib/data/Справочник.Номенклатура?ref=85f20025900af3ff11e74098674d7542.

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

Подводя итог, мы разобрали, что поиск по ID в 1С — это простая, но требующая аккуратности задача. Используйте ПолучитьСсылку для формирования объекта и Запрос для подтверждения его реального наличия в базе данных.

← На главную