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

Справочники и Данные · 13 мин

Как обратиться к справочнику в 1С

Как обратиться к справочнику в 1С: через интерфейс, встроенный язык, запросы и COM. Примеры кода, типичные ошибки и проверка результата.

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

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

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

В типовых конфигурациях (1С:Бухгалтерия, Управление торговлей, ЗУП) справочники разнесены по функциональным разделам. Например, «Номенклатура» обычно находится в разделе «Склад» или «НСИ и администрирование», «Контрагенты» — в разделе «Продажи» или «Справочники». Точное расположение зависит от конфигурации и её версии, поэтому универсальный путь — поиск.

Быстрый способ найти нужный справочник — строка поиска в верхней части окна (в тонком клиенте она вызывается через меню или начинает работать при вводе в поле поиска по меню). Введите название, например «склады», и система покажет подходящие объекты. Если поиск по меню отключён или нужного пункта нет, откройте полный список объектов: главное меню → «Все функции» → раздел «Справочники». Команда «Все функции» может быть скрыта — тогда её включают через «Сервис» → «Параметры» → флажок «Отображать команду "Все функции"».

Как открыть справочник через интерфейс
  1. 1
    Откройте главное меню и выберите «Все функции» (при необходимости включите команду в параметрах).
  2. 2
    В дереве объектов раскройте ветку «Справочники» и найдите нужный по имени.
  3. 3
    Дважды щёлкните по имени — откроется форма списка.
  4. 4
    Используйте поиск по наименованию, отборы и сортировку, чтобы найти конкретный элемент.
  5. 5
    Откройте карточку элемента двойным щелчком для просмотра или редактирования.

Если справочник не отображается ни в разделах, ни в «Все функции», проверьте права: у пользователя может не быть роли на просмотр этого объекта. Это штатное ограничение, а не ошибка программы — обратитесь к администратору за назначением прав.

Обращение к справочнику из встроенного языка: базовый синтаксис

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

Менеджер предоставляет методы поиска и создания. Основные из них: НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту(), Выбрать(), СоздатьЭлемент(), ПустаяСсылка(). Все методы поиска возвращают ссылку на элемент; если элемент не найден — пустую ссылку, которую обязательно нужно проверять.

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

Если НайденныйКонтрагент.Пустая() Тогда
    Сообщить("Контрагент не найден");
Иначе
    ИНН = НайденныйКонтрагент.ИНН; // обращение к реквизиту через точку
КонецЕсли;

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

Поиск элементов: по коду, наименованию и реквизиту

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

Метод НайтиПоНаименованию("Текст", Истина) со вторым параметром Истина ищет точное совпадение, без него — по началу строки. Точный поиск надёжнее, но чувствителен к лишним пробелам и регистру в зависимости от СУБД. Если наименования не уникальны, метод вернёт первый попавшийся элемент — для таких случаев безопаснее поиск по уникальному реквизиту, например по ИНН для контрагентов: Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7707083893").

Маршрут решения

Какой метод поиска выбрать

Известен код элемента и он уникаленИспользуйте НайтиПоКоду с точным значением, учитывая формат кода
Известно наименование и оно уникальноИспользуйте НайтиПоНаименование с параметром точного поиска
Есть уникальный реквизит (ИНН, артикул, штрихкод)Используйте НайтиПоРеквизиту — это самый надёжный вариант
Нужно получить много элементов по условиюИспользуйте запрос, а не перебор с поиском
Элемент может отсутствовать и это нормальноПроверяйте результат методом Пустая() перед дальнейшей работой

Для иерархических справочников (папки и элементы) методы поиска принимают дополнительные параметры: родителя и владельца. Если искать элемент без указания родителя, можно получить не тот объект, когда в разных папках лежат одноимённые элементы.

Обращение к справочнику через запрос

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

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

Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
    Сообщить(Результат.Код + " — " + Результат.Наименование);
КонецЦикла;

Обратите внимание на типичные фильтры: ЭтоГруппа исключает папки в иерархических справочниках, ПометкаУдаления — помеченные на удаление элементы. Без этих условий выборка будет содержать «мусор», который потом попадёт в отчёты и обмены. Для подчинённых справочников дополнительно фильтруют по владельцу.

Результат запроса можно получить тремя способами: Выбрать() — последовательный обход (экономит память на больших выборках), Выгрузить() — таблица значений (удобна для произвольного доступа и сортировки), Выгрузить().ВыгрузитьКолонку() — массив значений одного поля. Для десятков тысяч строк предпочтителен обход выборки без выгрузки в таблицу.

Создание и изменение элементов справочника

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

