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