К статье
Практический материал

Разработка и Конфигурация · 11 мин

Чем отличается менеджер записи от набора записей в 1С

Чем отличается менеджер записи от набора записей в 1С: назначение, методы, примеры кода, типичные ошибки и практические рекомендации для разработчиков.

В регистрах сведений 1С есть два похожих по названию объекта встроенного языка — менеджер записи и набор записей. Начинающие разработчики часто путают их, потому что оба позволяют читать и записывать данные регистра, а код выглядит почти одинаково. Однако разница между ними принципиальна: менеджер записи работает ровно с одной строкой регистра, а набор записей — с коллекцией строк, отобранных по отбору. Неправильный выбор объекта приводит к ошибкам «Запись с такими ключевыми полями существует», потере данных при записи и лишней нагрузке на базу.

Менеджер записи создаётся вызовом РегистрыСведений.ИмяРегистра.СоздатьМенеджерЗаписи() и представляет собой объект со свойствами, совпадающими с измерениями, ресурсами и реквизитами регистра. Набор записей создаётся через СоздатьНаборЗаписей(), содержит коллекцию строк и обязательный объект отбора. Понимание этой разницы — база для корректной работы с регистрами сведений, особенно подчинёнными регистратору, где набор записей используется практически всегда.

Что такое менеджер записи и когда он применяется

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

Типичный сценарий — установка одного значения в независимом регистре сведений, например запись курса валюты или индивидуальной настройки пользователя:

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

Менеджер.Период = ТекущаяДатаСеанса();

Менеджер.Валюта = ВалютаСсылка;

Менеджер.Курс = 92.5;

Менеджер.Записать();

Ключевое ограничение: менеджер записи нельзя использовать для регистра сведений, подчинённого регистратору. При попытке записи платформа выдаст ошибку, потому что строки такого регистра существуют только в рамках движений документа-регистратора. Также менеджер записи не умеет удалять запись стандартным методом Удалить() — для удаления используют набор записей с пустым содержимым.

Что такое набор записей и как он устроен

Набор записей — это коллекция строк регистра плюс объект отбора. Перед чтением или записью разработчик обязан установить отбор: минимально по регистратору для подчинённых регистров, по измерениям — для независимых. Метод Прочитать() загружает из базы все строки, удовлетворяющие отбору; метод Записать() заменяет в базе всё множество строк, соответствующих отбору, на содержимое набора.

Пример записи движений документа в подчинённый регистр сведений:

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

Набор.Отбор.Регистратор.Установить(СсылкаНаДокумент);

НоваяСтрока = Набор.Добавить();

НоваяСтрока.Номенклатура = Товар;

НоваяСтрока.Цена = 1500;

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

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

Ключевые различия: сравнение по параметрам

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

ПараметрМенеджер записиНабор записей
Количество строкРовно однаЛюбое, от нуля и далее
ОтборНет, ключ задаётся значениями измеренийОбязателен, определяет читаемое и записываемое множество
Регистры с регистраторомНе поддерживаютсяЕдинственный способ работы
Удаление записейНевозможно напрямуюЗапись пустого набора удаляет строки по отбору
ЧтениеОдна запись по ключуВсе записи по отбору
Режим загрузкиНе поддерживаетсяСвойство ОбменДанными.Загрузка доступно

Обратите внимание на последнюю строку таблицы: набор записей поддерживает свойство ОбменДанными.Загрузка = Истина, которое отключает проверки при записи. У менеджера записи такого свойства нет, что тоже ограничивает его применение в обменах данными.

Как выбрать объект под конкретную задачу

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

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

Маршрут решения

Как выбрать действие

Регистр сведений подчинён регистраторуИспользуйте набор записей с отбором по регистратору
Нужно прочитать или записать одну строку независимого регистраИспользуйте менеджер записи — код короче и понятнее
Нужно удалить запись независимого регистраСоздайте набор записей, установите отбор по измерениям и вызовите Записать() без добавления строк
Нужно массово обновить много строкИспользуйте запрос для чтения и набор записей для записи, а не цикл с менеджером записи

Типичные ошибки и их последствия

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

