Правка записей регистра сведений в 1С 8.3: вручную, через документ и кодом

· 9 мин

Содержание

Чтобы изменить запись в регистре сведений 1С, откройте регистр через Главное меню → Все функции → Регистры сведений, дважды щёлкните нужную строку, поправьте значение и нажмите «Записать и закрыть». Так правятся независимые регистры. Если регистр подчинён регистратору, запись меняют через документ, который её создал: исправляют сам документ и перепроводят его или включают ручную корректировку движений.

Выбор способа зависит от двух вещей: подчинён ли регистр документу и сколько записей нужно поменять. Одну-две строки удобнее исправить мышкой. Сотни строк — набором записей во внешней обработке. Ниже всё по порядку, с кодом, который можно взять за основу.

Что хранит регистр сведений и почему записи приходится править

Регистр сведений — это таблица значений с ключом. Ключ образуют измерения, а у периодического регистра ещё и период. Ресурсы — это сами хранимые значения. Пример: в регистре цен измерения «Номенклатура» и «Вид цены», период — дата установки, ресурс — «Цена».

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

Править записи приходится в таких случаях:

  • 💰 ошибка в значении ресурса: неверная цена, курс, ставка, процент;
  • 📅 значение задано не с той даты, и срез последних отдаёт не то, что нужно;
  • 🔗 запись ссылается на удалённый или неверный элемент справочника;
  • 🔄 после загрузки или обмена пришли дубли или мусорные строки;
  • 🛠️ настройку конфигурации хранят в регистре, а штатной формы для её правки нет.

Перед правкой определите режим записи регистра. Это видно в конфигураторе на вкладке «Данные» или «Основные» свойств объекта: «Независимый» или «Подчинение регистратору». От этого зависит весь дальнейший путь.

Тип регистраКто создаёт записиКак правильно менять
Независимый, непериодическийПользователь или кодВручную в форме списка или менеджером записи
Независимый, периодическийПользователь или кодНовая запись на новую дату или правка существующей
Подчинённый регистраторуДокумент при проведенииИсправить документ и перепровести; ручная корректировка движений

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

Пять способов изменить запись в регистре сведений

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

  1. Штатная форма конфигурации. Многие регистры редактируются из карточек: учётная политика — из карточки организации, курсы — из справочника валют. Это самый безопасный путь: работают все проверки и обработчики формы.
  2. Форма списка через «Все функции». Универсальный путь для независимых регистров. Нужны права на изменение регистра.
  3. Документ-регистратор. Для подчинённых регистров: правите документ, проводите заново, движения пересоздаются.
  4. Ручная корректировка движений документа. Если перепроведение не даёт нужной записи, движения правят прямо в документе.
  5. Программное изменение. Менеджер записи для одной строки, набор записей для группы. Запускается из внешней обработки или расширения.
СпособКогда выбиратьРиски
Штатная формаРегистр открыт для пользователя в интерфейсеМинимальные
«Все функции»Независимый регистр, штатной формы нетОбход части логики конфигурации
Перепроведение документаПодчинённый регистр, ошибка в документеИзменятся и другие движения документа
Ручная корректировкаНужна запись, которую документ сам не формируетПерепроведение сотрёт правку
КодМассовая правка, сотни строкОшибка в отборе затирает лишнее

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

Включите команду «Все функции»

В интерфейсе «Такси» эта команда по умолчанию скрыта.

  1. Нажмите кнопку главного меню (три полоски в левом верхнем углу).
  2. Откройте Сервис → Параметры.
  3. Установите флажок «Отображать команду “Все функции”» и нажмите «Применить».
  4. Снова откройте главное меню: в нём появится пункт «Все функции».

Найдите регистр и откройте запись

  1. Откройте Главное меню → Все функции.
  2. Разверните ветку «Регистры сведений».
  3. Найдите регистр по названию. Строка поиска над деревом ускоряет дело, если регистров сотни.
  4. Двойным щелчком откройте форму списка регистра.
  5. Отберите нужные строки: через меню «Ещё» в командной панели списка задайте отбор по колонке или воспользуйтесь строкой поиска. Для периодического регистра удобно отсортировать по периоду.
  6. Дважды щёлкните запись — откроется форма записи.

Измените значения и запишите

  1. Поменяйте ресурс или реквизит.
  2. Если меняете измерение или период, помните: это уже другой ключ. Платформа заменит старую запись новой, но если запись с таким ключом уже есть, запись не пройдёт.
  3. Нажмите «Записать и закрыть».
  4. Проверьте результат в списке. Для периодического регистра откройте документ или отчёт, который берёт значение на дату, и убедитесь, что подтянулось новое.

Форма списка через «Все функции» — универсальная форма платформы. Обработчики формы конфигурации в ней не работают. Если конфигурация пересчитывает что-то при изменении значения в своей форме, в универсальной этого не случится.

Правка подчинённого регистра через документ

Если регистр подчинён регистратору, в его форме списка видна колонка «Регистратор». Изменить строку напрямую там нельзя: записи принадлежат документу.

  1. Откройте документ из колонки «Регистратор».
  2. Исправьте реквизит, из которого берётся неверное значение.
  3. Проведите документ. Движения сформируются заново, старые удалятся.

Если документ не формирует нужную запись сам, используйте ручную корректировку. В БП 3.0 это так:

  1. В форме проведённого документа нажмите кнопку «ДтКт» (показать проводки и другие движения).
  2. Установите флажок «Ручная корректировка (разрешает редактирование движений документа)».
  3. Перейдите на вкладку нужного регистра и исправьте строку.
  4. Нажмите «Записать и закрыть».

Ручную корректировку сотрёт следующее перепроведение документа, если снять флажок. Пока флажок стоит, документ не пересчитывает движения автоматически. Это нужно помнить при закрытии месяца и групповом перепроведении.

