Разработка и Конфигурация · 14 мин
Почему в 1С следует использовать регистры, хотя информация есть в других объектах
Почему в 1С следует хранить данные в регистрах, а не извлекать их из документов и справочников: скорость отчётов, итоги, корректность учёта и типичные ошибки.
У начинающих разработчиков 1С регулярно возникает вопрос: зачем создавать регистр накопления или сведений, если вся нужная информация уже есть в табличных частях документов или в реквизитах справочников? Кажется, что регистр дублирует данные и лишь усложняет конфигурацию. На практике всё наоборот: регистр — это не дубль, а специально организованное хранилище, оптимизированное для чтения итогов, аналитики и контроля.
Попытка строить учёт «напрямую» из документов приводит к трём типовым проблемам: медленные отчёты, невозможность быстро получить остаток или оборот за период и ошибки при параллельной работе пользователей. Регистры решают эти задачи штатными средствами платформы: виртуальными таблицами остатков и оборотов, итогами, механизмом блокировок.
Ниже разобрано, чем регистры отличаются от документов и справочников, когда их применение обязательно, как правильно спроектировать структуру регистра и какие ошибки чаще всего совершают при отказе от регистров.
Чем регистр отличается от документа и справочника
Документ в 1С — это факт хозяйственной жизни: кто, когда, что и с кем сделал. Он хранит шапку и табличные части в том виде, в каком их ввёл пользователь. Справочник — нормативно-справочная информация: номенклатура, контрагенты, склады. Оба объекта отвечают на вопрос «что произошло» или «что существует», но не отвечают на вопрос «сколько осталось» или «какой оборот за месяц».
Регистр — это таблица, приспособленная для накопления и быстрой выборки итогов. Регистр накопления с видом «Остатки» хранит приход и расход, а платформа автоматически поддерживает таблицу итогов, из которой остаток на любую дату получается одним запросом к виртуальной таблице Остатки. Регистр сведений хранит значения в разрезе измерений и, при необходимости, периода — например, цены номенклатуры или курсы валют.
Ключевое отличие в том, что регистр проектируется под аналитику: измерения определяют, в каких разрезах нужны итоги (склад, номенклатура, организация), а ресурсы — что именно считаем (количество, сумма). Документ такой структуры не даёт: чтобы получить остаток по складу из документов, придётся перебрать все приходные и расходные накладные за весь период ведения учёта.
Почему запросы к документам проигрывают запросам к регистрам
Главная причина использования регистров — производительность чтения. Когда отчёт обращается к виртуальной таблице Остатки или Обороты, платформа читает заранее рассчитанные итоги. Когда тот же отчёт обращается к документам, он вынужден соединять шапки с табличными частями, фильтровать по проведённости и периоду и суммировать строки — объём обрабатываемых данных больше на порядки.
Разница особенно заметна на больших базах. Отчёт по остаткам склада, построенный по регистру, открывается за секунды независимо от того, сколько документов проведено за годы работы. Аналогичный отчёт по табличным частям документов будет замедляться с каждым месяцем и в конце концов станет непригодным для интерактивной работы.
Есть и вторая сторона: корректность. Документ может быть отменён, перепроведён задним числом, помечен на удаление. Логика «собери итог из документов» обязана учитывать все эти состояния, и любая ошибка в условиях запроса даёт расхождения в учёте. Регистр решает это штатно: движения существуют только у проведённых документов, а при отмене проведения удаляются платформой.
Откуда брать данные для отчёта
Подходит для остатков, оборотов, аналитики за период. Быстро, корректно на любую дату. Ограничение: только те разрезы, что заложены в измерения.
Подходит, когда нужны детали конкретных документов: цены в строке, комментарии, состав. Для итогов и остатков — медленно и рискованно.
Подходит для постоянных свойств объекта. Не подходит для изменяющихся во времени данных вроде цен и остатков.
В каких задачах регистр обязателен
Есть класс задач, где отказ от регистра фактически означает неработоспособное решение. Это любой учёт, где нужен моментальный ответ на вопрос «сколько сейчас» или «сколько было на дату».
Складские остатки и резервы
Остаток товара на складе — классический пример. Проверка «хватает ли товара для отгрузки» выполняется при каждом проведении расходной накладной и должна занимать доли секунды. Только регистр накопления с видом «Остатки» даёт такую скорость плюс штатный контроль отрицательных остатков. Для резервирования добавляется отдельный регистр или дополнительное измерение — попытка хранить резерв в реквизите номенклатуры сломается при первой же параллельной отгрузке двумя менеджерами.
Взаиморасчёты и финансы
Долг контрагента, задолженность перед поставщиком, остатки денег на счетах — всё это регистры накопления. Здесь критична не только скорость, но и получение остатка на произвольную дату в прошлом: акт сверки на конец квартала невозможно корректно построить перебором документов, если часть из них потом перепроводилась.
Периодические сведения
Цены, курсы валют, ставки налогов, графики работы — данные, которые меняются во времени и должны читаться «на дату». Периодический регистр сведений с виртуальными таблицами СрезПоследних и СрезПервых решает задачу одним запросом. Хранение цены в реквизите справочника теряет историю: невозможно узнать, по какой цене продавали товар месяц назад.
Данные для расчёта зарплаты и учёта времени
Регистры расчёта обеспечивают механизмы вытеснения, зависимости по базовым периодам и перерасчёты. Реализовать это самостоятельно на документах — значит по сути написать собственный расчётный движок с предсказуемыми ошибками.
Регистр накопления с видом Остатки
Регистр накопления, виртуальная таблица Обороты
Периодический регистр сведений
Регистр с продуманными измерениями
Как спроектировать регистр, чтобы он не стал проблемой
Сам регистр не гарантирует ни скорости, ни корректности — всё решает структура. Главное правило: измерения должны соответствовать разрезам, в которых реально читаются итоги. Каждое лишнее измерение раздувает таблицу итогов и замедляет как запись, так и чтение; каждое недостающее — делает невозможным нужный отчёт.
Порядок измерений тоже имеет значение. Наиболее селективные измерения (с большим числом различных значений, например номенклатура) разумно ставить в начало, если по ним чаще всего идёт отбор. Для регистра сведений критично правильно выбрать режим: подчинение регистратору нужно, когда записи создаются только документами, а независимый режим — когда данные вводятся напрямую или загружаются извне.
Для регистров накопления заранее решите, нужны ли остатки или достаточно оборотов. Регистр с видом «Обороты» легче и быстрее, но не умеет давать остаток на дату. Также продумайте, какие реквизиты движений действительно нужны: реквизиты не входят в итоги, но увеличивают объём хранения.
- 1Выпишите вопросы, на которые должен отвечать регистр: остаток, оборот, срез, детали
- 2Определите разрезы ответов — они станут измерениями
- 3Определите числовые показатели — они станут ресурсами
- 4Выберите вид регистра: остатки, обороты, сведения, расчёта
- 5Проверьте на тестовых данных время проведения документа и скорость отчёта
- 6Уберите измерения и реквизиты, которые не используются ни в одном отчёте
Конкурентный доступ и блокировки
Регистры в 1С тесно связаны с механизмом управляемых блокировок. При проведении документа платформа блокирует записи регистра по значениям измерений, и два пользователя, отгружающие один и тот же товар, не создадут «минус» одновременно: второй получит либо корректный остаток после первого, либо ошибку контроля.
Если хранить остаток, например, в реквизите справочника «Номенклатура» и изменять его кодом, контроль конкурентного доступа ложится на разработчика. Типовые сценарии гонки — два менеджера одновременно продают последнюю единицу товара — приводят к расхождениям, которые всплывают только при инвентаризации.
Дополнительно платформа умеет разделять движения документа при использовании механизма разделения итогов и поддерживает фоновое обновление итогов — всё это недоступно для самописных хранилищ на реквизитах и табличных частях.
Типичные ошибки при отказе от регистров и при их использовании
Первая группа ошибок — попытки обойтись без регистров там, где они нужны. Отчёт по табличным частям документов работает приемлемо на демо-базе и «умирает» через полгода реальной эксплуатации. Хранение текущего остатка в реквизите номенклатуры расходится с реальностью при первой же отмене проведения или перепроведении задним числом, потому что разработчик не учёл какой-то из сценариев изменения данных.
Вторая группа — ошибки внутри самих регистров. Самая частая — избыточные измерения: регистр «на всякий случай» с десятком измерений имеет огромную таблицу итогов, медленно проводится и при этом не ускоряет ни один реальный отчёт. Обратная ошибка — недостающее измерение, добавление которого потом требует свёртки и повторного накопления данных.
Отдельно стоит упомянуть запись в регистры напрямую, минуя документы. Иногда это оправдано (загрузка начальных остатков, интеграция), но при этом теряется связь «документ — движения», усложняется аудит и появляется риск рассинхронизации. Если запись делает обработка, она должна быть идемпотентной и документированной.
Как проверить, что регистр работает правильно
После внедрения или изменения регистра нужна проверка на реальных сценариях, а не только на паре тестовых документов. Минимальный набор: проведение, отмена проведения, перепроведение задним числом, параллельная работа двух сеансов, отчёты на разные даты.
Полезный приём — сверка остатков по виртуальной таблице с пересчётом «в лоб» по таблице движений за весь период. Если итоги актуальны, значения совпадут; расхождение говорит о проблемах с итогами, которые лечатся пересчётом итогов в режиме тестирования и исправления или через управление итогами.
Для регистров сведений проверяйте корректность срезов: срез последних на дату до первой записи должен вернуть пустой результат, а не ошибку или неожиданное значение. Это частый источник неверных цен и курсов в старых документах при перепроведении.
Как проверить результат
Значения совпадают на любую дату
Расхождение — нужен пересчёт итогов
Движения удалены, остатки вернулись
Остатки не изменились или появился «минус»
Стабильное время, не растёт линейно от числа движений
Каждый месяц проведение заметно медленнее
Итоги соответствуют состоянию на ту дату
Отчёт показывает текущие значения вместо исторических
Когда регистр не нужен
Честный ответ на вопрос темы включает и обратную сторону: не всякие данные требуют регистра. Если информация является неотъемлемым свойством объекта и не меняется во времени (например, артикул поставщика у номенклатуры) — ей место в реквизите справочника. Если данные нужны только внутри одного документа и никогда не агрегируются (комментарий к строке, признак ручной скидки) — им место в табличной части.
Критерий простой: регистр нужен, когда данные агрегируются, меняются во времени или читаются в разрезах, отличных от структуры документа. Если ни одно из условий не выполняется, регистр будет избыточным усложнением — ровно та ситуация, которой справедливо опасаются начинающие разработчики.
Как выбрать место хранения
Частые вопросы
Можно ли получить остатки без регистра, запросом к документам?
Технически можно: суммировать табличные части проведённых приходных документов и вычитать расходные. Но такой запрос перебирает все документы за всю историю, работает медленно, чувствителен к состояниям документов и не масштабируется. На рабочей базе это непригодное решение для интерактивных отчётов и контроля при проведении.
Регистр дублирует данные документа — это не нарушение нормализации?
Нет, это осознанная денормализация ради скорости чтения, стандартный приём в учётных системах. Целостность обеспечивает платформа: движения создаются и удаляются вместе с проведением документа в одной транзакции, поэтому расхождения между документом и его движениями в штатном режиме невозможны.
Что выбрать: один регистр с многими измерениями или несколько простых?
Ориентируйтесь на реальные сценарии чтения. Если два разреза всегда запрашиваются вместе — это один регистр. Если они используются независимо и в разных отчётах — два регистра дадут меньшие таблицы итогов и более быстрое проведение, хотя документ станет писать движения в два набора записей.
Как добавить новое измерение в существующий регистр без потери данных?
При добавлении измерения существующие записи получат пустое значение нового измерения. Если требуется заполнить его осмысленно, понадобится обработка, которая перезапишет движения на основе данных документов, с последующим пересчётом итогов. Операцию выполняют на копии, в монопольном режиме, с проверкой отчётов до и после.
Почему отчёт по регистру сведений показывает не те цены в старых документах?
Чаще всего потому, что при перепроведении документ берёт срез последних на текущую дату вместо даты документа, либо в регистре нет записей на нужный период. Проверьте, что в запросе дата среза берётся из документа, и что история цен в регистре полная, без пропусков на нужные периоды.
Нужен ли регистр для данных, которые загружаются из внешней системы?
Если эти данные участвуют в отчётах, остатках или контроле внутри 1С — да, иначе каждый отчёт будет обращаться к внешнему источнику. Загрузку оформляют либо документами с движениями, либо записью в независимый регистр сведений, если речь о справочных значениях вроде курсов и цен поставщиков.
Что важно запомнить
Регистры — это не дублирование данных документов, а оптимизированное хранилище итогов и аналитики. Используйте регистры накопления для остатков и оборотов, регистры сведений для изменяющихся во времени значений, а документы и справочники оставьте для первичных фактов и постоянных свойств. Правильный набор измерений и проверка на реальных сценариях важнее самого факта наличия регистра.