Программирование в 1С

Регистр сведений в 1С 8.3 программно: запись, изменение и удаление

Коротко

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

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

Менеджер записи или набор записей: что выбрать

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

  • Менеджер записи — одна строка независимого регистра, ключ заранее известен.
  • Набор записей — несколько строк, массовая замена по отбору или движения одного регистратора.
  • Подчинённый регистратору регистр — обычно набор записей с отбором по регистратору.
МенеджерЗаписи = РегистрыСведений.НастройкиПользователей.СоздатьМенеджерЗаписи();

НаборЗаписей = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
СоздатьМенеджерЗаписи
РегистрСведенийМенеджерЗаписи
СоздатьНаборЗаписей
РегистрСведенийНаборЗаписей

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

Чтобы добавить запись в регистр сведений 1С программно, заполните все измерения, образующие ключ, и ресурсы. В примере регистр независимый и непериодический, поэтому ключ — Пользователь и ИмяНастройки:

Запись = РегистрыСведений.НастройкиПользователей.СоздатьМенеджерЗаписи();
Запись.Пользователь = Пользователь;
Запись.ИмяНастройки = "ОсновнойСклад";
Запись.ЗначениеНастройки = ОсновнойСклад;
Запись.Записать();
Записать
Замещатьзамещать запись с тем же ключом
Нет

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

В Консоли кода можно попросить агента сформировать запись под реальные имена регистра, измерений и ресурсов вашей конфигурации — это снижает риск пропустить поле ключа.

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

У независимого регистра строки создаёт прикладной код напрямую. У регистра, подчинённого регистратору, записи принадлежат документу или другому регистратору: для набора обязательно задают Отбор.Регистратор, а у каждой строки должен быть согласованный регистратор.

В периодическом регистре в ключ входит Период. Две строки с одинаковыми измерениями, но разными периодами — разные записи. Значение периода должно соответствовать требуемому срезу и периодичности регистра; не подменяйте его произвольным текущим временем, если бизнес-ключом является начало дня или месяца.

Запись = РегистрыСведений.КурсыПоставщиков.СоздатьМенеджерЗаписи();
Запись.Период = НачалоДня(ДатаКурса);
Запись.Поставщик = Поставщик;
Запись.Валюта = Валюта;
Запись.Курс = Курс;
Запись.Записать();

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

Как найти существующую запись и изменить регистр сведений программно

Надёжный сценарий «1С изменить регистр сведений программно» — установить полный ключ менеджера, вызвать Прочитать() и проверить свойство Выбран. Если строка найдена, меняйте только ресурсы; изменение измерения или периода фактически меняет ключ.

Запись = РегистрыСведений.НастройкиПользователей.СоздатьМенеджерЗаписи();
Запись.Пользователь = Пользователь;
Запись.ИмяНастройки = "ОсновнойСклад";
Запись.Прочитать();

Если Запись.Выбран Тогда
    Запись.ЗначениеНастройки = ОсновнойСклад;
    Запись.Записать();
Иначе
    Запись.ЗначениеНастройки = ОсновнойСклад;
    Запись.Записать();
КонецЕсли;
Прочитать
Нет

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

Запись в регистр сведений 1С 8.3 программно через набор и отбор

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

Набор = РегистрыСведений.НастройкиПользователей.СоздатьНаборЗаписей();
Набор.Отбор.Пользователь.Установить(Пользователь);
Набор.Прочитать();

НоваяСтрока = Набор.Добавить();
НоваяСтрока.Пользователь = Пользователь;
НоваяСтрока.ИмяНастройки = "ОсновнойСклад";
НоваяСтрока.ЗначениеНастройки = ОсновнойСклад;

Набор.Записать(Истина);
Записать
Замещатьзаменить записи в области отбора
Нет

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

Как удалить регистр сведений программно

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

Запись = РегистрыСведений.НастройкиПользователей.СоздатьМенеджерЗаписи();
Запись.Пользователь = Пользователь;
Запись.ИмяНастройки = "ОсновнойСклад";
Запись.Прочитать();

Если Запись.Выбран Тогда
    Запись.Удалить();
КонецЕсли;
Удалить
Нет

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

Транзакция и блокировки при конкурентной записи

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

НачатьТранзакцию();

Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.НастройкиПользователей");
ЭлементБлокировки.УстановитьЗначение("Пользователь", Пользователь);
ЭлементБлокировки.УстановитьЗначение("ИмяНастройки", "ОсновнойСклад");
Блокировка.Заблокировать();

Запись = РегистрыСведений.НастройкиПользователей.СоздатьМенеджерЗаписи();
Запись.Пользователь = Пользователь;
Запись.ИмяНастройки = "ОсновнойСклад";
Запись.Прочитать();
Запись.ЗначениеНастройки = ОсновнойСклад;
Запись.Записать();

ЗафиксироватьТранзакцию();

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

Агент Консоли кода может построить блокировку по фактическому составу ключа регистра и проверить, что отбор набора совпадает с областью изменения.

Частые ошибки при программной записи регистра сведений

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

Частые вопросы о регистре сведений в 1С 8.3

Как программно проверить, существует ли запись регистра сведений?

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

Чем Записать(Истина) отличается от Записать(Ложь) у набора записей?

При значении Истина существующие строки в области отбора замещаются содержимым набора. При Ложь строки добавляются; совпадение полного ключа может привести к конфликту записи.

Что входит в ключ записи регистра сведений?

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

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф