Разработка и Конфигурация · 11 мин
Как работать с регистрами в 1С
Практическое руководство по работе с регистрами в 1С: виды регистров, запись и чтение данных, типичные ошибки, проверка результатов и ответы на частые вопросы.
Регистры — это основной механизм хранения оперативных и аналитических данных в 1С. Если справочники отвечают на вопрос «что это за объект», а документы — «какое событие произошло», то регистры отвечают на вопрос «что изменилось в учёте и каково текущее состояние». Остатки товаров на складах, движения денежных средств, цены номенклатуры, курсы валют — всё это хранится в регистрах.
Понимание регистров критично и для разработчика, и для продвинутого пользователя: именно по данным регистров строятся отчёты, формируются проводки и рассчитываются остатки. Ошибка в структуре регистра или логике записи приводит к расхождениям в учёте, которые сложно отследить и исправить задним числом.
В материале разобраны виды регистров, способы записи и чтения данных, типовые сценарии из практики, ограничения и типичные ошибки. Примеры кода приведены на встроенном языке 1С и подходят для управляемых форм и серверного контекста.
Виды регистров и когда какой использовать
Платформа 1С предоставляет четыре вида регистров, каждый из которых решает свою задачу. Выбор вида определяется на этапе проектирования конфигурации и изменить его позже без переноса данных нельзя.
Регистр сведений хранит информацию в разрезе заданных измерений: например, цены товара по видам цен или адреса контрагентов. Может быть периодическим (значение действует с определённой даты) и подчинённым регистратору (записи появляются только через документ).
Регистр накопления предназначен для учёта количественных показателей. Бывает двух видов: «Остатки» — платформа автоматически хранит итоги на каждый момент времени (складские остатки, взаиморасчёты), и «Обороты» — хранятся только суммы движений за период (выручка, объёмы продаж).
Регистры бухгалтерии и расчёта — специализированные: первые связаны с планом счетов и поддерживают проводки по дебету и кредиту, вторые используются для расчёта зарплаты с механизмом вытеснения и базы. Ниже основное внимание уделено регистрам сведений и накопления, так как они встречаются в любой конфигурации.
Сравнение видов регистров
Хранение значений в разрезе измерений: цены, курсы, адреса. Не даёт сумм и остатков.
Когда нужен актуальный остаток на любой момент: склад, деньги, взаиморасчёты. Требует видов движения Приход/Расход.
Когда нужна только сумма за период: продажи, выручка. Дешевле по ресурсам, но остаток получить нельзя.
Проводки по плану счетов с дебетом и кредитом. Только для бухгалтерского учёта.
Структура регистра: измерения, ресурсы, реквизиты
Каждый регистр состоит из трёх групп полей, и правильное распределение данных между ними — половина успешной разработки. Измерения — это разрезы, в которых хранятся данные (склад, номенклатура, контрагент). По сочетанию измерений строится уникальность записи и срезы данных.
Ресурсы — числовые (реже строковые) показатели, которые суммируются: количество, сумма. Реквизиты — дополнительная информация о движении, не участвующая в итогах: комментарий, номер партии, ответственный.
Ключевое правило проектирования: если по полю нужно отбирать данные или строить срез — это измерение; если значение должно складываться в итоги — ресурс; если поле нужно только для справки в строке движения — реквизит. Частая ошибка — делать реквизитом то, что должно быть измерением: потом по этому полю невозможно получить остатки или построить эффективный отчёт.
Запись данных в регистр
Запись движениями документа
Основной и рекомендуемый способ — запись через проведение документа. Документ выступает регистратором, а его движения формируются в обработчике ОбработкаПроведения. Такой подход обеспечивает связность данных: каждую запись регистра можно открыть и увидеть, каким документом она создана.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Движения.ОстаткиТоваров.Записывать = Истина;
Для Каждого Строка Из Товары Цикл
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Склад = Склад;
Движение.Номенклатура = Строка.Номенклатура;
Движение.Количество = Строка.Количество;
КонецЦикла;
КонецПроцедуры
Обратите внимание на строку Движения.ОстаткиТоваров.Записывать = Истина; — без неё добавленные движения не будут записаны при проведении. Вид движения (Приход/Расход) обязателен для регистра остатков; для оборотного регистра он не указывается.
Запись набором записей без документа
Для независимых регистров сведений (например, курсы валют, загружаемые из внешнего источника) запись выполняется напрямую через менеджер записи или набор записей:
МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ТекущаяДатаСеанса();
МенеджерЗаписи.Валюта = ВалютаСсылка;
МенеджерЗаписи.Курс = 92.5;
МенеджерЗаписи.Записать();
Менеджер записи подходит для одиночной записи. Если нужно массово загрузить данные, используйте набор записей с отбором и Записать(Истина) — но помните, что запись с замещением полностью перезаписывает все строки, попадающие под отбор.
Чтение данных из регистров
Читать данные регистров следует через запросы — это быстрее и корректнее, чем перебор записей в цикле. Для регистров накопления и периодических регистров сведений платформа предоставляет виртуальные таблицы, которые рассчитывают итоги автоматически.
Для регистра накопления вида «Остатки» используйте таблицу Остатки (состояние на момент) и ОстаткиИОбороты (состояние плюс движения за период). Для периодического регистра сведений — СрезПоследних (актуальное значение на дату) и СрезПервых.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура,
| Остатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(&Период, Склад = &Склад) КАК Остатки";
Запрос.УстановитьПараметр("Период", КонецДня(ТекущаяДатаСеанса()));
Запрос.УстановитьПараметр("Склад", СкладСсылка);
Результат = Запрос.Выполнить().Выгрузить();
Параметры виртуальной таблицы (период, условие отбора) передавайте именно в скобках таблицы, а не в секции ГДЕ — отбор внутри виртуальной таблицы выполняется до расчёта итогов и работает в разы быстрее на больших объёмах.
ВЫБРАТЬ
Срез.Номенклатура,
Срез.Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ВидЦены = &ВидЦены) КАК СрезПроверка результата записи
После проведения документа или выполнения загрузки убедитесь, что данные попали в регистр корректно. Самый быстрый способ — открыть документ и воспользоваться кнопкой перехода к движениям (в типовых формах это «Ещё → Движения документа» или панель навигации по регистрам).
Для программной проверки выполните тестовый запрос к виртуальной таблице с отбором по регистратору или измерениям. Сверьте количество строк движений с количеством строк табличной части документа и контрольные суммы.
Как проверить результат
Строки по каждому регистру соответствуют табличной части документа
Регистр пуст или строк меньше, чем в документе
Остаток изменился на сумму движения с правильным знаком
Остаток не изменился или ушёл в минус неожиданно
Период равен дате документа
Период пустой или отличается от даты документа
После отмены проведения движения полностью исчезают
Записи остаются в регистре — значит, они записаны в обход регистратора
Типичные ошибки при работе с регистрами
Большинство проблем с регистрами возникает из-за нескольких повторяющихся ошибок. Знание их заранее экономит часы отладки.
Отдельно стоит упомянуть работу с итогами. Платформа хранит итоги по месяцам, и получение остатков «на середину месяца» требует расчёта от ближайшей границы итогов. При массовом проведении документов задним числом имеет смысл временно отключать использование итогов (УстановитьИспользованиеИтогов(Ложь)), а после завершения включать обратно — это ускоряет запись в разы.
Ограничения и когда регистр не нужен
Не всякую информацию стоит складывать в регистр. Если данные не меняются документами и не нужны в разрезах для отчётов — достаточно реквизитов справочника. Регистр оправдан, когда нужны история изменений, итоги по разрезам или контроль остатков.
Учтите технические ограничения: регистры сведений с режимом «Подчинение регистратору» нельзя редактировать вручную, а у независимых регистров нет связи с документами — целостность данных обеспечиваете вы сами. На больших объёмах (миллионы записей) планируйте индексы, состав измерений и периодичность регистра заранее: перестройка структуры на рабочей базе с данными потребует свёртки или переноса.
Как выбрать действие
Что важно запомнить
Выбирайте вид регистра под задачу: сведения — для значений в разрезах, накопления — для остатков и оборотов. Записывайте данные движениями документов, читайте запросами к виртуальным таблицам с отбором в параметрах. После записи проверяйте движения и итоги, а перед массовыми операциями делайте резервную копию.
Частые вопросы о регистрах 1С
Чем регистр сведений отличается от регистра накопления?
Регистр сведений хранит значения (цены, курсы, адреса) без суммирования — по нему нельзя получить остаток. Регистр накопления хранит числовые показатели, которые складываются в итоги: остатки или обороты. Если нужна сумма по разрезам — это регистр накопления, если просто актуальное значение — регистр сведений.
Почему документ проводится, но движений в регистре нет?
Чаще всего не выполнена установка флага Движения.ИмяРегистра.Записывать = Истина в обработчике проведения. Также проверьте, что у документа в конфигураторе отмечен этот регистр в списке движений и что обработчик не завершается раньше добавления движений.
Как получить цену товара на конкретную дату?
Используйте виртуальную таблицу СрезПоследних периодического регистра сведений, передав нужную дату первым параметром. Таблица вернёт значения, действовавшие на этот момент, по каждому сочетанию измерений.
Можно ли редактировать записи регистра вручную?
Только если регистр сведений независимый и не подчинён регистратору — тогда доступна ручная работа со списком записей. Записи регистров накопления и подчинённых регистров сведений изменяются только через проведение документов-регистраторов.
Почему запрос к остаткам работает медленно?
Основные причины: отбор указан в секции ГДЕ вместо параметров виртуальной таблицы, запрошены остатки на дату внутри незакрытого периода итогов, в регистре слишком много измерений. Начните с переноса условий в параметры виртуальной таблицы — это обычно даёт главный эффект.
Как удалить ошибочные движения документа?
Правильный способ — отменить проведение документа: платформа сама удалит все его движения во всех регистрах. Удалять записи наборами записей вручную стоит только в исключительных случаях и после резервного копирования, так как это нарушает связь документа с учётом.