Работа с регистрами сведений является фундаментом для построения аналитики и хранения исторических данных в конфигурациях 1С:Предприятие. Разработчикам часто приходится решать задачу, как добавить данные в регистр сведений, чтобы обеспечить корректное накопление информации о событиях, остатках или состоянии объектов.

В отличие от регистров накопления, здесь структура хранения может быть как периодической, так и непериодической, что накладывает отпечаток на методы записи. Понимание механики работы с измерителями и ресурсами критически важно для производительности системы.

В этой статье мы детально разберем программные и инструментальные способы заполнения регистров, уделив особое внимание нюансам периодичности и уникальности записей. Вы узнаете, как избежать дублирования и правильно организовать срез данных.

Архитектура регистра сведений и ключевые понятия

Прежде чем приступать к записи, необходимо четко понимать структуру объекта метаданных. Регистр сведений представляет собой таблицу, предназначенную для хранения справочной или фактографической информации, которая может изменяться во времени.

Основу структуры составляют измерения. Именно по ним система строит уникальный ключ записи. Если вы попытаетесь добавить строку с уже существующим набором измерений (и периодом, если он есть), произойдет overwrite — перезапись старых данных новыми.

Важно различать виды регистров по признаку периодичности. Непериодический регистр хранит данные без привязки ко времени, где актуальна только последняя запись по измерениям. Периодический регистр позволяет хранить историю изменений, привязывая каждую запись к конкретной дате или времени.

⚠️ Внимание: При создании регистра с периодичностью «Внутри дня» или «Внутри месяца» убедитесь, что логика вашей программы учитывает необходимость усечения временной метки до начала периода при выборке срезов.

Ресурсы — это поля, содержащие количественные или текстовые данные, которые мы собственно и хотим сохранить или обновить. Правильный выбор типов данных для ресурсов влияет на скорость работы запросов.

💡

Используйте булевы типы для флагов в ресурсах, если планируете часто фильтровать по ним в отчетах — это ускорит работу индексов.

Подготовка метаданных перед записью

Качество работы с данными напрямую зависит от настройки объекта в конфигураторе. Перед тем как добавить данные в регистр сведений программно, проверьте свойства в дереве метаданных.

Обратите внимание на флаги «Ведущее» у измерений. Ведущее измерение обычно ссылается на основной объект учета (например, Номенклатуру или Контрагента) и часто используется для отборов в запросах.

  • 📂 Проверьте использование стандартных реквизитов: Период, Активность. Они добавляются автоматически, но их нужно корректно заполнять.
  • 🔑 Убедитесь, что состав измерений формирует уникальность записи для вашей бизнес-задачи.
  • ⚙️ Настройте индексацию по часто используемым полям для ускорения выборки.

Если регистр подчинен регистратору, то запись данных возможна только в момент проведения документа. В этом случае ручное добавление через код вне транзакции документа невозможно без нарушения целостности базы.

📊 С каким типом периодичности вы чаще всего работаете?
Непериодический
Внутри дня
Внутри месяца
Внутри года

Программная запись: объект МенеджерЗаписи

Наиболее распространенный способ наполнения — использование объекта МенеджерЗаписи. Этот подход позволяет гибко управлять процессом, создавать новые строки и контролировать их свойства.

Для начала работы необходимо получить ссылку на менеджер регистра. Далее создается новая запись, которой присваиваются значения измерений и ресурсов.

МенеджерЗаписи = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();

НоваяЗапись = МенеджерЗаписи.СоздатьЗапись();

НоваяЗапись.Период = ТекущаяДата();

НоваяЗапись.Номенклатура = СсылкаНаТовар;

НоваяЗапись.Цена = 1500.00;

НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоКоду("RUB");

НоваяЗапись.Записать();

Такой метод удобен при поштучной обработке данных, например, при проведении одного документа. Однако при массовой загрузке из внешних источников он может работать медленно из-за множественных обращений к базе данных.

💡

Метод Записать() фиксирует изменения в базе данных немедленно. Если запись не выполнена, данные будут утеряны при завершении процедуры.

Массовая загрузка через набор записей

Когда стоит задача добавить большой объем данных, например, при обновлении цен прайс-листа или загрузке курсов валют, использование НаборЗаписей является предпочтительным решением.

