Разработка и Конфигурация · 11 мин
Как получить значение элемента справочника в 1С
Как получить значение элемента справочника в 1С: методы НайтиПоКоду, НайтиПоНаименованию, ПолучитьСсылку, работа с реквизитами, запросы и типичные ошибки.
Получение значения элемента справочника — одна из базовых операций при разработке и доработке конфигураций 1С. Она нужна, когда требуется прочитать реквизиты контрагента, номенклатуры, сотрудника или любого другого объекта, найти элемент по известному коду или наименованию, либо проверить, существует ли нужная запись в базе.
Встроенный язык 1С предлагает несколько способов решения этой задачи: методы менеджера справочника, запросы, работа через ссылку и объект. Выбор конкретного способа зависит от того, что известно об элементе (код, наименование, ссылка), нужно ли только читать данные или ещё и изменять их, а также от требований к производительности.
Ниже разобраны основные методы с примерами кода, условиями выбора, типичными ошибками и способами проверки результата. Примеры приведены для управляемого приложения и обычных форм — синтаксис методов в обоих случаях одинаков.
Что понадобится перед началом работы
Прежде чем обращаться к элементу справочника, убедитесь, что у вас есть доступ к нужному объекту метаданных. В конфигураторе откройте ветку «Справочники» и уточните точное имя справочника — именно оно используется в коде, а не синоним, который видит пользователь. Например, справочник с синонимом «Контрагенты» может иметь имя «Контрагенты», но встречаются и варианты вроде «Партнеры» или «КонтрагентыРасш» в доработанных конфигурациях.
Определите, какие данные об элементе вам известны. Если известна ссылка (например, элемент выбран в поле ввода формы) — задача сводится к чтению реквизитов через точку. Если известен код или наименование — используются методы поиска. Если нужны элементы по произвольному условию — потребуется запрос.
Также важно понять цель обращения. Для простого чтения данных создавать объект не нужно — это лишняя нагрузка на базу. Метод ПолучитьОбъект() оправдан только тогда, когда значения реквизитов планируется менять и записывать обратно.
Получение ссылки на элемент по коду или наименованию
Самый частый сценарий — найти элемент по известному коду или наименованию. Для этого у менеджера справочника есть методы НайтиПоКоду() и НайтиПоНаименованию(). Оба возвращают ссылку на элемент, а если элемент не найден — пустую ссылку соответствующего типа.
// Поиск по коду
СсылкаНаЭлемент = Справочники.Номенклатура.НайтиПоКоду("000000123");
// Поиск по наименованию
СсылкаНаЭлемент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
// Проверка результата
Если СсылкаНаЭлемент.Пустая() Тогда
Сообщить("Элемент не найден");
КонецЕсли;
У метода НайтиПоКоду() есть необязательные параметры: признак поиска по полному коду (актуально для иерархических справочников) и ссылка на родителя или владельца, если поиск нужно ограничить конкретной группой. НайтиПоНаименованию() по умолчанию ищет точное совпадение — частичное совпадение через эти методы не ищется, для этого нужен запрос с оператором ПОДОБНО.
Учтите: если в справочнике несколько элементов с одинаковым наименованием, метод вернёт только первый найденный. Для справочников, где дубли наименований возможны (например, физические лица), поиск по наименованию ненадёжен — лучше использовать код, ИНН или другой уникальный реквизит.
Чтение реквизитов через ссылку
Когда ссылка на элемент уже есть, значения его реквизитов доступны напрямую через точку. Платформа автоматически подгружает данные из базы при первом обращении — это называется «обращение через точку от ссылки».
Наименование = СсылкаНаЭлемент.Наименование;
ИНН = СсылкаНаЭлемент.ИНН;
ЭтоГруппа = СсылкаНаЭлемент.ЭтоГруппа;
Такой способ удобен для разового чтения одного-двух реквизитов. Однако каждое обращение через точку от ссылки в цикле формирует отдельное обращение к базе данных. Если нужно обработать сотни элементов или прочитать много реквизитов, правильнее использовать запрос — он получит все данные одним обращением к СУБД.
Чтение табличной части элемента
Табличные части через ссылку тоже доступны, но для их чтения платформа фактически загружает объект целиком. Если из табличной части нужны только некоторые строки или поля, запрос будет эффективнее:
Для Каждого Строка Из СсылкаНаЭлемент.Товары Цикл
Сообщить(Строка.Номенклатура);
КонецЦикла;
Изменение значений: метод ПолучитьОбъект
Через ссылку данные доступны только для чтения. Чтобы изменить реквизиты элемента, нужно получить его объектную версию методом ПолучитьОбъект(), изменить значения и вызвать Записать().
ОбъектЭлемента = СсылкаНаЭлемент.ПолучитьОбъект();
ОбъектЭлемента.Наименование = "Новое наименование";
ОбъектЭлемента.Записать();
При записи срабатывают все проверки заполнения, подписки на события и обработчики, определённые в модуле объекта. Это важно: запись через объект гарантирует соблюдение бизнес-логики конфигурации, но при массовой обработке может выполняться медленно из-за большого числа проверок.
Получение значений через запрос
Запрос — основной инструмент, когда нужно получить значения сразу нескольких элементов, отобрать их по условию или прочитать много реквизитов. Запрос выполняется на стороне сервера базы данных и работает значительно быстрее перебора ссылок.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
| Контрагенты.Наименование КАК Наименование,
| Контрагенты.ИНН КАК ИНН
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И НЕ Контрагенты.ПометкаУдаления";
Запрос.УстановитьПараметр("ИНН", "7707083893");
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
НайденныйКонтрагент = Результат.Ссылка;
КонецЕсли;
Обратите внимание на условие «НЕ ПометкаУдаления» — запрос по умолчанию видит все записи, включая помеченные на удаление, и фильтровать их нужно явно. Также в запросе удобно получать представление элемента, данные родителя и владельца, соединять справочник с другими таблицами.
Для поиска по части наименования используйте оператор ПОДОБНО с символом процента:
Запрос.Текст =
"ВЫБРАТЬ Номенклатура.Ссылка
|ИЗ Справочник.Номенклатура КАК Номенклатура
|ГДЕ Номенклатура.Наименование ПОДОБНО &Шаблон";
Запрос.УстановитьПараметр("Шаблон", "%" + СтрокаПоиска + "%");
Работа с предопределёнными элементами
Предопределённые элементы создаются в конфигураторе и гарантированно присутствуют в базе. Получить их ссылку проще всего — по имени предопределённого элемента, без всякого поиска:
СтавкаНДС = Справочники.СтавкиНДС.НДС20;
// или универсально, если имя хранится в переменной:
СтавкаНДС = Справочники.СтавкиНДС["НДС20"];
Это самый быстрый и надёжный способ: обращение не выполняет поиск по базе, а сразу возвращает известную ссылку. Если предопределённый элемент был удалён из конфигурации, обращение вызовет ошибку — поэтому при обновлении конфигураций проверяйте, не переименованы ли предопределённые элементы, на которые ссылается ваш код.
Сравнение способов получения значения
Подходит для разового поиска одного элемента по известному значению. Ограничение: точное совпадение и только первый найденный элемент.
Подходит для чтения пары реквизитов у известного элемента. Ограничение: медленно в циклах, только чтение.
Подходит для отбора по условиям, массового чтения, частичного совпадения. Ограничение: требует написания текста запроса, только чтение.
Единственный способ изменить данные элемента. Ограничение: самый ресурсоёмкий, не применять для массового чтения.
Проверка результата и типичные ошибки
Главная проверка после поиска — убедиться, что ссылка не пустая. Обращение к реквизиту пустой ссылки вернёт значение по умолчанию или вызовет ошибку в зависимости от контекста, и такая ситуация часто становится источником скрытых дефектов.
Если СсылкаНаЭлемент.Пустая() Тогда
ВызватьИсключение "Элемент справочника не найден";
КонецЕсли;
Дополнительно проверяйте пометку удаления и, для иерархических справочников, признак ЭтоГруппа — если код ожидает элемент, а найдена группа, логика обработки может нарушиться.
Как выбрать подходящий способ
Выбор метода сводится к трём вопросам: что известно об элементе, сколько элементов нужно обработать и требуется ли изменение данных. Для единичного поиска по коду достаточно НайтиПоКоду, для чтения пары полей у известной ссылки — обращения через точку, для выборок и отборов — запроса, а для записи — ПолучитьОбъект с последующим Записать.
Как выбрать способ
При массовых обработках всегда отдавайте предпочтение запросу для чтения, а запись выполняйте порциями с контролем ошибок. Это снижает нагрузку на сервер и уменьшает вероятность конфликтов блокировок при работе пользователей.
Что важно запомнить
Для чтения реквизитов элемента достаточно ссылки, для поиска используйте НайтиПоКоду, НайтиПоНаименованию или запрос, а для изменения — ПолучитьОбъект с записью. Всегда проверяйте результат поиска на пустую ссылку и пометку удаления, а массовую обработку стройте на запросах.
Частые вопросы
Чем ссылка отличается от объекта справочника?
Ссылка — это лёгкий указатель на элемент, через неё доступны реквизиты только для чтения. Объект — полная копия данных элемента в памяти, которую можно изменять и записывать. Получение объекта требует больше ресурсов, поэтому без необходимости его не вызывают.
Как проверить, существует ли элемент, не загружая его данные?
Достаточно получить ссылку (например, через НайтиПоКоду или запрос) и проверить методом Пустая(). Если ссылка не пустая — элемент существует. Дополнительно можно проверить реквизит ПометкаУдаления, если нужно убедиться, что элемент активен.
Почему НайтиПоНаименованию не находит элемент, который точно есть?
Метод ищет точное совпадение с учётом регистра букв и всех пробелов. Проверьте наличие лишних пробелов в начале или конце наименования, а также неразрывные пробелы. Если нужен поиск по части строки, используйте запрос с оператором ПОДОБНО.
Как получить значение реквизита элемента на управляемой форме?
Если элемент выбран в поле формы, его ссылка хранится в соответствующем реквизите формы. Реквизиты элемента читаются через точку, но в клиентском контексте это может быть недоступно — тогда чтение выполняют в серверной процедуре формы, передавая туда ссылку.
Можно ли получить элемент по уникальному идентификатору?
Да. Если известен GUID элемента (например, из внешней системы), ссылку получают так: Справочники.ИмяСправочника.ПолучитьСсылку(Новый УникальныйИдентификатор("строка-guid")). Это стандартный способ сопоставления данных при обмене между базами.
Что делать, если поиск по коду возвращает не тот элемент в иерархическом справочнике?
В иерархических справочниках коды могут повторяться в разных группах при неуникальной нумерации. Передайте в НайтиПоКоду вторым параметром Истина (поиск по полному коду) или третьим параметром ссылку на родителя, чтобы ограничить поиск нужной группой.