Справочники, документы и регистры: как устроены объекты базы данных 1С 8.3

· 10 мин

Содержание

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

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

Объекты метаданных и объекты базы данных: в чём разница

В конфигураторе дерево Конфигурация содержит десятки веток. Не все они хранят данные.

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

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

Имена таблиц в SQL обезличены: справочник хранится в таблице вида _Reference123, документ — _Document45, регистр накопления — _AccumRg67 плюс отдельная таблица итогов. Цифры у каждой базы свои. Поэтому без этой функции искать «таблицу номенклатуры» в Management Studio бессмысленно.

Пользователь с полными правами увидит все объекты базы без конфигуратора: Главное меню → Все функции. Если команды нет, включите её в Главное меню → Сервис → Параметры флажком «Отображать команду “Все функции”».

Виды объектов базы данных 1С и их назначение

Главное деление — на ссылочные и нессылочные объекты. От него зависит, как объект хранится, как на него ссылаются и как его удалять.

Ссылочные — у каждой записи есть уникальный идентификатор (ссылка). На запись можно сослаться из реквизита другого объекта.

Нессылочные — записи идентифицируются набором значений полей (измерения, период, регистратор). Сослаться на отдельную запись регистра нельзя.

Вид объектаТипЧто хранитПример в типовой
Справочникссылочныйусловно-постоянные спискиНоменклатура, Контрагенты
Документссылочныйфакты хозяйственных операцийПоступление товаров и услуг
Перечислениессылочныйфиксированный набор значений, задаётся в конфигуратореВиды операций, Пол
План видов характеристикссылочныйвиды аналитики и их типыВиды субконто
План счетовссылочныйсчета и их признакиХозрасчётный
План видов расчётассылочныйначисления и удержанияНачисления в ЗУП
План обменассылочныйузлы обмена и изменения для нихобмен БП и УТ
Бизнес-процесс, задачассылочныймаршруты и задачи пользователейсогласование документов
Константанессылочныйодно значение на всю базуОсновная валюта
Регистр сведенийнессылочныйданные с измерениями, часто во времениКурсы валют, цены
Регистр накоплениянессылочныйдвижения и остатки/оборотыостатки товаров
Регистр бухгалтериинессылочныйпроводки по плану счетовЖурнал проводок
Регистр расчётанессылочныйзаписи расчёта зарплатыНачисления

В работе 90% вопросов крутятся вокруг трёх видов: справочников, документов и регистров. С них и начнём.

Справочники: где 1С хранит списки и карточки

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

  • Код — строка или число, может назначаться автоматически;
  • Наименование — строка, по ней обычно ищут;
  • ПометкаУдаления — признак к удалению;
  • Родитель — если включена иерархия;
  • Владелец — если справочник подчинённый;
  • Предопределённый — элемент, заданный в конфигураторе.

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

Иерархия и подчинение

Иерархия бывает двух видов:

  1. Иерархия групп и элементов — папки и элементы в них, как в «Номенклатуре».
  2. Иерархия элементов — любой элемент может быть родителем другого, например подразделения.

Подчинение — другая вещь. Справочник «Договоры контрагентов» подчинён «Контрагентам»: договор не существует без владельца. Если пометить контрагента на удаление, платформа пометит и его договоры.

Предопределённые элементы

Это элементы, которые конфигурация ожидает увидеть в базе всегда. Код обращается к ним по имени: Справочники.ИмяСправочника.ИмяПредопределённого. Удалить такой элемент из пользовательского режима нельзя. Если же он пропал после неудачного обмена или загрузки, начинаются ошибки вида «не найден предопределённый элемент».

Документы: как в базе фиксируются операции

Документ отражает событие: поступил товар, выдали зарплату, приняли сотрудника. Стандартные реквизиты документа — Номер, Дата, Проведен, ПометкаУдаления. Остальное — реквизиты шапки и табличные части, как у справочника.

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

Что происходит при проведении:

  1. Платформа записывает документ и ставит Проведен = Истина.
  2. Выполняется процедура ОбработкаПроведения модуля объекта.
  3. Старые движения документа удаляются, новые записываются в регистры.
  4. При ошибке (например, не хватает остатка) параметр Отказ прерывает проведение, транзакция откатывается целиком.

Отмена проведения удаляет все движения документа, но сам документ остаётся. Поэтому документ без проведения в отчётах и оборотке не виден — это частая причина «пропавших» сумм.

Нумерация

Номер документа уникален в пределах периода, который задан в конфигураторе: год, квартал, месяц, день или без периода. В типовых БП и ЗУП номера уникальны в пределах года, а в начало номера добавляется префикс организации и информационной базы.

Регистры: таблицы, из которых строятся отчёты

Регистр хранит данные в форме, удобной для анализа. У любого регистра есть измерения (в разрезе чего), ресурсы (что считаем, обычно числа) и реквизиты (дополнительная информация).

Регистр сведений

Хранит значения по набору измерений. Бывает непериодическим или периодическим — тогда у записи есть дата, и можно получить значение на любой момент. Курс валюты на 15 марта — классический пример.

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

Регистр накопления

Хранит движения прихода и расхода. Вид регистра задаётся в конфигураторе:

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

Читают регистр через виртуальные таблицы Остатки, Обороты, ОстаткиИОбороты. Записи в регистр накопления всегда делает документ-регистратор.

Регистр бухгалтерии и регистр расчёта

Регистр бухгалтерии связан с планом счетов: каждая запись — проводка с дебетом, кредитом и субконто. В БП это регистр «Хозрасчётный», который видно как Журнал проводок. Оборотно-сальдовая ведомость строится из него.

