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