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