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

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

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

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

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

Различие между этими типами принципиально. Справочник хранит относительно постоянную нормативно-справочную информацию: контрагентов, номенклатуру, сотрудников, склады. Документ фиксирует факт хозяйственной операции, имеет дату и номер, может проводиться и формировать движения по регистрам. Ошибка в определении типа приводит к неправильной архитектуре данных: например, если создать «Прайс-лист» документом там, где нужен справочник, получите дублирование данных и невозможность удобного выбора значений.

Ниже разобраны все три подхода с конкретными признаками, примерами кода и типичными ошибками.

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

Самый быстрый способ — открыть форму объекта в режиме «1С:Предприятие» и посмотреть на её элементы. У документа в шапке формы всегда присутствуют поля «Дата» и «Номер», а в командной панели есть кнопки «Провести» и «Провести и закрыть». У элемента справочника этих полей и кнопок нет — вместо них команды «Записать» и «Записать и закрыть».

Второй признак — поведение списка. Журнал документов по умолчанию сортируется по дате, отображает колонки «Дата», «Номер» и часто показывает пометку проведения в виде зелёной галочки. Список справочника сортируется по наименованию или коду, может иметь иерархическую структуру с папками (группами), чего у документов не бывает.

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

Кнопка «Провести»Есть у документа

Справочники не проводятся, только записываются

Поля «Дата» и «Номер»Есть у документа

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

Иерархия с папкамиЕсть у справочника

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

Пометка проведения в спискеЕсть у документа

Значок проведённого документа в журнале

Как определить тип объекта в конфигураторе

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

Быстрый поиск по имени помогает, когда конфигурация большая. Нажмите Ctrl+F в дереве конфигурации или используйте поиск по метаданным (меню «Правка» → «Глобальный поиск по метаданным» в новых версиях платформы). Введите имя объекта — результат покажет, к какой ветке он относится.

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

Программное определение типа через метаданные

В коде на встроенном языке тип объекта определяют через коллекции метаданных. Базовый прием — метод Содержит(), который проверяет, входит ли объект метаданных в конкретную коллекцию:

МетаОбъект = Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура");

Если Метаданные.Справочники.Содержит(МетаОбъект) Тогда

Сообщить("Это справочник");

ИначеЕсли Метаданные.Документы.Содержит(МетаОбъект) Тогда

Сообщить("Это документ");

КонецЕсли;

Если у вас есть ссылка на объект, а не имя, сначала получите объект метаданных методом Метаданные() у ссылки, затем проверяйте принадлежность к коллекциям. Альтернатива — анализ свойства Родитель() объекта метаданных или функция ТипЗнч() с сопоставлением через Тип("СправочникСсылка..."), но проверка через метаданные универсальнее: она работает для любых объектов, включая незнакомые конфигурации.

Для массовой обработки разных типов удобно проверять не конкретные коллекции, а базовый тип ссылки через ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Ссылка)) в типовых конфигурациях на БСП, а затем уже уточнять вид через метаданные.

bsl
Функция ЭтоСправочник(Ссылка)
    Возврат Метаданные.Справочники.Содержит(Ссылка.Метаданные());
КонецФункции

Функция ЭтоДокумент(Ссылка)
    Возврат Метаданные.Документы.Содержит(Ссылка.Метаданные());
КонецФункции

Чем отличаются справочник и документ по сути

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

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

Ключевое следствие: удаление или изменение элемента справочника влияет только на ссылки на него, а перепроведение документа может изменить остатки и отчёты за период. Поэтому работа с документами требует большей осторожности.

Справочник и документ: ключевые различия

Справочник

Хранит постоянные данные, поддерживает иерархию и владельцев, не проводится, не имеет даты. Подходит для НСИ: номенклатура, контрагенты, валюты.

Документ

Фиксирует операцию с датой и номером, проводится и делает движения по регистрам. Подходит для событий учёта: поступления, продажи, начисления.

Когда какой тип выбирать при разработке

Если вы проектируете новый объект и сомневаетесь в типе, задайте себе три вопроса. Первый: объект описывает сущность или событие? «Поставщик» — сущность, «Поступление от поставщика» — событие. Второй: нужна ли история изменений с привязкой ко времени? Если да — это документ или регистр сведений, но не справочник. Третий: должен ли объект влиять на остатки, расчёты, отчёты? Если да — только документ с проведением по регистрам.

