Справочники и Данные · 13 мин
Как обратиться к справочнику в 1С
Как обратиться к справочнику в 1С: через интерфейс, встроенный язык, запросы и COM. Примеры кода, типичные ошибки и проверка результата.
Справочник в 1С — это объект конфигурации для хранения условно-постоянной информации: номенклатуры, контрагентов, сотрудников, складов, валют. Обратиться к справочнику можно двумя принципиально разными способами: через пользовательский интерфейс (открыть список, найти элемент, посмотреть карточку) и программно — через встроенный язык 1С, запросы или внешние механизмы интеграции. Выбор способа зависит от задачи: разовый просмотр данных не требует кода, а обработка, отчёт или обмен — требуют.
Ошибки при обращении к справочникам — одна из самых частых причин неработающих доработок: неверное имя справочника, обращение к несуществующему реквизиту, попытка получить значение из пустой ссылки. Ниже разобраны рабочие способы обращения с примерами кода, критериями выбора и методами проверки результата.
Как открыть справочник в пользовательском интерфейсе
В типовых конфигурациях (1С:Бухгалтерия, Управление торговлей, ЗУП) справочники разнесены по функциональным разделам. Например, «Номенклатура» обычно находится в разделе «Склад» или «НСИ и администрирование», «Контрагенты» — в разделе «Продажи» или «Справочники». Точное расположение зависит от конфигурации и её версии, поэтому универсальный путь — поиск.
Быстрый способ найти нужный справочник — строка поиска в верхней части окна (в тонком клиенте она вызывается через меню или начинает работать при вводе в поле поиска по меню). Введите название, например «склады», и система покажет подходящие объекты. Если поиск по меню отключён или нужного пункта нет, откройте полный список объектов: главное меню → «Все функции» → раздел «Справочники». Команда «Все функции» может быть скрыта — тогда её включают через «Сервис» → «Параметры» → флажок «Отображать команду "Все функции"».
- 1Откройте главное меню и выберите «Все функции» (при необходимости включите команду в параметрах).
- 2В дереве объектов раскройте ветку «Справочники» и найдите нужный по имени.
- 3Дважды щёлкните по имени — откроется форма списка.
- 4Используйте поиск по наименованию, отборы и сортировку, чтобы найти конкретный элемент.
- 5Откройте карточку элемента двойным щелчком для просмотра или редактирования.
Если справочник не отображается ни в разделах, ни в «Все функции», проверьте права: у пользователя может не быть роли на просмотр этого объекта. Это штатное ограничение, а не ошибка программы — обратитесь к администратору за назначением прав.
Обращение к справочнику из встроенного языка: базовый синтаксис
Программный доступ к любому справочнику начинается с менеджера объекта: Справочники.ИмяСправочника. Имя — это не синоним, который видит пользователь, а имя объекта в конфигураторе. Например, справочник с синонимом «Физические лица» может называться в метаданных ФизическиеЛица. Уточнить имя можно в конфигураторе в дереве метаданных (ветка «Справочники») или через синтакс-помощник.
Менеджер предоставляет методы поиска и создания. Основные из них: НайтиПоКоду(), НайтиПоНаименованию(), НайтиПоРеквизиту(), Выбрать(), СоздатьЭлемент(), ПустаяСсылка(). Все методы поиска возвращают ссылку на элемент; если элемент не найден — пустую ссылку, которую обязательно нужно проверять.
// Поиск контрагента по наименованию
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоНаименованию("ООО Ромашка");
Если НайденныйКонтрагент.Пустая() Тогда
Сообщить("Контрагент не найден");
Иначе
ИНН = НайденныйКонтрагент.ИНН; // обращение к реквизиту через точку
КонецЕсли;Обращение к реквизитам элемента выполняется через точку от ссылки: Ссылка.Наименование, Ссылка.ИНН. Важно понимать: при таком обращении платформа неявно выполняет запрос к базе и получает объект целиком. В циклах по тысячам элементов это приводит к заметному падению производительности — там правильнее использовать запрос.
Поиск элементов: по коду, наименованию и реквизиту
Метод НайтиПоКоду("000000123") ищет по точному совпадению кода. Учтите: код может быть строковым, и тогда важны ведущие нули и длина — «123» и «000000123» это разные значения. Для числовых кодов с автонумерацией платформа сама управляет форматом, но при переносе данных из других систем расхождения форматов — частая причина «ненайденных» элементов.
Метод НайтиПоНаименованию("Текст", Истина) со вторым параметром Истина ищет точное совпадение, без него — по началу строки. Точный поиск надёжнее, но чувствителен к лишним пробелам и регистру в зависимости от СУБД. Если наименования не уникальны, метод вернёт первый попавшийся элемент — для таких случаев безопаснее поиск по уникальному реквизиту, например по ИНН для контрагентов: Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", "7707083893").
Какой метод поиска выбрать
Для иерархических справочников (папки и элементы) методы поиска принимают дополнительные параметры: родителя и владельца. Если искать элемент без указания родителя, можно получить не тот объект, когда в разных папках лежат одноимённые элементы.
Обращение к справочнику через запрос
Запрос — основной инструмент массовой выборки. Он выполняется на стороне сервера СУБД, выбирает только нужные поля и не создаёт объекты в памяти. Для отчётов, обработок и обменов это стандартный подход.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка,
| Номенклатура.Код КАК Код,
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| НЕ Номенклатура.ПометкаУдаления
| И НЕ Номенклатура.ЭтоГруппа";
Результат = Запрос.Выполнить().Выбрать();
Пока Результат.Следующий() Цикл
Сообщить(Результат.Код + " — " + Результат.Наименование);
КонецЦикла;Обратите внимание на типичные фильтры: ЭтоГруппа исключает папки в иерархических справочниках, ПометкаУдаления — помеченные на удаление элементы. Без этих условий выборка будет содержать «мусор», который потом попадёт в отчёты и обмены. Для подчинённых справочников дополнительно фильтруют по владельцу.
Результат запроса можно получить тремя способами: Выбрать() — последовательный обход (экономит память на больших выборках), Выгрузить() — таблица значений (удобна для произвольного доступа и сортировки), Выгрузить().ВыгрузитьКолонку() — массив значений одного поля. Для десятков тысяч строк предпочтителен обход выборки без выгрузки в таблицу.
Создание и изменение элементов справочника
Новый элемент создаётся через объект, а не через ссылку: Справочники.Номенклатура.СоздатьЭлемент() возвращает объект, у которого заполняют реквизиты и вызывают Записать(). Для иерархических справочников создание папки выполняется методом СоздатьГруппу(). Изменение существующего элемента начинается с Ссылка.ПолучитьОбъект() — только объект можно модифицировать, ссылка доступна только для чтения.
При записи срабатывают подписки на события и проверки заполнения, заложенные в конфигурации. Если запись «не проходит», смотрите текст исключения: чаще всего не заполнен обязательный реквизит или нарушена уникальность. Принудительный обход проверок через ОбменДанными.Загрузка = Истина допустим только в обменах и при полном понимании последствий — так можно записать некорректные данные, которые потом ломают отчёты и проведение документов.
Обращение к справочнику извне: COM, веб-сервисы, HTTP
Из внешних систем к справочникам 1С обращаются через механизмы интеграции. Классический вариант для Windows — COM-соединение (V83.COMConnector): внешний скрипт подключается к базе и использует тот же объектный API, включая Справочники. Это работает только для файловых и клиент-серверных баз на Windows и требует установленной платформы той же версии.
Современный вариант — HTTP-интерфейсы: стандартный OData (публикация на веб-сервере, доступ к справочникам по REST-подобному протоколу) или собственные HTTP-сервисы, разработанные в конфигурации. OData подходит для простого чтения данных, собственные HTTP-сервисы — когда нужна бизнес-логика, контроль прав и нестандартные форматы. Для интеграции между базами 1С традиционно используют планы обмена и EnterpriseData.
Способы доступа к справочнику
Разовый просмотр и ручное редактирование; не подходит для массовых операций
Поиск и изменение отдельных элементов в коде; медленно для больших выборок
Массовая выборка для отчётов и обработок; только чтение данных
Внешние скрипты на Windows; требует платформу и не работает через интернет
Интеграция через сеть; требует публикации и настройки аутентификации
Как проверить, что обращение выполнено правильно
Минимальная проверка программного поиска — убедиться, что ссылка не пустая и относится к нужному типу. Для дальнейшей диагностики полезно вывести уникальный идентификатор: Строка(Ссылка.УникальныйИдентификатор()) — по GUID элемент однозначно находится в базе и в конфигураторе.
Как проверить результат обращения
Пустая() возвращает Ложь, элемент открывается в интерфейсе
Пустая ссылка — элемент не найден, проверьте параметры поиска
Реквизиты заполнены ожидаемыми данными
Пустые значения при заполненной карточке — возможно, обращение к другому элементу-дублю
Количество строк соответствует ожиданию, нет групп и помеченных
Лишние строки — добавьте фильтры ЭтоГруппа и ПометкаУдаления
Открывается в интерфейсе, проходит штатные проверки, используется в документах
Ошибки при проведении документов — вероятно, запись выполнена в обход проверок
Для отладки кода используйте конфигуратор: точка останова, табло (вычисление выражений вида Справочники.Контрагенты.НайтиПоНаименованию("...") прямо в отладчике) и просмотр структуры объекта. Это быстрее, чем вывод сообщений, и позволяет увидеть реальные значения всех реквизитов.
Что важно запомнить
Обращение к справочнику строится вокруг менеджера Справочники.Имя: поиск возвращает ссылку, изменение выполняется через объект, массовые выборки — через запрос. Проверяйте пустые ссылки, фильтруйте группы и пометки удаления, а массовые изменения делайте только после резервной копии и теста на копии базы.
Частые вопросы
Как узнать точное имя справочника для обращения из кода?
Откройте конфигуратор, в дереве конфигурации раскройте ветку «Справочники» — колонка «Имя» содержит программное имя. Альтернатива без конфигуратора: в режиме предприятия открыть справочник и посмотреть техническую информацию об объекте (в типовых конфигурациях доступна через «Ещё» → «Вывести список» или через функциональность для разработчиков, если она включена).
Почему НайтиПоНаименованию не находит элемент, который точно есть?
Частые причины: лишние пробелы в начале или конце наименования, отличия в регистре букв на некоторых СУБД, поиск без второго параметра точного совпадения, а также то, что элемент помечен на удаление или находится в другой папке иерархического справочника. Попробуйте поиск по коду или уникальному реквизиту — это исключает неоднозначность наименований.
Чем ссылка отличается от объекта справочника?
Ссылка — это лёгкий идентификатор элемента: её можно сравнивать, передавать и использовать для чтения реквизитов через точку. Объект — это редактируемая копия данных в памяти, получаемая через ПолучитьОбъект() или СоздатьЭлемент(); только объект можно изменять и записывать. Работа с объектом тяжелее, поэтому для чтения достаточно ссылки или запроса.
Как получить все элементы справочника без запроса?
Методом Выбрать(): Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл ... КонецЦикла;. Способ рабочий, но уступает запросу: обход через Выбрать() читает объекты по одному и медленнее на больших объёмах. Для выгрузок и отчётов предпочтительнее запрос.
Можно ли обратиться к справочнику, которого нет в моей конфигурации?
Нет, обратиться можно только к объектам, описанным в метаданных текущей конфигурации. Если данные хранятся в другой базе 1С, используйте COM-соединение, HTTP-сервисы, OData или механизмы обмена. Попытка обратиться к несуществующему имени вызовет ошибку компиляции или выполнения модуля.
Что делать, если при записи элемента возникает ошибка прав доступа?
Это означает, что у пользователя, под которым выполняется код, нет права «Добавление» или «Изменение» на этот справочник. Варианты: выполнить операцию под пользователем с нужными правами, использовать привилегированный режим (УстановитьПривилегированныйРежим) в серверном коде — но только осознанно, поскольку это отключает проверку прав, либо попросить администратора расширить роль.