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