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

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

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

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

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

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

Оба объекта создаются через менеджер регистра сведений: РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей() и РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи(). Дальше их поведение расходится, и ниже разобраны устройство каждого объекта, сценарии применения, типовые ошибки и критерии выбора.

Что представляет собой набор записей

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

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

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

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

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

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

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

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

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

ПараметрНабор записейМенеджер записи
Количество записейКоллекция строк (от нуля до множества)Строго одна запись
ОтборПо измерениям и регистратору, определяет затрагиваемые строкиНе используется; запись адресуется значениями ключа
Поведение при записиЗамещает все строки под отбором (по умолчанию)Обновляет или создаёт одну строку
УдалениеОчистка набора и запись — удаляет всё под отборомМетод Удалить() — только одна запись
Типовой сценарийЗагрузка курсов за период, перезапись данных по контрагентуПравка одной цены, одного курса на дату
Риск при ошибкеВысокий: неверный отбор затирает лишние данныеНизкий: затрагивается одна строка

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

Сравнение вариантов

Набор записей

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

Менеджер записи

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

Когда использовать набор записей

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

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

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

Пример кода для набора записей

bsl
Набор = РегистрыСведений.КурсыВалют.СоздатьНаборЗаписей();
Набор.Отбор.Валюта.Установить(ВыбраннаяВалюта);

НоваяЗапись = Набор.Добавить();
НоваяЗапись.Период = ТекущаяДатаСеанса();
НоваяЗапись.Валюта = ВыбраннаяВалюта;
НоваяЗапись.Курс = 90.5;

Набор.Записать(); // замещает все записи по этой валюте

Когда использовать менеджер записи

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

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

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

Пример кода для менеджера записи

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

Менеджер.Курс = 91.2;
Менеджер.Записать(); // затронута только эта запись

Типовые ошибки и как их избежать

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

Вторая частая ошибка — попытка использовать менеджер записи для групповой выборки. Менеджер не умеет читать «все записи по контрагенту»: он адресует одну строку по полному ключу. Для выборок существуют запросы и метод Выбрать() менеджера регистра, а для пакетной записи — набор записей.

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

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

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

Алгоритм выбора сводится к трём вопросам. Сколько записей затрагивает операция — одну или группу? Допустимо ли замещение существующих данных под отбором? Известен ли точный ключ записи? Одна запись с известным ключом — менеджер. Группа записей или полная перезагрузка среза — набор с корректным отбором. Массовое чтение без записи — запрос, а не оба этих объекта.

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

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

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

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

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

Количество строк в регистре после записи набора
Норма

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

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

Строк резко меньше — сработало замещение лишних данных

Отбор набора перед Записать()
Норма

Все нужные измерения в отборе установлены

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

Отбор пуст — запись затронет весь регистр

Состояние менеджера после Прочитать()
Норма

Ресурсы заполнены данными существующей записи

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

Поля пустые — записи с таким ключом нет, будет создана новая

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

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

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

Что произойдёт, если записать пустой набор записей?

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

Чем менеджер записи отличается от выборки через метод Выбрать()?

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

Работают ли эти объекты с регистрами накопления?

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

Как безопасно обновить группу записей, не потеряв чужие данные?

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

Что быстрее при массовой загрузке: набор или менеджер в цикле?

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

Итог

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

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