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

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

Как создать набор записей в 1С

Как создать, заполнить и записать набор записей регистра в 1С: методы СоздатьНаборЗаписей, отборы, добавление строк, запись с замещением и типичные ошибки.

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

Типичная задача выглядит так: нужно программно добавить несколько строк в регистр сведений «Курсы валют» или сформировать движения документа по регистру накопления. В обоих случаях последовательность одна: создать набор записей через менеджер регистра, установить отбор, заполнить строки и записать.

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

Что такое набор записей и когда он нужен

Набор записей (RecordSet) — это таблица в памяти, структура которой повторяет структуру регистра: измерения, ресурсы, реквизиты. Набор всегда привязан к конкретному регистру и, как правило, к конкретному значению отбора — например, к регистратору у документа или к валюте у курсов валют.

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

Создание набора записей: базовый синтаксис

Набор создаётся через менеджер соответствующего регистра. Для регистра сведений это выглядит так:

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

НаборЗаписей.Отбор.Валюта.Установить(Доллар);

НоваяЗапись = НаборЗаписей.Добавить();

НоваяЗапись.Период = ТекущаяДатаСеанса();

НоваяЗапись.Валюта = Доллар;

НоваяЗапись.Курс = 90.5;

НаборЗаписей.Записать();

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

Отборы: как ограничить область записи

Коллекция Отбор набора записей содержит элементы по каждому измерению регистра, по периоду (для периодических регистров) и по регистратору (для подчинённых регистров). Элемент отбора имеет свойства Значение, Использование и ВидСравнения.

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

ЭлементОтбора = НаборЗаписей.Отбор.Период;

ЭлементОтбора.Использование = Истина;

ЭлементОтбора.ВидСравнения = ВидСравнения.БольшеИлиРавно;

ЭлементОтбора.Значение = НачалоМесяца(ТекущаяДатаСеанса());

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

Чтение, изменение и добавление строк

Метод Прочитать() загружает в набор существующие записи по установленному отбору. После чтения можно перебрать строки циклом, изменить значения полей, удалить отдельные строки методом Удалить() или очистить набор полностью методом Очистить().

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

Порядок действий
  1. 1
    Получите набор: РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей()
  2. 2
    Установите отбор по измерениям или регистратору
  3. 3
    При необходимости вызовите Прочитать() для загрузки существующих строк
  4. 4
    Добавьте или измените строки, заполнив все ключевые поля
  5. 5
    Вызовите Записать() и проверьте результат запросом или формой списка регистра

Режимы записи: замещение и добавление

Метод Записать() имеет параметр Замещение (по умолчанию Истина). Запись с замещением удаляет все существующие строки по отбору и вставляет строки набора. Запись с Замещение = Ложь добавляет строки к существующим — но при совпадении ключей (периода и измерений) возникнет ошибка уникальности.

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

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

Записать() с замещением

Подходит для полной перезаписи данных по отбору: курсы валют на дату, движения документа. Риск — потеря данных при неверном отборе.

Записать(Ложь) без замещения

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

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

Для одной строки независимого регистра сведений. Не работает с регистрами, подчинёнными регистратору.

Движения документа: набор записей в проведении

Самый частый прикладной сценарий — формирование движений в обработчике ОбработкаПроведения. Здесь набор записей уже создан платформой и доступен через коллекцию Движения:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)

Движения.ОстаткиТоваров.Записывать = Истина;

Для Каждого СтрокаТовара Из Товары Цикл

Движение = Движения.ОстаткиТоваров.Добавить();

Движение.ВидДвижения = ВидДвиженияНакопления.Приход;

Движение.Период = Дата;

Движение.Номенклатура = СтрокаТовара.Номенклатура;

Движение.Количество = СтрокаТовара.Количество;

КонецЦикла;

КонецПроцедуры

Отбор по регистратору у таких наборов установлен автоматически. Строки добавляются методом Добавить() без предварительного чтения — старые движения будут замещены при записи. Для регистров накопления обязательно заполняйте ВидДвижения (Приход или Расход), иначе получите ошибку при проведении.

Проверка результата и типичные ошибки

После записи проверьте результат: откройте форму списка регистра с тем же отбором или выполните запрос к таблице регистра. Количество строк, значения измерений и итоги по ресурсам должны совпадать с ожидаемыми. Для регистров накопления сверяйте также итоги по виртуальной таблице остатков.

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

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

Контрольные точки

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

Количество записей по отбору
Норма

Совпадает с числом добавленных строк

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

Строк больше (дубли) или меньше (потеря данных)

Ключевые поля строк
Норма

Период и измерения заполнены и равны отбору

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

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

Итоги регистра накопления
Норма

Остатки сходятся с ожидаемыми после перепроведения

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

Итоги удвоились или обнулились

FAQ

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

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

Как очистить регистр полностью через набор записей?

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

Почему при записи возникает ошибка «Запись с такими ключевыми полями существует»?

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

Нужно ли вызывать Прочитать() перед добавлением строк?

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

Как записать набор записей в обмене данными без срабатывания подписок?

Установите свойство ОбменДанными.Загрузка = Истина у набора перед записью. Это отключит бизнес-логику подписок и проверки, поэтому корректность данных полностью ложится на ваш код.

Можно ли отменить запись набора при ошибке?

Да, если запись выполняется внутри явной транзакции: при ошибке вызовите ОтменитьТранзакцию(), и данные регистра вернутся в исходное состояние. Без транзакции частично записанные данные придётся исправлять вручную.

Итог

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

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