Программное изменение записей: примеры кода

Код запускают во внешней обработке (.epf, открывается через Файл → Открыть) или в расширении конфигурации. Работа с регистром идёт на сервере, поэтому процедуры помечайте &НаСервере или выносите в общий серверный модуль. Ниже вместо ЦеныПоставщика подставьте имя своего регистра и свои поля.

Одна запись: менеджер записи

Менеджер записи подходит для независимого регистра, когда известен полный ключ.

&НаСервере
Процедура ИзменитьЦенуНаСервере(Номенклатура, Поставщик, ДатаЦены, НоваяЦена)

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

	Если МенеджерЗаписи.Выбран() Тогда
		МенеджерЗаписи.Цена = НоваяЦена;
		МенеджерЗаписи.Записать();
	Иначе
		Сообщить("Запись с таким ключом не найдена");
	КонецЕсли;

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

Прочитать() ищет запись по заполненному ключу. Выбран() возвращает Истина, если она нашлась. Без этой проверки Записать() молча создаст новую запись вместо правки.

Группа записей: набор записей с отбором

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

&НаСервере
Процедура ПоднятьЦеныДокументаНаСервере(ДокументСсылка)

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

	Для Каждого Запись Из Набор Цикл
		Запись.Цена = Окр(Запись.Цена * 1.1, 2);
	КонецЦикла;

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

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

Для независимого регистра отбор ставят по измерениям или по периоду: Набор.Отбор.Номенклатура.Установить(Номенклатура). При Записать() с параметром по умолчанию (Замещение = Истина) набор целиком заменяет все строки под отбором.

Набор без отбора при записи заменит весь регистр. Пустой набор без отбора, записанный с замещением, удалит все записи регистра. Перед запуском такой обработки сделайте резервную копию базы и проверьте отбор на копии.

Удаление записи

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

Смена ключа: удалить и записать заново

Если нужно перенести значение на другую дату или другую номенклатуру, надёжнее сделать два явных шага в одной транзакции: удалить старую запись и записать новую. Так видно, что именно произошло, и не возникает вопроса, куда делась старая строка.

Ошибки при изменении записей и как их обойти

Диагностика: выберите симптом

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

Если строк тысячи, время правки зависит от того, как написан код.

  • 📦 Пишите наборами, а не по одной записи. Каждый Записать() менеджера — отдельное обращение к базе. Один набор на 1000 строк работает заметно быстрее тысячи менеджеров.
  • 🔍 Сначала запрос, потом запись. Выберите нужные ключи запросом с условием, а набор формируйте только для них. Перебирать весь регистр в цикле не нужно.
  • 🧭 Отбор по первому измерению. У измерений есть свойство «Основной отбор». Отбор по таким измерениям и по регистратору обрабатывается эффективно.
  • 🔒 Управляемая блокировка перед чтением. В транзакции заблокируйте изменяемый участок, чтобы между чтением и записью никто не вмешался.
  • 🌙 Время запуска. Массовую правку в клиент-серверной базе запускайте, когда пользователей нет: длинная транзакция держит блокировки и мешает работе.

Шаблон с блокировкой и транзакцией:

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

НачатьТранзакцию();
Попытка
	Блокировка.Заблокировать();

	Набор = РегистрыСведений.ЦеныПоставщика.СоздатьНаборЗаписей();
	Набор.Отбор.Поставщик.Установить(Поставщик);
	Набор.Прочитать();
	Для Каждого Запись Из Набор Цикл
		Запись.Цена = Окр(Запись.Цена * 1.05, 2);
	КонецЦикла;
	Набор.Записать();

	ЗафиксироватьТранзакцию();
Исключение
	ОтменитьТранзакцию();
	ВызватьИсключение;
КонецПопытки;

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

Про ОбменДанными.Загрузка

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

Как не испортить данные при правке регистра

Перед правкой регистра сведений
Выполнено: 0 / 6

Несколько правил, которые экономят откаты:

  • 🧾 Фиксируйте изменения. Если в конфигурации включена история изменений или журнал регистрации, запишите дату и пользователя правки. Через полгода вопрос «кто поменял цену» возникнет обязательно.
  • 🧪 Обработку сначала на копии. Выгрузите базу в .dt или скопируйте каталог файловой базы, прогоните код там, сравните результат.
  • 📆 Не правьте прошлое без нужды. В периодических регистрах изменение старой записи меняет значения во всех документах, которые берут его на дату. Для учётных данных это может изменить уже сданную отчётность.
  • 🙅 Не дублируйте логику документа. Если запись формирует документ, правьте документ. Ручная правка подчинённого регистра — исключение, а не способ работы.

Частые вопросы

Можно ли изменить запись регистра сведений в конфигураторе?
Нет. Конфигуратор меняет структуру регистра, а не данные. Записи правят в режиме 1С:Предприятие: через формы, «Все функции» или код во внешней обработке.
Почему после записи значение не поменялось в документе?
У периодического регистра документ берёт значение на свою дату. Если вы добавили запись с более поздней датой, старые документы её не увидят. Проверьте период записи.
Чем менеджер записи отличается от набора записей?
Менеджер работает с одной записью по полному ключу. Набор — с группой строк под отбором и при записи замещает их все. Для подчинённых регистров подходит только набор.
Как найти, какой регистр хранит нужное значение?
Откройте Все функции → Регистры сведений и просмотрите названия. Точнее — найти в конфигураторе реквизит формы, который выводит значение, и посмотреть, откуда он заполняется.
Отразится ли изменение записи в журнале регистрации?
Да, если журнал включён на уровне, который записывает изменения данных. Событие изменения регистра попадёт туда вместе с пользователем и временем.