Регистр расчёта связан с планом видов расчёта и умеет пересчитывать записи с учётом периода действия и базы. На нём построен расчёт зарплаты в ЗУП.

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

Как объекты базы данных 1С связаны между собой

Связи строятся через ссылки. Реквизит документа «Контрагент» имеет тип СправочникСсылка.Контрагенты и хранит идентификатор элемента. Сам справочник при этом не копируется.

Цепочка на примере продажи в УТ 11 или БП 3.0:

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

Отсюда простое правило диагностики. Отчёт показывает не то → смотрите движения документа (кнопка Дт/Кт в БП или команда отчёта о движениях в форме документа). Движений нет → документ не проведён или проведён с другими реквизитами.

Ссылочная целостность тоже следует из этих связей. Когда вы удаляете помеченные объекты обработкой удаления помеченных объектов из раздела Администрирование → Обслуживание, платформа проверяет, ссылается ли кто-то на объект. Если ссылки есть, объект не удалится, и обработка покажет, где он используется.

Какой объект нужен для ваших данных?

Примеры работы с объектами базы данных во встроенном языке

К каждому виду объекта платформа даёт менеджер: Справочники.Номенклатура, Документы.ПоступлениеТоваров, РегистрыСведений.КурсыВалют. Через менеджер ищут, создают и получают объекты. Ниже названия объектов условные — подставьте свои.

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

НовыйЭлемент = Справочники.Номенклатура.СоздатьЭлемент();
НовыйЭлемент.Наименование = "Бумага А4";
НовыйЭлемент.Записать();

Ссылка = Справочники.Номенклатура.НайтиПоНаименованию("Бумага А4");
Если НЕ Ссылка.Пустая() Тогда
	Объект = Ссылка.ПолучитьОбъект();
	Объект.Наименование = "Бумага А4, 500 л.";
	Объект.Записать();
КонецЕсли;

Ссылка — только указатель, её поля можно читать, но не менять. Чтобы изменить элемент, нужен объект: ПолучитьОбъект(), правка, Записать().

Записать движения при проведении

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
	Движения.ТоварыНаСкладах.Записывать = Истина;
	Для Каждого Строка Из Товары Цикл
		Движение = Движения.ТоварыНаСкладах.Добавить();
		Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
		Движение.Период = Дата;
		Движение.Склад = Склад;
		Движение.Номенклатура = Строка.Номенклатура;
		Движение.Количество = Строка.Количество;
	КонецЦикла;
КонецПроцедуры

Регистратор платформа подставит сама. После выполнения процедуры набор движений записывается вместе с документом в одной транзакции.

Получить остатки запросом

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Остатки.Номенклатура КАК Номенклатура,
|	Остатки.КоличествоОстаток КАК Количество
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки(&НаДату, Склад = &Склад) КАК Остатки";
Запрос.УстановитьПараметр("НаДату", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Склад", Склад);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(Строка(Выборка.Номенклатура) + ": " + Формат(Выборка.Количество, "ЧГ=0"));
КонецЦикла;

Условие по складу стоит в параметрах виртуальной таблицы, а не в ГДЕ. Так платформа отбирает данные до расчёта остатков, и запрос работает в разы быстрее на большой базе.

Ошибки при работе с объектами базы данных

Здесь — то, на чём спотыкаются и пользователи, и начинающие разработчики.

  • ❌ Хранить остаток в реквизите справочника. Поле «Остаток» в карточке товара рассинхронизируется после первого же перепроведения задним числом. Остатки — только в регистре накопления.
  • ❌ Обращаться к реквизитам «через точку» в цикле. Строка.Номенклатура.Артикул внутри цикла на 10 000 строк — это 10 000 скрытых запросов к базе. Нужные поля получайте одним запросом заранее.
  • ❌ Вызывать ПолучитьОбъект() только чтобы прочитать поле. Объект читается целиком со всеми табличными частями. Для чтения хватит ссылки или запроса.
  • ❌ Удалять объекты непосредственно. Метод Удалить() у объекта не проверяет ссылки, и в документах останутся «битые» ссылки вида <Объект не найден>. В рабочей базе используйте пометку удаления и штатную обработку удаления помеченных.
  • ❌ Менять типовой объект в основной конфигурации. Добавили реквизит в типовой справочник — сняли объект с поддержки, и каждое обновление превращается в ручное сравнение. Новые реквизиты и обработчики добавляйте через расширение конфигурации .
  • ❌ Путать перечисление и справочник. Значения перечисления пользователь не добавит: их задают только в конфигураторе. Если список должен пополняться в работе — это справочник.

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

Сколько объектов базы данных в типовой Бухгалтерии 3.0?
Сотни объектов с данными, и число меняется от релиза к релизу. Посчитать можно функцией ПолучитьСтруктуруХраненияБазыДанных() или в дереве конфигуратора.
Можно ли читать таблицы 1С напрямую из SQL?
Технически да, но имена таблиц обезличены, а прямая запись в обход платформы ломает итоги и блокировки. Для чтения используйте запросы 1С, OData или выгрузку; запись — только средствами 1С.
Чем журнал документов отличается от документа?
Журнал документов — общий список нескольких видов документов, например все кассовые документы в одной форме. Новых данных он не создаёт, это способ показать документы вместе.
Что такое табличная часть и где она хранится?
Это вложенная таблица внутри справочника или документа, например список товаров в накладной. В СУБД у каждой табличной части своя таблица, связанная с владельцем по ссылке.
Почему документ проведён, а в отчёте его нет?
Чаще всего отчёт строится по другому регистру или с отбором по организации, складу, периоду. Откройте движения документа и проверьте, в какие регистры он писал и с какими значениями измерений.