К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как обратиться к реквизиту справочника из модуля в 1С

Разбираем способы обращения к реквизитам справочника из программного модуля 1С: через ссылку, объект, запрос и менеджер справочника, с примерами кода.

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

Выбор зависит от того, что у вас есть на входе: ссылка на элемент, его код или наименование, либо только условия отбора. Также важно, нужно ли только прочитать данные или планируется их изменение — от этого зависит, достаточно ли чтения через ссылку или потребуется получение объекта.

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

Обращение к реквизиту через ссылку

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

НоменклатураСсылка = Справочники.Номенклатура.НайтиПоКоду("000000123");

Если Не НоменклатураСсылка.Пустая() Тогда

Артикул = НоменклатураСсылка.Артикул;

СтавкаНДС = НоменклатураСсылка.СтавкаНДС;

КонецЕсли;

Обратите внимание: каждое обращение через точку к реквизиту, не входящему в кэш ссылки, может вызывать отдельное обращение к базе. Если нужно прочитать пять-десять реквизитов, лучше использовать запрос или получить объект один раз.

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

Получение объекта справочника для чтения и записи

Если нужно не только прочитать, но и изменить реквизиты, используйте метод ПолучитьОбъект(). Он загружает элемент целиком в память, и дальнейшие обращения к реквизитам уже не идут в базу.

ЭлементОбъект = СсылкаНаЭлемент.ПолучитьОбъект();

ЭлементОбъект.Наименование = "Новое наименование";

ЭлементОбъект.Комментарий = "Изменено программно";

ЭлементОбъект.Записать();

Метод ПолучитьОбъект() возвращает значение Неопределено, если элемент был удалён из базы между получением ссылки и вызовом метода. Перед работой с объектом проверяйте результат, иначе получите ошибку «Значение не является значением объектного типа».

Поиск элемента и обращение к реквизиту

Часто ссылки на элемент нет — есть только код, наименование или значение реквизита. Для поиска используются методы менеджера справочника: НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту().

// Поиск по наименованию (точное совпадение)

КонтрагентСсылка = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");

// Поиск по произвольному реквизиту

КонтрагентСсылка = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7712345678");

Если КонтрагентСсылка.Пустая() Тогда

// Элемент не найден — обязательно обрабатываем эту ситуацию

Возврат;

КонецЕсли;

КПП = КонтрагентСсылка.КПП;

Метод НайтиПоРеквизиту() возвращает первый попавшийся элемент с указанным значением. Если реквизит не уникален, результат может быть непредсказуемым — для таких случаев надёжнее запрос с отбором.

Чтение реквизитов через запрос

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

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Артикул КАК Артикул,

| Номенклатура.СтавкаНДС КАК СтавкаНДС

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| Номенклатура.Родитель = &Группа

| И НЕ Номенклатура.ПометкаУдаления";

Запрос.УстановитьПараметр("Группа", ГруппаТоваров);

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

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Артикул + " — " + Выборка.СтавкаНДС);

КонецЦикла;

Для чтения реквизитов одного известного элемента тоже удобен запрос — он забирает только нужные поля одним обращением. В типовых конфигурациях для этого часто используются готовые функции общих модулей, например ОбщегоНазначения.ЗначенияРеквизитовОбъекта(Ссылка, "Артикул,СтавкаНДС") в конфигурациях на БСП.

Сравнение способов

Через ссылку (Ссылка.Реквизит)

Подходит для чтения 1–2 реквизитов одного элемента. Просто, но каждое обращение может идти в базу.

ПолучитьОбъект()

Нужен при изменении данных. Загружает элемент целиком, требует Записать() и проверки на Неопределено.

Запрос

Оптимален для массового чтения и сложных отборов. Не подходит для записи данных.

Функции БСП

В типовых конфигурациях — готовые ЗначенияРеквизитовОбъекта(). Удобно, но зависит от наличия библиотеки.

Особенности работы в клиентском и серверном модулях

На тонком и веб-клиенте прямое обращение к базе недоступно: запросы, методы НайтиПоКоду() и ПолучитьОбъект() работают только на сервере. Если код выполняется в клиентской процедуре формы, данные нужно получать через серверный вызов.

Типовой приём — вынести логику в серверную процедуру общего модуля с признаками «Сервер» и «Вызов сервера», а из клиентского кода вызывать её, передавая ссылку и получая структуру со значениями реквизитов.

// Общий модуль РаботаСоСправочникамиСервер (Сервер, Вызов сервера)

Функция ПолучитьРеквизитыКонтрагента(Ссылка) Экспорт

Результат = Новый Структура;

Результат.Вставить("ИНН", Ссылка.ИНН);

