Разработка и Конфигурация · 12 мин
Как определить в 1С: справочник или документ
Как определить в 1С, является ли объект справочником или документом: визуальные признаки в интерфейсе, анализ в конфигураторе и программная проверка через метаданные.
Определить, чем является объект в 1С — справочником или документом, — можно тремя способами: по внешним признакам в пользовательском интерфейсе, по дереву конфигурации в конфигураторе и программно через объект метаданных. Каждый способ подходит для своей ситуации: пользователю достаточно интерфейса, разработчику удобнее конфигуратор, а в коде проверку выполняют встроенные функции платформы.
Различие между этими типами принципиально. Справочник хранит относительно постоянную нормативно-справочную информацию: контрагентов, номенклатуру, сотрудников, склады. Документ фиксирует факт хозяйственной операции, имеет дату и номер, может проводиться и формировать движения по регистрам. Ошибка в определении типа приводит к неправильной архитектуре данных: например, если создать «Прайс-лист» документом там, где нужен справочник, получите дублирование данных и невозможность удобного выбора значений.
Ниже разобраны все три подхода с конкретными признаками, примерами кода и типичными ошибками.
Как отличить справочник от документа в пользовательском интерфейсе
Самый быстрый способ — открыть форму объекта в режиме «1С:Предприятие» и посмотреть на её элементы. У документа в шапке формы всегда присутствуют поля «Дата» и «Номер», а в командной панели есть кнопки «Провести» и «Провести и закрыть». У элемента справочника этих полей и кнопок нет — вместо них команды «Записать» и «Записать и закрыть».
Второй признак — поведение списка. Журнал документов по умолчанию сортируется по дате, отображает колонки «Дата», «Номер» и часто показывает пометку проведения в виде зелёной галочки. Список справочника сортируется по наименованию или коду, может иметь иерархическую структуру с папками (группами), чего у документов не бывает.
Третий признак — расположение в меню. В типовых конфигурациях справочники обычно собраны в разделах «НСИ», «Номенклатура», «Контрагенты», а документы — в операционных разделах: «Продажи», «Закупки», «Склад», «Зарплата». Это не строгое правило, но полезная подсказка.
Справочники не проводятся, только записываются
Документ всегда привязан к моменту времени
Документы не поддерживают иерархические группы
Значок проведённого документа в журнале
Как определить тип объекта в конфигураторе
Если есть доступ к конфигуратору, откройте дерево конфигурации (меню «Конфигурация» → «Открыть конфигурацию»). Все объекты метаданных сгруппированы по веткам: «Справочники», «Документы», «Перечисления», «Регистры» и так далее. Раскройте нужную ветку — если объект находится под узлом «Справочники», это справочник, если под «Документы» — документ.
Быстрый поиск по имени помогает, когда конфигурация большая. Нажмите Ctrl+F в дереве конфигурации или используйте поиск по метаданным (меню «Правка» → «Глобальный поиск по метаданным» в новых версиях платформы). Введите имя объекта — результат покажет, к какой ветке он относится.
Дополнительно полезно посмотреть свойства объекта. У документа в палитре свойств есть настройки «Проведение» (разрешить/запретить), «Нумератор», «Периодичность номера», «Движения» — список регистров, по которым документ делает записи. У справочника вместо этого — «Вид иерархии», «Владельцы», «Длина наименования». Эти свойства сразу показывают природу объекта.
Программное определение типа через метаданные
В коде на встроенном языке тип объекта определяют через коллекции метаданных. Базовый прием — метод Содержит(), который проверяет, входит ли объект метаданных в конкретную коллекцию:
МетаОбъект = Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура");
Если Метаданные.Справочники.Содержит(МетаОбъект) Тогда
Сообщить("Это справочник");
ИначеЕсли Метаданные.Документы.Содержит(МетаОбъект) Тогда
Сообщить("Это документ");
КонецЕсли;
Если у вас есть ссылка на объект, а не имя, сначала получите объект метаданных методом Метаданные() у ссылки, затем проверяйте принадлежность к коллекциям. Альтернатива — анализ свойства Родитель() объекта метаданных или функция ТипЗнч() с сопоставлением через Тип("СправочникСсылка..."), но проверка через метаданные универсальнее: она работает для любых объектов, включая незнакомые конфигурации.
Для массовой обработки разных типов удобно проверять не конкретные коллекции, а базовый тип ссылки через ОбщегоНазначения.ЭтоСсылка(ТипЗнч(Ссылка)) в типовых конфигурациях на БСП, а затем уже уточнять вид через метаданные.
Функция ЭтоСправочник(Ссылка)
Возврат Метаданные.Справочники.Содержит(Ссылка.Метаданные());
КонецФункции
Функция ЭтоДокумент(Ссылка)
Возврат Метаданные.Документы.Содержит(Ссылка.Метаданные());
КонецФункцииЧем отличаются справочник и документ по сути
Понимание различий помогает не только определять тип, но и правильно проектировать новые объекты. Справочник описывает сущность предметной области — то, «кто» или «что»: товар, клиент, договор, склад. Его данные меняются редко, и история изменений обычно не хранится (исключение — периодические реквизиты в старых конфигурациях на платформе 7.7).
Документ описывает событие — то, «что произошло и когда»: поступление товара, начисление зарплаты, перемещение между складами. Документ уникален по номеру в пределах периодичности нумерации, имеет жёсткую привязку ко времени и через проведение изменяет состояние учёта — остатки, взаиморасчёты, себестоимость.
Ключевое следствие: удаление или изменение элемента справочника влияет только на ссылки на него, а перепроведение документа может изменить остатки и отчёты за период. Поэтому работа с документами требует большей осторожности.
Справочник и документ: ключевые различия
Хранит постоянные данные, поддерживает иерархию и владельцев, не проводится, не имеет даты. Подходит для НСИ: номенклатура, контрагенты, валюты.
Фиксирует операцию с датой и номером, проводится и делает движения по регистрам. Подходит для событий учёта: поступления, продажи, начисления.
Когда какой тип выбирать при разработке
Если вы проектируете новый объект и сомневаетесь в типе, задайте себе три вопроса. Первый: объект описывает сущность или событие? «Поставщик» — сущность, «Поступление от поставщика» — событие. Второй: нужна ли история изменений с привязкой ко времени? Если да — это документ или регистр сведений, но не справочник. Третий: должен ли объект влиять на остатки, расчёты, отчёты? Если да — только документ с проведением по регистрам.
Типичная ошибка новичков — создавать документы там, где достаточно справочника. Например, «Адрес доставки» логично хранить как подчинённый справочник контрагента, а не как документ. Обратная ошибка — хранить в справочнике данные, которые меняются во времени и должны видеться в разрезе периодов (цены, курсы): для этого существуют регистры сведений.
Граничный случай — объекты, которые выглядят как события, но не влияют на учёт, например «Заявка клиента» до её согласования. Такие объекты всё равно обычно делают документами с запрещённым проведением или проведением без движений, потому что им нужны дата, номер и жизненный цикл.
Как выбрать тип объекта
Типичные ошибки и ограничения
Первая частая ошибка — попытка определить тип объекта по названию. «Акт», «Счёт», «Ведомость» звучат как документы, но в конкретной конфигурации могут быть реализованы справочниками, и наоборот. Всегда проверяйте фактическую ветку метаданных или признаки в форме.
Вторая ошибка — путать справочник с перечислением. Перечисление имеет фиксированный список значений, заданный в конфигураторе, и пользователь не может добавить новые. Если список значений пополняется пользователями — это справочник.
Третья ошибка — программная проверка типа через строковое имя вместо метаданных. Код вида Если СтрНайти(Тип, "Справочник") ломается при переименовании объектов и работает медленнее. Используйте проверку через коллекции метаданных.
Как проверить результат
После определения типа убедитесь, что вывод верен. Откройте объект в пользовательском режиме и сверьте признаки: наличие проведения, полей даты и номера, иерархии. Если тип определяли программно, выведите полное имя метаданных через Ссылка.Метаданные().ПолноеИмя() — оно начинается со слова «Справочник.» или «Документ.».
Для новых объектов, которые вы создали сами, проверьте поведение: справочник должен записываться без проведения и быть доступен для выбора в реквизитах других объектов, документ — проводиться и формировать движения, если они настроены.
Как проверить результат
Начинается с «Справочник.» или «Документ.» — тип определён верно
Возвращает другую ветку (Перечисление, РегистрСведений) — объект не относится к проверяемым типам
У документа есть «Провести», дата и номер; у справочника — только «Записать»
Признаки не совпадают с ожиданием — проверьте, тот ли объект вы открыли
Справочник записывается мгновенно, документ предлагает провести
Документ не проводится — возможно, проведение запрещено в свойствах или нет прав
Что важно запомнить
Справочник хранит постоянные данные и не проводится, документ фиксирует операцию с датой, номером и движениями по регистрам. Определить тип можно по форме объекта, по ветке дерева конфигурации или программно через коллекции метаданных. При проектировании выбирайте тип по природе данных: сущность — справочник, событие — документ.
Частые вопросы
Можно ли превратить справочник в документ или наоборот?
Штатного механизма преобразования нет: это разные типы метаданных с разной структурой хранения. На практике создают новый объект нужного типа и переносят данные обработкой, а старый объект помечают на удаление после очистки ссылок. Работу выполняют на копии базы.
Чем справочник отличается от перечисления?
Перечисление имеет фиксированный набор значений, заданный разработчиком в конфигураторе, — пользователь не может добавить новое. Справочник пополняется пользователями в режиме предприятия, поддерживает иерархию, владельцев и произвольные реквизиты.
Почему у документа нет кнопки «Провести»?
Либо в свойствах документа в конфигураторе проведение запрещено, либо у текущего пользователя нет права на проведение. Проверьте свойство «Проведение» в палитре свойств объекта и роли пользователя.
Как программно получить список всех справочников конфигурации?
Переберите коллекцию Метаданные.Справочники в цикле — у каждого элемента доступны имя, синоним и полное имя. Аналогично работает коллекция Метаданные.Документы. Такой код часто используют в универсальных обработках и отчётах по структуре конфигурации.
Может ли документ не делать движений по регистрам?
Да. Документ может проводиться без движений, если в его свойствах не выбраны регистры или в модуле проведения нет кода формирования движений. Такие документы используют как фиксацию события с датой и номером без влияния на учётные данные.
Как определить тип объекта, если есть только его GUID?
По одному GUID тип не определить — нужно найти ссылку через Справочники.ТипВсеСсылки() и Документы.ТипВсеСсылки() с методом ПолучитьСсылку() и проверкой ПолучитьОбъект() или запросом. В типовых конфигурациях на БСП для этого есть функции работы со ссылками по уникальному идентификатору.