Справочники, документы и регистры: как устроены объекты базы данных 1С 8.3
Содержание
Объекты базы данных 1С — это объекты метаданных конфигурации, под которые платформа создаёт таблицы в базе: справочники, документы, регистры, планы счетов, константы и ещё полтора десятка видов. Разработчик описывает объект в конфигураторе, а платформа сама строит под него таблицы в файловой базе или в SQL. Пользователь видит те же объекты как списки и формы: «Номенклатура», «Реализация товаров и услуг», отчёт по остаткам.
Типичная ситуация: бухгалтер спрашивает, почему остаток на складе «не совпадает со справочником». А в справочнике остатков нет и быть не должно. Остаток живёт в регистре, туда его пишет документ при проведении. Как только понятна эта связка «справочник — документ — регистр», половина вопросов к 1С снимается сама. Всё ниже относится к платформе 8.3 и одинаково для Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и других типовых конфигураций.
Объекты метаданных и объекты базы данных: в чём разница
В конфигураторе дерево Конфигурация содержит десятки веток. Не все они хранят данные.
- 📦 Прикладные объекты с данными — справочники, документы, регистры, константы, планы счетов. Под каждый создаётся одна или несколько таблиц.
- 🖼 Объекты без собственных данных — общие модули, роли, общие формы, макеты, подсистемы, стили. Это код, права и интерфейс. Таблиц под них нет.
- 🔀 Промежуточные — журналы документов, отчёты, обработки. Отчёт и обработка данных не хранят: они читают чужие таблицы или меняют их.
Поэтому «объект базы данных» в узком смысле — тот, у которого есть таблица хранения. Посмотреть соответствие объектов и таблиц можно функцией платформы ПолучитьСтруктуруХраненияБазыДанных(). Она возвращает таблицу значений: в колонке ИмяТаблицы — имя объекта, например Справочник.Номенклатура, в колонке ИмяТаблицыХранения — реальное имя таблицы в СУБД.
Имена таблиц в SQL обезличены: справочник хранится в таблице вида _Reference123, документ — _Document45, регистр накопления — _AccumRg67 плюс отдельная таблица итогов. Цифры у каждой базы свои. Поэтому без этой функции искать «таблицу номенклатуры» в Management Studio бессмысленно.
Пользователь с полными правами увидит все объекты базы без конфигуратора: Главное меню → Все функции. Если команды нет, включите её в Главное меню → Сервис → Параметры флажком «Отображать команду “Все функции”».
Виды объектов базы данных 1С и их назначение
Главное деление — на ссылочные и нессылочные объекты. От него зависит, как объект хранится, как на него ссылаются и как его удалять.
Ссылочные — у каждой записи есть уникальный идентификатор (ссылка). На запись можно сослаться из реквизита другого объекта.
Нессылочные — записи идентифицируются набором значений полей (измерения, период, регистратор). Сослаться на отдельную запись регистра нельзя.
| Вид объекта | Тип | Что хранит | Пример в типовой |
|---|---|---|---|
| Справочник | ссылочный | условно-постоянные списки | Номенклатура, Контрагенты |
| Документ | ссылочный | факты хозяйственных операций | Поступление товаров и услуг |
| Перечисление | ссылочный | фиксированный набор значений, задаётся в конфигураторе | Виды операций, Пол |
| План видов характеристик | ссылочный | виды аналитики и их типы | Виды субконто |
| План счетов | ссылочный | счета и их признаки | Хозрасчётный |
| План видов расчёта | ссылочный | начисления и удержания | Начисления в ЗУП |
| План обмена | ссылочный | узлы обмена и изменения для них | обмен БП и УТ |
| Бизнес-процесс, задача | ссылочный | маршруты и задачи пользователей | согласование документов |
| Константа | нессылочный | одно значение на всю базу | Основная валюта |
| Регистр сведений | нессылочный | данные с измерениями, часто во времени | Курсы валют, цены |
| Регистр накопления | нессылочный | движения и остатки/обороты | остатки товаров |
| Регистр бухгалтерии | нессылочный | проводки по плану счетов | Журнал проводок |
| Регистр расчёта | нессылочный | записи расчёта зарплаты | Начисления |
В работе 90% вопросов крутятся вокруг трёх видов: справочников, документов и регистров. С них и начнём.
Справочники: где 1С хранит списки и карточки
Справочник — это список однотипных элементов, которые редко меняются: товары, контрагенты, сотрудники, склады. У каждого справочника есть стандартные реквизиты, которые платформа добавляет сама:
Код— строка или число, может назначаться автоматически;Наименование— строка, по ней обычно ищут;ПометкаУдаления— признак к удалению;Родитель— если включена иерархия;Владелец— если справочник подчинённый;Предопределённый— элемент, заданный в конфигураторе.
Разработчик добавляет свои реквизиты и табличные части. Табличная часть — это вложенная таблица внутри элемента: например, список контактных лиц прямо в карточке контрагента. В базе она лежит в отдельной таблице, связанной с основной по ссылке.
Иерархия и подчинение
Иерархия бывает двух видов:
- Иерархия групп и элементов — папки и элементы в них, как в «Номенклатуре».
- Иерархия элементов — любой элемент может быть родителем другого, например подразделения.
Подчинение — другая вещь. Справочник «Договоры контрагентов» подчинён «Контрагентам»: договор не существует без владельца. Если пометить контрагента на удаление, платформа пометит и его договоры.
Предопределённые элементы
Это элементы, которые конфигурация ожидает увидеть в базе всегда. Код обращается к ним по имени: Справочники.ИмяСправочника.ИмяПредопределённого. Удалить такой элемент из пользовательского режима нельзя. Если же он пропал после неудачного обмена или загрузки, начинаются ошибки вида «не найден предопределённый элемент».
Документы: как в базе фиксируются операции
Документ отражает событие: поступил товар, выдали зарплату, приняли сотрудника. Стандартные реквизиты документа — Номер, Дата, Проведен, ПометкаУдаления. Остальное — реквизиты шапки и табличные части, как у справочника.
Ключевое свойство документа — проведение. Сам по себе документ в отчёты не попадает. При проведении он формирует движения в регистрах: проводки, остатки, обороты. Документ, по которому записаны движения, называется регистратором этих записей.
Что происходит при проведении:
- Платформа записывает документ и ставит
Проведен = Истина. - Выполняется процедура
ОбработкаПроведениямодуля объекта. - Старые движения документа удаляются, новые записываются в регистры.
- При ошибке (например, не хватает остатка) параметр
Отказпрерывает проведение, транзакция откатывается целиком.
Отмена проведения удаляет все движения документа, но сам документ остаётся. Поэтому документ без проведения в отчётах и оборотке не виден — это частая причина «пропавших» сумм.
Нумерация
Номер документа уникален в пределах периода, который задан в конфигураторе: год, квартал, месяц, день или без периода. В типовых БП и ЗУП номера уникальны в пределах года, а в начало номера добавляется префикс организации и информационной базы.
Регистры: таблицы, из которых строятся отчёты
Регистр хранит данные в форме, удобной для анализа. У любого регистра есть измерения (в разрезе чего), ресурсы (что считаем, обычно числа) и реквизиты (дополнительная информация).
Регистр сведений
Хранит значения по набору измерений. Бывает непериодическим или периодическим — тогда у записи есть дата, и можно получить значение на любой момент. Курс валюты на 15 марта — классический пример.
Режим записи — независимый (записи вводят вручную или кодом) или подчинённый регистратору (записи создаёт документ). Для чтения периодического регистра есть виртуальные таблицы СрезПоследних и СрезПервых.
Регистр накопления
Хранит движения прихода и расхода. Вид регистра задаётся в конфигураторе:
- Остатки — для того, что накапливается: товары на складе, долги, деньги. Платформа ведёт таблицу итогов и быстро считает остаток на дату.
- Обороты — для того, что только суммируется за период: продажи, выручка. Остатка у таких показателей нет.
Читают регистр через виртуальные таблицы Остатки, Обороты, ОстаткиИОбороты. Записи в регистр накопления всегда делает документ-регистратор.
Регистр бухгалтерии и регистр расчёта
Регистр бухгалтерии
связан с планом счетов: каждая запись — проводка с дебетом, кредитом и субконто. В БП это регистр «Хозрасчётный», который видно как Журнал проводок. Оборотно-сальдовая ведомость строится из него.
Регистр расчёта связан с планом видов расчёта и умеет пересчитывать записи с учётом периода действия и базы. На нём построен расчёт зарплаты в ЗУП.
В рабочей базе не правьте записи регистров руками в обход документов, даже если это разрешает режим Все функции. При следующем перепроведении документ перезапишет движения, а ручные записи без регистратора повиснут в остатках.
Как объекты базы данных 1С связаны между собой
Связи строятся через ссылки. Реквизит документа «Контрагент» имеет тип СправочникСсылка.Контрагенты и хранит идентификатор элемента. Сам справочник при этом не копируется.
Цепочка на примере продажи в УТ 11 или БП 3.0:
- Справочники задают «кто и что»: номенклатура, контрагент, склад, договор.
- Документ «Реализация товаров и услуг» ссылается на них в шапке и табличной части.
- При проведении документ пишет движения в регистры: уменьшает остаток товара, увеличивает долг покупателя, формирует проводки.
- Отчёты читают регистры, а не документы.
Отсюда простое правило диагностики. Отчёт показывает не то → смотрите движения документа (кнопка Дт/Кт в БП или команда отчёта о движениях в форме документа). Движений нет → документ не проведён или проведён с другими реквизитами.
Ссылочная целостность тоже следует из этих связей. Когда вы удаляете помеченные объекты обработкой удаления помеченных объектов из раздела Администрирование → Обслуживание, платформа проверяет, ссылается ли кто-то на объект. Если ссылки есть, объект не удалится, и обработка покажет, где он используется.
Примеры работы с объектами базы данных во встроенном языке
К каждому виду объекта платформа даёт менеджер: Справочники.Номенклатура, Документы.ПоступлениеТоваров, РегистрыСведений.КурсыВалют. Через менеджер ищут, создают и получают объекты. Ниже названия объектов условные — подставьте свои.
Создать и найти элемент справочника
НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Бумага А4";
НовыйЭлемент.Записать();
Ссылка = Справочники.Номенклатура.НайтиПоНаименованию("Бумага А4");
Если НЕ Ссылка.Пустая() Тогда
Объект = Ссылка.ПолучитьОбъект();
Объект.Наименование = "Бумага А4, 500 л.";
Объект.Записать();
КонецЕсли;
Ссылка — только указатель, её поля можно читать, но не менять. Чтобы изменить элемент, нужен объект: ПолучитьОбъект(), правка, Записать().
Записать движения при проведении
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ТоварыНаСкладах.Записывать = Истина;
Для Каждого Строка Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Склад = Склад;
Движение.Номенклатура = Строка.Номенклатура;
Движение.Количество = Строка.Количество;
КонецЦикла;
КонецПроцедуры
Регистратор платформа подставит сама. После выполнения процедуры набор движений записывается вместе с документом в одной транзакции.
Получить остатки запросом
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.КоличествоОстаток КАК Количество
|ИЗ
| РегистрНакопления.ТоварыНаСкладах.Остатки(&НаДату, Склад = &Склад) КАК Остатки";
Запрос.УстановитьПараметр("НаДату", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Склад", Склад);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Номенклатура) + ": " + Формат(Выборка.Количество, "ЧГ=0"));
КонецЦикла;
Условие по складу стоит в параметрах виртуальной таблицы, а не в ГДЕ. Так платформа отбирает данные до расчёта остатков, и запрос работает в разы быстрее на большой базе.
Ошибки при работе с объектами базы данных
Здесь — то, на чём спотыкаются и пользователи, и начинающие разработчики.
- ❌ Хранить остаток в реквизите справочника. Поле «Остаток» в карточке товара рассинхронизируется после первого же перепроведения задним числом. Остатки — только в регистре накопления.
- ❌ Обращаться к реквизитам «через точку» в цикле.
Строка.Номенклатура.Артикулвнутри цикла на 10 000 строк — это 10 000 скрытых запросов к базе. Нужные поля получайте одним запросом заранее. - ❌ Вызывать
ПолучитьОбъект()только чтобы прочитать поле. Объект читается целиком со всеми табличными частями. Для чтения хватит ссылки или запроса. - ❌ Удалять объекты непосредственно. Метод
Удалить()у объекта не проверяет ссылки, и в документах останутся «битые» ссылки вида<Объект не найден>. В рабочей базе используйте пометку удаления и штатную обработку удаления помеченных. - ❌ Менять типовой объект в основной конфигурации. Добавили реквизит в типовой справочник — сняли объект с поддержки, и каждое обновление превращается в ручное сравнение. Новые реквизиты и обработчики добавляйте через расширение конфигурации .
- ❌ Путать перечисление и справочник. Значения перечисления пользователь не добавит: их задают только в конфигураторе. Если список должен пополняться в работе — это справочник.
Частые вопросы
Сколько объектов базы данных в типовой Бухгалтерии 3.0?
ПолучитьСтруктуруХраненияБазыДанных() или в дереве конфигуратора.