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