Что выбрать для работы с регистром сведений: Набор записей или Менеджер записи?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Основные различия и назначение объектов

Для начала давайте определимся с позиционированием этих объектов в архитектуре 1С. Менеджер записи проектировался платформой в первую очередь для интерактивной работы. Он имитирует поведение ссылочного типа (как справочник или документ), позволяя работать с одной конкретной строкой регистра. Это удобно, когда нам нужно быстро создать форму записи или программно изменить одно значение, не заботясь о фильтрах.

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

Анализ производительности и работа на уровне СУБД

Рассмотрим, как эти операции выглядят со стороны сервера базы данных. Важно понимать, что в 1С для регистров сведений практически не используется SQL-команда UPDATE. Любое изменение — это всегда удаление старой записи и вставка новой.

Проанализируем ситуацию: если нам нужно изменить 1000 записей в цикле с помощью МенеджерЗаписи, система выполнит 1000 транзакций (или одну большую, но с 1000 пар команд DELETE/INSERT). Если мы используем один НаборЗаписей, платформа оптимизирует запросы к СУБД. Хотя вставка в итоге может оставаться построчной, количество «походов» между сервером приложений и сервером баз данных резко сокращается.

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

  1. Сначала создается пустой набор записей со старыми значениями измерений для удаления «старой» записи.
  2. Затем создается набор с одной записью с новыми измерениями для вставки в базу.

В этом случае обработчики событий ПередЗаписью и ПриЗаписи в модуле набора записей будут вызваны дважды, что удваивает нагрузку на сервер при наличии в них сложного кода. Для исследования порядка срабатывания системных обработчиков можно использовать обработку для изучения событий платформы 1С.

Безопасность данных и риск «очистки» регистра

Разберем один из самых опасных моментов при работе с НаборЗаписей. Распространенная ошибка новичков — некорректная установка отбора. Посмотрим на типичный сценарий:


НЗ = РегистрыСведений.ЦеныНоменклатуры.СоздатьНаборЗаписей();
НЗ.Отбор.Номенклатура.Установить(ВыбраннаяНоменклатура);
// Если ВыбраннаяНоменклатура имеет неверный тип или не заполнена, 
// отбор может не примениться так, как ожидает разработчик.
НЗ.Записать(); // Внимание: если отбор пустой, затрется ВЕСЬ регистр!

При использовании метода Записать() с параметром Замещать = Истина (это значение по умолчанию), 1С сначала удаляет все данные из базы, которые попадают под текущий отбор. Если вы допустили ошибку в типе значения отбора или забыли вызвать Установить(), платформа воспримет это как команду на очистку всего диапазона (вплоть до всего регистра).

Для защиты от таких ситуаций проанализируем следующий прием, который часто называют «безопасным чтением»:


НаборДвижений = РегистрыСведений.Регистр1.СоздатьНаборЗаписей();
Для Каждого ЭлементОтбора Из НаборДвижений.Отбор Цикл
    ЭлементОтбора.Использование = Истина;
    ЭлементОтбора.Значение = СтрокаРезультата[ЭлементОтбора.Имя];
КонецЦикла;
НаборДвижений.Прочитать(); 
// Даже если отбор не сработал, Прочитать() просто загрузит данные в память, 
// но не удалит их из базы до момента вызова Записать().

Блокировки данных

Разберем вопрос параллельной работы пользователей. МенеджерЗаписи устанавливает блокировку только на одну конкретную запись (по всем измерениям). НаборЗаписей блокирует весь диапазон, соответствующий отбору. Если вы работаете в режиме управляемых блокировок, при использовании набора записей вы обязаны явно описывать пространство блокировки, иначе рискуете получить ошибку или избыточные ожидания на уровне СУБД.

Дополнительные свойства и Обмен данными

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

Если вам нужно записать данные в регистр так, чтобы «пропустить» проверки в подписках на события или не регистрировать изменения для обмена, вам обязательно придется использовать НаборЗаписей:


НЗ = РегистрыСведений.ИсторияСтатусов.СоздатьНаборЗаписей();
НЗ.Отбор.Объект.Установить(ТекущийОбъект);
НЗ.ОбменДанными.Загрузка = Истина; 
// Теперь проверки в модуле набора не сработают (если там есть проверка Загрузки)
НЗ.Записать();

Когда и что использовать: краткие рекомендации

Проанализируем и структурируем рекомендации по выбору объекта:

  1. Используйте Менеджер записи, если:
    • Вам нужно интерактивно редактировать одну запись в форме.
    • Вы пишете простую обработку по добавлению/изменению одиночных записей и хотите сделать код максимально читаемым (используя метод Выбран()).
    • Нужно быстро проверить существование записи через Прочитать() и Выбран().
  2. Используйте Набор записей, если:
    • Вы выполняете массовую запись данных (загрузка из файлов, пересчет итогов).
    • Вам нужно использовать ОбменДанными.Загрузка или передать параметры через ДополнительныеСвойства.
    • Необходимо очистить определенный срез данных (например, по одной организации).
    • Вы заботитесь об оптимизации и минимизации количества вызовов серверных событий (используя Записать(Ложь) для добавления новых записей без удаления старых, если уверены в отсутствии дублей).

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

← На главную