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