При записи срабатывают подписки на события и проверки заполнения, заложенные в конфигурации. Если запись «не проходит», смотрите текст исключения: чаще всего не заполнен обязательный реквизит или нарушена уникальность. Принудительный обход проверок через ОбменДанными.Загрузка = Истина допустим только в обменах и при полном понимании последствий — так можно записать некорректные данные, которые потом ломают отчёты и проведение документов.

Типичные ошибки при работе со справочниками
01
Обращение к реквизиту без проверки пустой ссылки — ошибка «Поле объекта не обнаружено» или пустые значения в отчёте
02
Обращение к реквизитам через точку в цикле — тысячи неявных запросов к базе и сильное замедление
03
Поиск по наименованию без учёта дублей — изменён не тот элемент
04
Игнорирование пометки удаления и групп в выборках — в обмены попадают лишние данные
05
Изменение ссылки вместо объекта — попытка присвоить значение реквизиту ссылки не сохраняется
06
Запись с ОбменДанными.Загрузка = Истина без необходимости — пропуск проверок и неконсистентные данные

Обращение к справочнику извне: COM, веб-сервисы, HTTP

Из внешних систем к справочникам 1С обращаются через механизмы интеграции. Классический вариант для Windows — COM-соединение (V83.COMConnector): внешний скрипт подключается к базе и использует тот же объектный API, включая Справочники. Это работает только для файловых и клиент-серверных баз на Windows и требует установленной платформы той же версии.

Современный вариант — HTTP-интерфейсы: стандартный OData (публикация на веб-сервере, доступ к справочникам по REST-подобному протоколу) или собственные HTTP-сервисы, разработанные в конфигурации. OData подходит для простого чтения данных, собственные HTTP-сервисы — когда нужна бизнес-логика, контроль прав и нестандартные форматы. Для интеграции между базами 1С традиционно используют планы обмена и EnterpriseData.

Способы доступа к справочнику

Пользовательский интерфейс

Разовый просмотр и ручное редактирование; не подходит для массовых операций

Встроенный язык (менеджер справочника)

Поиск и изменение отдельных элементов в коде; медленно для больших выборок

Запрос

Массовая выборка для отчётов и обработок; только чтение данных

COM-соединение

Внешние скрипты на Windows; требует платформу и не работает через интернет

OData / HTTP-сервисы

Интеграция через сеть; требует публикации и настройки аутентификации

Как проверить, что обращение выполнено правильно

Минимальная проверка программного поиска — убедиться, что ссылка не пустая и относится к нужному типу. Для дальнейшей диагностики полезно вывести уникальный идентификатор: Строка(Ссылка.УникальныйИдентификатор()) — по GUID элемент однозначно находится в базе и в конфигураторе.

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

Как проверить результат обращения

Ссылка после поиска
Норма

Пустая() возвращает Ложь, элемент открывается в интерфейсе

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

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

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

Реквизиты заполнены ожидаемыми данными

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

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

Результат запроса
Норма

Количество строк соответствует ожиданию, нет групп и помеченных

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

Лишние строки — добавьте фильтры ЭтоГруппа и ПометкаУдаления

Записанный элемент
Норма

Открывается в интерфейсе, проходит штатные проверки, используется в документах

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

Ошибки при проведении документов — вероятно, запись выполнена в обход проверок

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

Итог

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

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

Частые вопросы

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

Откройте конфигуратор, в дереве конфигурации раскройте ветку «Справочники» — колонка «Имя» содержит программное имя. Альтернатива без конфигуратора: в режиме предприятия открыть справочник и посмотреть техническую информацию об объекте (в типовых конфигурациях доступна через «Ещё» → «Вывести список» или через функциональность для разработчиков, если она включена).

Почему НайтиПоНаименованию не находит элемент, который точно есть?

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

Чем ссылка отличается от объекта справочника?

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

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

Методом Выбрать(): Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл ... КонецЦикла;. Способ рабочий, но уступает запросу: обход через Выбрать() читает объекты по одному и медленнее на больших объёмах. Для выгрузок и отчётов предпочтительнее запрос.

Можно ли обратиться к справочнику, которого нет в моей конфигурации?

Нет, обратиться можно только к объектам, описанным в метаданных текущей конфигурации. Если данные хранятся в другой базе 1С, используйте COM-соединение, HTTP-сервисы, OData или механизмы обмена. Попытка обратиться к несуществующему имени вызовет ошибку компиляции или выполнения модуля.

Что делать, если при записи элемента возникает ошибка прав доступа?

Это означает, что у пользователя, под которым выполняется код, нет права «Добавление» или «Изменение» на этот справочник. Варианты: выполнить операцию под пользователем с нужными правами, использовать привилегированный режим (УстановитьПривилегированныйРежим) в серверном коде — но только осознанно, поскольку это отключает проверку прав, либо попросить администратора расширить роль.