Этот объект позволяет сформировать коллекцию записей в памяти и выгрузить их в базу данных одним транзакционным пакетом. Это существенно снижает нагрузку на СУБД и ускоряет процесс в разы по сравнению с циклическим созданием отдельных записей.

Алгоритм работы прост: создаем набор, читаем в него данные (или заполняем вручную), при необходимости фильтруем или модифицируем, и затем вызываем метод записи всего набора.

Этап Метод Описание действия
Инициализация СоздатьНаборЗаписей() Создает пустой контейнер для данных
Заполнение Прочитать() или цикл Загружает существующие или добавляет новые строки
Модификация Прямое обращение к полям Изменение значений ресурсов или измерений
Сохранение Записать() Фиксирует весь пакет изменений в БД

При использовании набора записей важно контролировать отбор. Если вы читаете данные из регистра перед изменением, обязательно устанавливайте отбор по нужным измерениям, чтобы не выгружать в память лишние миллионы строк.

Оптимизация памяти при работе с наборами

Если объем данных превышает доступную оперативную память платформы, используйте свойство "Отбор" перед чтением, чтобы разбить процесс на порции.

Особенности работы с периодичностью

Периодичность — это свойство, которое часто вызывает ошибки у начинающих разработчиков. При добавлении данных в регистр с периодичностью система требует явного указания поля Период.

Если вы работаете с регистром, где периодичность установлена «Внутри дня», а вы передаете дату с временем 14:30, то при формировании среза на начало дня эта запись может не попасть в выборку, если не настроено корректное усечение.

Для непериодических регистров поле периода отсутствует. В таких структурах актуальным считается последнее значение, записанное по комбинации измерений. Любая новая запись с теми же измерениями полностью заменяет предыдущую.

⚠️ Внимание: При записи в периодический регистр без указания времени (только дата), платформа может автоматически дополнять время до 00:00:00 или 23:59:59 в зависимости от версии платформы и настроек. Всегда явно задавайте время, если нужна точность до секунды.

Существует также понятие «Ведущий период». В некоторых конфигурациях период может выступать не просто как время события, а как часть ключа, подчиненная другому объекту. Это усложняет логику выборки срезов.

☑️ Контроль периодичности

Выполнено: 0 / 4

Обработка ошибок и блокировок

При конкурентной работе нескольких пользователей или фоновых заданий может возникнуть ситуация блокировки записей. Если один процесс пытается изменить строку, которую в данный момент редактирует другой, возникнет ошибка монопольной блокировки.

Платформа 1С:Предприятие предоставляет механизмы обработки таких ситуаций. Рекомендуется оборачивать критические участки кода работы с регистрами в конструкцию Попытка..Исключение.

Также полезно использовать режим БлокировкаДанных при чтении наборов записей, если вы планируете их последующую модификацию. Это предотвратит изменение данных другими сеансами в момент вашей работы.

Попытка

НаборЗаписей.Записать();

Исключение

Сообщить("Не удалось записать данные: " + ОписаниеОшибки());

// Логика повторной попытки или отката

КонецПопытки;

Анализ журнала регистрации помогает выявить причины частых блокировок. Если конфликты происходят регулярно, возможно, стоит пересмотреть структуру измерений регистра или логику проведения документов.

Частые вопросы и решения (FAQ)

Как удалить конкретную запись из регистра сведений?

Для удаления необходимо прочитать запись в набор записей или создать объект записи с теми же значениями измерений (и периода), что и у удаляемой строки. После этого вызывается метод Удалить() для объекта записи или Записать() для набора, из которого предварительно удалена строка.

В чем разница между срезом последних и срезом первых?

Срез последних возвращает данные на указанную дату (или на текущий момент), беря самую свежую запись. Срез первых используется реже и возвращает самую раннюю запись, существующую на момент времени или до него. Это важно для анализа истории изменений.

Можно ли добавить запись в регистр, подчиненный регистратору, вручную?

Нет, напрямую через интерфейс или код вне контекста документа это сделать нельзя. Данные в такие регистры добавляются автоматически механизмом проведения документа-регистратора. Обход этого ограничения считается нарушением архитектуры.

Что делать, если дублируются записи при массовой загрузке?

Проверьте уникальность комбинации измерений в загружаемых данных. Если дубли есть во входном файле, используйте структуру или таблицу значений с группировкой перед записью в регистр, чтобы объединить повторяющиеся строки.