В мире 1С:Предприятие регистры — это основа для хранения и обработки данных. Но почему одни данные хранятся в регистрах сведений, а другие — в регистрах накопления? На первый взгляд оба объекта выглядят похоже: таблицы с колонками, возможность записывать и читать информацию. Однако их архитектура, назначение и даже подходы к оптимизации кардинально различаются.
Если вы когда-нибудь сталкивались с задачей выбора между этими двумя типами регистров, то знаете, как легко ошибиться. Неправильный выбор приводит к избыточному потреблению ресурсов, замедлению работы базы или даже к логическим ошибкам в учёте. В этой статье мы не просто перечислим различия — мы разберём их на конкретных примерах из бухгалтерии, торговли и производства, покажем, как каждый тип регистра влияет на производительность, и дадим чек-лист для принятия решений.
Споiler: если вы думаете, что регистр накопления — это просто "регистр сведений с итогами", то вас ждёт несколько неожиданных открытий. Давайте копать глубже!
1. Назначение: зачем нужны регистры сведений
Регистры сведений в 1С предназначены для хранения статической или условно-постоянной информации, которая не требует автоматического подсчёта итогов. Это может быть:
- 📌 Список курсов валют на определённую дату
- 📌 Настройки пользователей (например, права доступа)
- 📌 Реестр контрагентов с их реквизитами
- 📌 Графики работы сотрудников
Главная особенность: данные здесь хранятся в виде "срезов" по измерениям (например, курс доллара на 10.05.2026). Вы можете получить значение на конкретную дату, но не можете автоматически посчитать, сколько раз курс менялся за месяц — для этого потребуется отдельный запрос.
Пример из практики: в конфигурации 1С:Зарплата и Управление Персоналом регистр сведений ГрафикиРаботыСотрудников хранит привязку сотрудников к графикам. Здесь важна не динамика изменений, а актуальное состояние на текущий момент.
⚠️ Внимание: Если вам нужно хранить историю изменений (например, все предыдущие курсы валют), обязательно настройте периодичность регистра сведений. Без этого данные будут перезаписываться, и вы потеряете историю.
2. Назначение: когда применяются регистры накопления
Регистры накопления, в отличие от регистров сведений, предназначены для динамических данных, которые требуют автоматического подсчёта итогов. Это:
- 💰 Остатки товаров на складах
- 💰 Движения денежных средств по счетам
- 💰 Начисления зарплаты по сотрудникам
- 💰 Задолженности покупателей и поставщиков
Ключевое отличие: регистры накопления поддерживают ресурсы (например, количество, сумма) и автоматически рассчитывают остатки или обороты по измерениям (склад, номинал, контрагент). Например, в регистре ТоварыНаСкладах вы можете одним запросом узнать остаток конкретного товара на всех складах или оборот по приходу/расходу за период.
Пример: в 1С:Управление Торговлей регистр накопления ПартииТоваров отслеживает приход и расход товаров по партиям. Без него невозможно было бы автоматически рассчитывать себестоимость при списании по методу FIFO или средней.
Если вам нужны и остатки, и обороты (например, для анализа продаж), используйте регистр накопления с видом ОстаткиИОбороты. Это сэкономит место и ускорит отчёты.
3. Структура: сравнение измерений, ресурсов и реквизитов
Давайте разберёмся, как устроены оба типа регистров изнутри. Для наглядности сравним их структуру в виде таблицы:
| Параметр | Регистр сведений | Регистр накопления |
|---|---|---|
| Измерения | Определяют "разрезы" данных (например, Валюта, Дата). Можно получить значение по комбинации измерений. | Также определяют "разрезы", но дополнительно поддерживают иерархию (например, склад → подсклад). |
| Ресурсы | Отсутствуют. Данные хранятся в реквизитах. | Обязательны! Хранят количественные показатели (Количество, Сумма), по которым считаются итоги. |
| Реквизиты | Дополнительные атрибуты (например, комментарий к курсу валюты). | Тоже поддерживаются, но используются реже — основная нагрузка ложится на ресурсы. |
| Периодичность | Может быть непериодическим или периодическим (с указанием даты). | Всегда привязан к дате/времени (даже если это регистр остатков). |
| Итоги | Не поддерживаются автоматически. Для анализа нужны запросы. | Автоматически рассчитывают остатки/обороты. Можно настроить предопределённые итоги для ускорения. |
Важный нюанс: в регистрах накопления ресурсы могут быть не только числовыми. Например, в регистре ВзаиморасчётыСКонтрагентами ресурсом может быть дата последнего платежа. Однако такие случаи редки — обычно ресурсы используются для хранения количественных данных.
Почему в регистрах накопления нельзя хранить текстовые ресурсы?
Текстовые ресурсы не поддерживаются, потому что для них невозможно рассчитать итоги (сумму, среднее, максимум). Исключение — дата, которая технически хранится как число, но отображается как дата.
4. Производительность: что работает быстрее
Это один из самых болезненных вопросов. Давайте разберёмся, какой регистр замедляет работу базы, а какой — ускоряет.
Регистры сведений обычно быстрее при:
- 🔹 Чтении единичных записей (например, получение курса валюты на дату).
- 🔹 Записи небольших объёмов данных.
- 🔹 Отсутствии необходимости в итогах.
Регистры накопления могут тормозить, если:
- 🔹 В них хранятся миллионы записей (например, все движения товаров за 5 лет).
- 🔹 Часто пересчитываются итоги (особенно если не настроены предопределённые итоги).
- 🔹 Используется вид
Оборотыбез необходимости — это увеличивает объём хранимых данных.
Критический момент: если в регистре накопления много измерений с высокой кардинальностью (например, регистр по документам, где измерением является номер документа), то индексы раздуваются, и запросы начинают работать медленно. В таких случаях стоит рассмотреть виртуальные таблицы или денормализацию.
⚠️ Внимание: В больших базах регистры накопления с оборотными регистраторами (например, Регистратор = Документ.РеализацияТоваров) могут приводить к блокировкам при одновременной записи. Если пользователи жалуются на "подвисания" при проведении документов, проверьте именно эти регистры.
Использовать предопределённые итоги для часто запрашиваемых разрезов|
Ограничить количество измерений (не более 5-7)|
Для больших объёмов данных настроить архивные периоды|
Проверять индексы на фрагментацию (особенно после массовых операций)|-->
5. Примеры из реальных конфигураций 1С
Теория — это хорошо, но давайте посмотрим, как регистры используются в типовых конфигурациях.
1С:Бухгалтерия 8:
- 📊 Регистр сведений
КурсыВалют— хранит курсы ЦБ и пользовательские курсы. Периодический, с измерениямиВалютаиДата. - 📊 Регистр накопления
Хозрасчетный— учитывает обороты по счётам бухгалтерского учёта. ВидОбороты, ресурсы —Сумма,Количество.
1С:Управление Торговлей 11:
- 📊 Регистр сведений
ЦеныНоменклатуры— хранит прайс-листы с привязкой к типам цен (розница, опт). Непериодический. - 📊 Регистр накопления
ТоварыНаСкладах— остатки и обороты товаров. ВидОстаткиИОбороты, ресурс —Количество.
1С:Зарплата и Управление Персоналом:
- 📊 Регистр сведений
ГрафикиРаботыСотрудников— привязка сотрудников к графикам. - 📊 Регистр накопления
НачисленияЗарплаты— суммы начислений и удержаний по сотрудникам. ВидОбороты.
Обратите внимание: в 1С:ERP регистры накопления часто заменяют на регистры бухгалтерии (для интеграции с бухучётом), но принцип остаётся тот же — если нужны итоги, используется регистр с ресурсами.
В типовых конфигурациях регистры сведений чаще всего непериодические, а регистры накопления — всегда периодические. Это связано с необходимостью привязки движений к дате документа.
6. Типичные ошибки при выборе регистра
Даже опытные разработчики иногда ошибаются. Вот самые распространённые ляпы:
Ошибка 1: Использовать регистр накопления для статических данных
Пример: хранить список менеджеров и их зоны ответственности в регистре накопления. Это не только избыточно, но и замедляет работу — ведь для такого списка не нужны итоги!
Как исправить: Перенесите данные в регистр сведений или справочник.
Ошибка 2: Хранить историю изменений в регистре сведений без периодичности
Пример: регистр курсов валют сделан непериодическим, и при каждом обновлении курса старые данные затираются.
Как исправить: Добавьте измерение Дата и сделайте регистр периодическим.
Ошибка 3: Использовать регистр сведений для учёта остатков
Пример: пытаться вручную считать остатки товаров на складе через регистр сведений, обновляя его при каждом движении.
Как исправить: Замените на регистр накопления с видом Остатки — это ускорит работу в сотни раз.
Ошибка 4: Слишком много измерений в регистре накопления
Пример: регистр с 10+ измерениями (склад, номенклатура, партия, серия, цвет, размер...) приводит к взрывному росту количества записей.
Как исправить: Объедините редко используемые измерения в одно (например, ХарактеристикаНоменклатуры).
⚠️ Внимание: Если вы обнаружили, что регистр накопления занимает более 50% объёма базы данных, это сигнал к рефакторингу. Возможно, часть данных стоит вынести в регистры сведений или архивировать.
7. Как выбрать между регистром сведений и накопления: чек-лист
Прежде чем создавать новый регистр, пройдитесь по этому списку:
Нужны ли автоматические итоги (остатки/обороты)? → Если да, то регистр накопления|
Требуется ли история изменений? → Если да, то регистр сведений с периодичностью|
Данные статичные или динамичные? → Статичные → регистр сведений; динамичные → накопления|
Будут ли данные часто обновляться? → Часто → накопления (если нужны итоги) или сведения (если нет)|
Нужна ли привязка к документам? → Если да, то регистр накопления с регистратором|-->
Дополнительные вопросы для сложных случаев:
- 🔍 Будут ли данные использоваться в отчётах с группировкой? → Если да, регистр накопления упростит написание запросов.
- 🔍 Нужно ли блокировать данные при записи? → Регистры накопления поддерживают блокировки на уровне записей.
- 🔍 Планируется ли интеграция с бухгалтерским учётом? → Тогда лучше использовать регистр бухгалтерии или накопления.
Если после ответа на эти вопросы всё ещё есть сомнения, попробуйте смоделировать оба варианта на тестовой базе и замерьте производительность при типичных операциях.
8. Оптимизация и альтернативы
Иногда регистры — не лучшее решение. Рассмотрим альтернативы:
Вместо регистра сведений:
- 📋 Справочники — если данные редко меняются и не требуют привязки к дате.
- 📋 Константы — для глобальных настроек (например, ставка НДС).
- 📋 Планы видов характеристик — для сложных иерархических данных.
Вместо регистра накопления:
- 📈 Регистры бухгалтерии — если нужна двойная запись (дебет/кредит).
- 📈 Регистры расчёта — для сложных алгоритмов начислений (например, зарплата).
- 📈 Виртуальные таблицы — если итоги можно посчитать "на лету" без хранения.
Для больших баз данных (100+ Гб) рассмотрите:
- 🗃️ Архивацию старых данных в отдельные регистры.
- 🗃️ Шардинг — разделение регистров по периодам (например, отдельный регистр для каждого года).
- 🗃️ Денормализацию — дублирование часто запрашиваемых данных в справочники.
Помните: регистр накопления с оборотными регистраторами может занимать в 10-100 раз больше места, чем регистр сведений с аналогичными данными. Всегда оценивайте объём данных перед выбором!
⚠️ Внимание: В последних версиях платформы 1С:Предприятие 8.3.20+ появилась поддержка непериодических регистров накопления. Это может быть полезно для учёта "вечных" остатков (например, основные средства), но используйте эту возможность с осторожностью — она ещё недостаточно протестирована в боевых условиях.
FAQ: Частые вопросы по регистрам 1С
Можно ли в регистре сведений хранить остатки товаров?
Технически можно, но это крайне неэффективно. Вам придётся вручную обновлять остатки при каждом движении товара, что приведёт к:
- 🔸 Потере данных при ошибках (например, если документ не проведётся до конца).
- 🔸 Замедлению работы из-за постоянных блокировок.
- 🔸 Сложности в поддержке (придётся писать триггеры для всех операций).
Используйте для остатков только регистры накопления!
Как перенести данные из регистра сведений в регистр накопления?
Для переноса:
- Создайте новый регистр накопления с нужной структурой.
- Напишите обработку, которая:
- 📌 Выгружает данные из регистра сведений (например, через запрос).
- 📌 Преобразует их в движения регистра накопления.
- 📌 Записывает движения с правильной датой и регистратором.
- Проверьте итоги после переноса — они должны совпадать с ручными расчётами.
Пример кода для переноса курсов валют (если вдруг понадобилось):
Процедура ПеренестиКурсыВалют()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КурсыВалют.Валюта КАК Валюта,
| КурсыВалют.Дата КАК Дата,
| КурсыВалют.Курс КАК Курс
|ИЗ
| РегистрСведений.КурсыВалют КАК КурсыВалют";
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Движение = Документы.УстановкаКурсовВалют.СоздатьДвижение();
Движение.Дата = Выборка.Дата;
Движение.Валюта = Выборка.Валюта;
Движение.Курс = Выборка.Курс;
Движение.Записать();
КонецЦикла;
КонецПроцедуры
Почему регистр накопления тормозит базу?
Основные причины:
- 🐢 Слишком много измерений с высокой кардинальностью (например, регистр по строкам документов).
- 🐢 Нет предопределённых итогов, и они пересчитываются при каждом запросе.
- 🐢 Регистр хранит данные за много лет без архивации.
- 🐢 Частые массовые операции (например, перепроводка документов).
Решения:
- 🔧 Настройте предопределённые итоги для часто используемых разрезов.
- 🔧 Архивируйте старые данные (например, старше 3 лет).
- 🔧 Разбейте регистр на несколько (например, отдельно для розницы и опта).
Можно ли сделать регистр накопления непериодическим?
В последних версиях платформы 1С:Предприятие 8.3.20+ это возможно, но:
- ⚠️ Такой регистр не сможет хранить историю изменений.
- ⚠️ Итоги будут рассчитываться только по актуальным данным.
- ⚠️ Не все типовые конфигурации поддерживают этот функционал.
Пример использования: учёт основных средств, где важны только текущие остатки, а история движений не нужна.
Как очистить регистр накопления без потери данных?
Для безопасной очистки:
- Сделайте резервную копию базы!
- Используйте обработку
УниверсальнаяОчисткаРегистровиз 1С:ИТС. - Или напишите свой код с проверками:
Процедура ОчиститьРегистрНакопления(ИмяРегистра, НачалоПериода, КонецПериода)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| " + ИмяРегистра + ".Ссылка КАК Ссылка
|ИЗ
| РегистрНакопления." + ИмяРегистра + " КАК " + ИмяРегистра + "
|ГДЕ
| " + ИмяРегистра + ".Период МЕЖДУ &НачалоПериода И &КонецПериода";
Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
Запрос.УстановитьПараметр("КонецПериода", КонецПериода);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Ложь;
КонецЕсли;
// Удаление движений
Движения = Результат.Выгрузить();
Для Каждого Движение Из Движения Цикл
Движение.Удалить();
КонецЦикла;
Возврат Истина;
КонецПроцедуры
После очистки обязательно пересчитайте итоги!