Результат.Вставить("КПП", Ссылка.КПП);

Возврат Результат;

КонецФункции;

В модулях формы управляемого приложения используйте директивы &НаСервере и &НаКлиенте. Обращение к реквизитам справочника размещайте в серверных процедурах — иначе компилятор выдаст ошибку о недоступности метода.

Обращение к табличной части и предопределённым элементам

Табличные части справочника недоступны через ссылку — их можно прочитать только через объект или запрос. Через объект табличная часть доступна как коллекция строк:

ЭлементОбъект = СсылкаНаЭлемент.ПолучитьОбъект();

Для Каждого СтрокаТЧ Из ЭлементОбъект.ЕдиницыИзмерения Цикл

Сообщить(СтрокаТЧ.ЕдиницаИзмерения);

КонецЦикла;

Для предопределённых элементов есть короткий путь: обращение по имени через менеджер справочника. Имя задаётся в конфигураторе и доступно в коде как свойство.

ВалютаРуб = Справочники.Валюты.Рубли; // предопределённый элемент

КодВалюты = ВалютаРуб.Код;

Типичные ошибки
01
Обращение к реквизиту несуществующей ссылки без проверки Пустая() — приводит к ошибке или пустым значениям.
02
Использование НайтиПоНаименованию() без учёта того, что наименования могут дублироваться.
03
Чтение реквизитов в цикле через ссылку вместо одного запроса — резкое падение производительности.
04
Попытка вызвать ПолучитьОбъект() на тонком клиенте — метод недоступен вне сервера.
05
Забытый вызов Записать() после изменения реквизитов объекта — изменения теряются молча.

Проверка результата и отладка

После получения значения реквизита убедитесь, что оно соответствует ожиданиям. Полезные проверки: ссылка не пустая, объект не равен Неопределено, тип значения реквизита совпадает с ожидаемым.

Контрольные точки

Как проверить результат

Ссылка на элемент
Норма

Ссылка.Пустая() возвращает Ложь

Тревожный признак

Пустая ссылка — элемент не найден, обращение к реквизитам даст пустые значения

Полученный объект
Норма

ПолучитьОбъект() вернул объект, реквизиты читаются

Тревожный признак

Возвращено Неопределено — элемент удалён из базы

Значение реквизита
Норма

Тип значения совпадает с типом реквизита в конфигураторе

Тревожный признак

Неопределено или значение другого типа — ошибка в имени реквизита или данных

Для отладки используйте точки останова в конфигураторе и просматривайте значения через табло (Shift+F9). Это быстрее, чем вывод сообщений, и позволяет увидеть структуру объекта целиком, включая табличные части.

Часто задаваемые вопросы

Почему обращение Ссылка.Реквизит возвращает пустое значение?

Чаще всего ссылка пустая (элемент не найден) либо указано неверное имя реквизита. Проверьте Ссылка.Пустая() и сверьте имя реквизита с конфигуратором — встроенный язык чувствителен к точному написанию имени, хотя и не к регистру.

Можно ли обратиться к реквизиту по имени, хранящемуся в строке?

Да, через квадратные скобки: Ссылка[ИмяРеквизита], где ИмяРеквизита — строковая переменная. Это удобно для универсальных механизмов, но лишает проверки имени на этапе компиляции модуля.

Что быстрее: обращение через ссылку или запрос?

Для одного-двух реквизитов разница незаметна. При чтении нескольких реквизитов или обработке множества элементов запрос заметно эффективнее, так как выполняет одно обращение к базе вместо множества мелких.

Как получить реквизит справочника в модуле формы документа?

Если реквизит документа содержит ссылку на справочник, на сервере доступно обращение через точку: Объект.Контрагент.ИНН. В клиентской процедуре используйте вызов серверной функции, возвращающей нужные значения.

Чем отличается Ссылка от Объекта в 1С?

Ссылка — лёгкий идентификатор элемента, позволяет читать реквизиты, но не менять их. Объект — полная копия элемента в памяти, поддерживает изменение и запись, но тяжелее и требует вызова Записать().

Как обратиться к реквизиту помеченного на удаление элемента?

Технически так же, как к обычному — пометка удаления не блокирует чтение. Однако запросы с отбором часто исключают помеченные элементы условием НЕ ПометкаУдаления, поэтому в выборке такой элемент может отсутствовать.

Итог

Что важно запомнить

Для чтения пары реквизитов достаточно обращения через ссылку, для изменения данных нужен ПолучитьОбъект() с последующим Записать(), для массовой обработки — запрос. Всегда проверяйте ссылку на пустоту, а объект — на Неопределено, и помните: на тонком клиенте работа с базой доступна только через серверные вызовы.