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