Типичная ошибка новичков — создавать документы там, где достаточно справочника. Например, «Адрес доставки» логично хранить как подчинённый справочник контрагента, а не как документ. Обратная ошибка — хранить в справочнике данные, которые меняются во времени и должны видеться в разрезе периодов (цены, курсы): для этого существуют регистры сведений.

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

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

Как выбрать тип объекта

Данные постоянны и редко меняются, нужен выбор в других объектахСоздавайте справочник
Нужно зафиксировать операцию с датой и номеромСоздавайте документ
Объект должен менять остатки или взаиморасчётыДокумент с проведением по регистрам
Данные меняются во времени, но это не операцияРассмотрите регистр сведений вместо справочника

Типичные ошибки и ограничения

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

Вторая ошибка — путать справочник с перечислением. Перечисление имеет фиксированный список значений, заданный в конфигураторе, и пользователь не может добавить новые. Если список значений пополняется пользователями — это справочник.

Третья ошибка — программная проверка типа через строковое имя вместо метаданных. Код вида Если СтрНайти(Тип, "Справочник") ломается при переименовании объектов и работает медленнее. Используйте проверку через коллекции метаданных.

Типичные ошибки
01
Определять тип по названию объекта — имя не гарантирует вид метаданных, проверяйте ветку конфигурации или метаданные
02
Путать справочник с перечислением — у перечисления значения фиксированы в конфигураторе и не редактируются пользователем
03
Проверять тип строковым сравнением в коде — используйте Метаданные.Справочники.Содержит() и аналогичные методы
04
Хранить в справочнике данные с историей изменений — для этого нужны регистры сведений или документы

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

После определения типа убедитесь, что вывод верен. Откройте объект в пользовательском режиме и сверьте признаки: наличие проведения, полей даты и номера, иерархии. Если тип определяли программно, выведите полное имя метаданных через Ссылка.Метаданные().ПолноеИмя() — оно начинается со слова «Справочник.» или «Документ.».

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

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

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

Полное имя метаданных
Норма

Начинается с «Справочник.» или «Документ.» — тип определён верно

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

Возвращает другую ветку (Перечисление, РегистрСведений) — объект не относится к проверяемым типам

Форма объекта в режиме предприятия
Норма

У документа есть «Провести», дата и номер; у справочника — только «Записать»

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

Признаки не совпадают с ожиданием — проверьте, тот ли объект вы открыли

Поведение при записи
Норма

Справочник записывается мгновенно, документ предлагает провести

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

Документ не проводится — возможно, проведение запрещено в свойствах или нет прав

Итог

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

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

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

Можно ли превратить справочник в документ или наоборот?

Штатного механизма преобразования нет: это разные типы метаданных с разной структурой хранения. На практике создают новый объект нужного типа и переносят данные обработкой, а старый объект помечают на удаление после очистки ссылок. Работу выполняют на копии базы.

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

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

Почему у документа нет кнопки «Провести»?

Либо в свойствах документа в конфигураторе проведение запрещено, либо у текущего пользователя нет права на проведение. Проверьте свойство «Проведение» в палитре свойств объекта и роли пользователя.

Как программно получить список всех справочников конфигурации?

Переберите коллекцию Метаданные.Справочники в цикле — у каждого элемента доступны имя, синоним и полное имя. Аналогично работает коллекция Метаданные.Документы. Такой код часто используют в универсальных обработках и отчётах по структуре конфигурации.

Может ли документ не делать движений по регистрам?

Да. Документ может проводиться без движений, если в его свойствах не выбраны регистры или в модуле проведения нет кода формирования движений. Такие документы используют как фиксацию события с датой и номером без влияния на учётные данные.

Как определить тип объекта, если есть только его GUID?

По одному GUID тип не определить — нужно найти ссылку через Справочники.ТипВсеСсылки() и Документы.ТипВсеСсылки() с методом ПолучитьСсылку() и проверкой ПолучитьОбъект() или запросом. В типовых конфигурациях на БСП для этого есть функции работы со ссылками по уникальному идентификатору.