Третья ошибка — использование менеджера записи в цикле для массового обновления. Каждый вызов Записать() — отдельная транзакция и обращение к СУБД, поэтому обновление нескольких тысяч записей растягивается на минуты вместо секунд. Четвёртая — забытый отбор у набора записей: запись набора без отбора для независимого регистра приведёт к замещению всей таблицы регистра, что в рабочей базе означает потерю данных.

Типичные ошибки
01
Запись в подчинённый регистр через менеджер записи — платформа выдаёт ошибку, данные не сохраняются
02
Запись набора без Прочитать() при попытке добавить строки — существующие строки по отбору удаляются
03
Отсутствие отбора у набора записей — замещается вся таблица регистра
04
Массовое обновление через менеджер записи в цикле — резкое падение производительности

Как проверить результат записи

После записи полезно убедиться, что данные в базе соответствуют ожиданиям. Для менеджера записи достаточно повторно создать объект, заполнить ключевые поля и выполнить Прочитать(), а затем проверить метод Выбран() — он вернёт Истина, если запись существует. Для набора записей — прочитать с тем же отбором и проверить Количество() и значения ресурсов.

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

Контрольные точки

Как проверить результат

Метод Выбран() после Прочитать() у менеджера записи
Норма

Возвращает Истина — запись с таким ключом существует

Тревожный признак

Возвращает Ложь — запись не найдена, проверьте значения измерений и период

Количество строк набора после Прочитать()
Норма

Совпадает с ожидаемым числом записей по отбору

Тревожный признак

Ноль или меньше ожидаемого — проверьте отбор и права доступа

Содержимое регистра через запрос
Норма

Все ожидаемые строки присутствуют, старые не потеряны

Тревожный признак

Пропали строки, которых не было в наборе — запись выполнена без предварительного чтения

Производительность и тонкости в клиент-серверном режиме

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

Ещё одна тонкость — свойство Замещать у метода Записать() набора записей. По умолчанию оно равно Истина, то есть старые данные по отбору замещаются. Значение Ложь позволяет добавить записи без удаления существующих, но при конфликте ключей вызовет ошибку. У менеджера записи такого параметра нет: он всегда замещает запись с совпадающим ключом, о чём легко забыть.

При отладке удобно выводить в журнал регистрации ключевые поля записи перед вызовом Записать(). Это быстро показывает, совпадают ли измерения с теми, что реально хранятся в базе, — большинство «неработающих» записей объясняется несовпадением периода или одного измерения.
ПЗ
Практическое замечание

Частые вопросы

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

Стандартного метода удаления у менеджера записи нет. Удаление выполняется набором записей: установите отбор по значениям измерений удаляемой строки, не добавляйте строки в набор и вызовите Записать(). Пустой набор заместит существующую запись, то есть удалит её.

Почему возникает ошибка «Запись с такими ключевыми полями существует»?

Ошибка появляется, когда набор записей записывается с параметром Замещать = Ложь, а строка с таким ключом уже есть в базе, или когда записываются движения, конфликтующие с существующими. Проверьте значения измерений и периода и при необходимости используйте замещение или предварительную очистку по отбору.

Можно ли использовать менеджер записи для периодического регистра?

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

Что быстрее при обновлении тысячи записей — менеджер записи или набор записей?

Набор записей значительно быстрее: он сохраняет все строки одной операцией записи. Тысяча вызовов Записать() у менеджера записи — это тысяча отдельных транзакций и обращений к серверу СУБД, что на порядки медленнее и создаёт лишнюю нагрузку на базу.

Нужно ли вызывать Прочитать() перед записью набора записей?

Зависит от задачи. Если нужно сохранить существующие строки и изменить часть из них — чтение обязательно, иначе запись затрёт все данные по отбору. Если задача — полностью заменить движения по отбору новым содержимым, чтение не требуется.

Работает ли набор записей с независимым регистром сведений?

Да, набор записей универсален и работает с обоими типами регистров. Для независимого регистра отбор устанавливается по измерениям (и периоду при необходимости). Это стандартный способ массового изменения и удаления записей в независимых регистрах.

Итог

Что важно запомнить

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