Правка записей регистра сведений в 1С 8.3: вручную, через документ и кодом
Содержание
Чтобы изменить запись в регистре сведений 1С, откройте регистр через Главное меню → Все функции → Регистры сведений, дважды щёлкните нужную строку, поправьте значение и нажмите «Записать и закрыть». Так правятся независимые регистры. Если регистр подчинён регистратору, запись меняют через документ, который её создал: исправляют сам документ и перепроводят его или включают ручную корректировку движений.
Выбор способа зависит от двух вещей: подчинён ли регистр документу и сколько записей нужно поменять. Одну-две строки удобнее исправить мышкой. Сотни строк — набором записей во внешней обработке. Ниже всё по порядку, с кодом, который можно взять за основу.
Что хранит регистр сведений и почему записи приходится править
Регистр сведений — это таблица значений с ключом. Ключ образуют измерения, а у периодического регистра ещё и период. Ресурсы — это сами хранимые значения. Пример: в регистре цен измерения «Номенклатура» и «Вид цены», период — дата установки, ресурс — «Цена».
Запись однозначно определяется ключом. Две записи с одинаковым периодом и одинаковыми измерениями в регистре сведений быть не может — платформа этого не допустит.
Править записи приходится в таких случаях:
- 💰 ошибка в значении ресурса: неверная цена, курс, ставка, процент;
- 📅 значение задано не с той даты, и срез последних отдаёт не то, что нужно;
- 🔗 запись ссылается на удалённый или неверный элемент справочника;
- 🔄 после загрузки или обмена пришли дубли или мусорные строки;
- 🛠️ настройку конфигурации хранят в регистре, а штатной формы для её правки нет.
Перед правкой определите режим записи регистра. Это видно в конфигураторе на вкладке «Данные» или «Основные» свойств объекта: «Независимый» или «Подчинение регистратору». От этого зависит весь дальнейший путь.
| Тип регистра | Кто создаёт записи | Как правильно менять |
|---|---|---|
| Независимый, непериодический | Пользователь или код | Вручную в форме списка или менеджером записи |
| Независимый, периодический | Пользователь или код | Новая запись на новую дату или правка существующей |
| Подчинённый регистратору | Документ при проведении | Исправить документ и перепровести; ручная корректировка движений |
У периодического регистра часто правильнее не менять старую запись, а добавить новую с датой, с которой значение действует. Тогда история сохранится, а прошлые документы, которые берут значение «на дату», не изменятся задним числом.
Пять способов изменить запись в регистре сведений
Способов пять. Они различаются уровнем доступа и тем, сработают ли проверки конфигурации.
- Штатная форма конфигурации. Многие регистры редактируются из карточек: учётная политика — из карточки организации, курсы — из справочника валют. Это самый безопасный путь: работают все проверки и обработчики формы.
- Форма списка через «Все функции». Универсальный путь для независимых регистров. Нужны права на изменение регистра.
- Документ-регистратор. Для подчинённых регистров: правите документ, проводите заново, движения пересоздаются.
- Ручная корректировка движений документа. Если перепроведение не даёт нужной записи, движения правят прямо в документе.
- Программное изменение. Менеджер записи для одной строки, набор записей для группы. Запускается из внешней обработки или расширения.
| Способ | Когда выбирать | Риски |
|---|---|---|
| Штатная форма | Регистр открыт для пользователя в интерфейсе | Минимальные |
| «Все функции» | Независимый регистр, штатной формы нет | Обход части логики конфигурации |
| Перепроведение документа | Подчинённый регистр, ошибка в документе | Изменятся и другие движения документа |
| Ручная корректировка | Нужна запись, которую документ сам не формирует | Перепроведение сотрёт правку |
| Код | Массовая правка, сотни строк | Ошибка в отборе затирает лишнее |
Как изменить запись в регистре сведений вручную
Включите команду «Все функции»
В интерфейсе «Такси» эта команда по умолчанию скрыта.
- Нажмите кнопку главного меню (три полоски в левом верхнем углу).
- Откройте
Сервис → Параметры. - Установите флажок «Отображать команду “Все функции”» и нажмите «Применить».
- Снова откройте главное меню: в нём появится пункт «Все функции».
Найдите регистр и откройте запись
- Откройте
Главное меню → Все функции. - Разверните ветку «Регистры сведений».
- Найдите регистр по названию. Строка поиска над деревом ускоряет дело, если регистров сотни.
- Двойным щелчком откройте форму списка регистра.
- Отберите нужные строки: через меню «Ещё» в командной панели списка задайте отбор по колонке или воспользуйтесь строкой поиска. Для периодического регистра удобно отсортировать по периоду.
- Дважды щёлкните запись — откроется форма записи.
Измените значения и запишите
- Поменяйте ресурс или реквизит.
- Если меняете измерение или период, помните: это уже другой ключ. Платформа заменит старую запись новой, но если запись с таким ключом уже есть, запись не пройдёт.
- Нажмите «Записать и закрыть».
- Проверьте результат в списке. Для периодического регистра откройте документ или отчёт, который берёт значение на дату, и убедитесь, что подтянулось новое.
Форма списка через «Все функции» — универсальная форма платформы. Обработчики формы конфигурации в ней не работают. Если конфигурация пересчитывает что-то при изменении значения в своей форме, в универсальной этого не случится.
Правка подчинённого регистра через документ
Если регистр подчинён регистратору, в его форме списка видна колонка «Регистратор». Изменить строку напрямую там нельзя: записи принадлежат документу.
- Откройте документ из колонки «Регистратор».
- Исправьте реквизит, из которого берётся неверное значение.
- Проведите документ. Движения сформируются заново, старые удалятся.
Если документ не формирует нужную запись сам, используйте ручную корректировку. В БП 3.0 это так:
- В форме проведённого документа нажмите кнопку «ДтКт» (показать проводки и другие движения).
- Установите флажок «Ручная корректировка (разрешает редактирование движений документа)».
- Перейдите на вкладку нужного регистра и исправьте строку.
- Нажмите «Записать и закрыть».
Ручную корректировку сотрёт следующее перепроведение документа, если снять флажок. Пока флажок стоит, документ не пересчитывает движения автоматически. Это нужно помнить при закрытии месяца и групповом перепроведении.
Программное изменение записей: примеры кода
Код запускают во внешней обработке (.epf, открывается через Файл → Открыть) или в расширении конфигурации. Работа с регистром идёт на сервере, поэтому процедуры помечайте &НаСервере или выносите в общий серверный модуль. Ниже вместо ЦеныПоставщика подставьте имя своего регистра и свои поля.
Одна запись: менеджер записи
Менеджер записи подходит для независимого регистра, когда известен полный ключ.
&НаСервере
Процедура ИзменитьЦенуНаСервере(Номенклатура, Поставщик, ДатаЦены, НоваяЦена)
МенеджерЗаписи = РегистрыСведений.ЦеныПоставщика.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = ДатаЦены;
МенеджерЗаписи.Номенклатура = Номенклатура;
МенеджерЗаписи.Поставщик = Поставщик;
МенеджерЗаписи.Прочитать();
Если МенеджерЗаписи.Выбран() Тогда
МенеджерЗаписи.Цена = НоваяЦена;
МенеджерЗаписи.Записать();
Иначе
Сообщить("Запись с таким ключом не найдена");
КонецЕсли;
КонецПроцедуры
Прочитать() ищет запись по заполненному ключу. Выбран() возвращает Истина, если она нашлась. Без этой проверки Записать() молча создаст новую запись вместо правки.
Группа записей: набор записей с отбором
Набор записей читает и пишет все строки, попавшие под отбор. Это основной инструмент для массовой правки и единственный — для подчинённых регистров.
&НаСервере
Процедура ПоднятьЦеныДокументаНаСервере(ДокументСсылка)
Набор = РегистрыСведений.ЦеныПоставщика.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
Запись.Цена = Окр(Запись.Цена * 1.1, 2);
КонецЦикла;
Набор.Записать();
КонецПроцедуры
Для независимого регистра отбор ставят по измерениям или по периоду: Набор.Отбор.Номенклатура.Установить(Номенклатура). При Записать() с параметром по умолчанию (Замещение = Истина) набор целиком заменяет все строки под отбором.
Набор без отбора при записи заменит весь регистр. Пустой набор без отбора, записанный с замещением, удалит все записи регистра. Перед запуском такой обработки сделайте резервную копию базы и проверьте отбор на копии.
Удаление записи
Чтобы удалить одну запись, прочитайте её менеджером записи и вызовите МенеджерЗаписи.Удалить(). Чтобы удалить группу, установите отбор, не читайте набор и запишите пустым: под отбором строк не останется.
Смена ключа: удалить и записать заново
Если нужно перенести значение на другую дату или другую номенклатуру, надёжнее сделать два явных шага в одной транзакции: удалить старую запись и записать новую. Так видно, что именно произошло, и не возникает вопроса, куда делась старая строка.
Ошибки при изменении записей и как их обойти
Как ускорить массовую правку регистров сведений
Если строк тысячи, время правки зависит от того, как написан код.
- 📦 Пишите наборами, а не по одной записи. Каждый
Записать()менеджера — отдельное обращение к базе. Один набор на 1000 строк работает заметно быстрее тысячи менеджеров. - 🔍 Сначала запрос, потом запись. Выберите нужные ключи запросом с условием, а набор формируйте только для них. Перебирать весь регистр в цикле не нужно.
- 🧭 Отбор по первому измерению. У измерений есть свойство «Основной отбор». Отбор по таким измерениям и по регистратору обрабатывается эффективно.
- 🔒 Управляемая блокировка перед чтением. В транзакции заблокируйте изменяемый участок, чтобы между чтением и записью никто не вмешался.
- 🌙 Время запуска. Массовую правку в клиент-серверной базе запускайте, когда пользователей нет: длинная транзакция держит блокировки и мешает работе.
Шаблон с блокировкой и транзакцией:
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("РегистрСведений.ЦеныПоставщика");
ЭлементБлокировки.УстановитьЗначение("Поставщик", Поставщик);
ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
НачатьТранзакцию();
Попытка
Блокировка.Заблокировать();
Набор = РегистрыСведений.ЦеныПоставщика.СоздатьНаборЗаписей();
Набор.Отбор.Поставщик.Установить(Поставщик);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
Запись.Цена = Окр(Запись.Цена * 1.05, 2);
КонецЦикла;
Набор.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
У этого примера есть ограничение: отбор по измерению «Поставщик» работает в наборе, только если это измерение входит в ключ регистра. Для периодического регистра добавьте отбор по периоду, иначе изменятся цены на все даты.
Про ОбменДанными.Загрузка
Установка Набор.ОбменДанными.Загрузка = Истина отключает обработчики ПередЗаписью и ПриЗаписи набора. Это ускоряет загрузку, но выключает и проверки конфигурации. Используйте только когда точно знаете, что обработчики в вашей задаче не нужны: при переносе данных, при исправлении заведомо корректными значениями.
Как не испортить данные при правке регистра
Несколько правил, которые экономят откаты:
- 🧾 Фиксируйте изменения. Если в конфигурации включена история изменений или журнал регистрации, запишите дату и пользователя правки. Через полгода вопрос «кто поменял цену» возникнет обязательно.
- 🧪 Обработку сначала на копии. Выгрузите базу в
.dtили скопируйте каталог файловой базы, прогоните код там, сравните результат. - 📆 Не правьте прошлое без нужды. В периодических регистрах изменение старой записи меняет значения во всех документах, которые берут его на дату. Для учётных данных это может изменить уже сданную отчётность.
- 🙅 Не дублируйте логику документа. Если запись формирует документ, правьте документ. Ручная правка подчинённого регистра — исключение, а не способ работы.
Частые вопросы
Можно ли изменить запись регистра сведений в конфигураторе?
Почему после записи значение не поменялось в документе?
Чем менеджер записи отличается от набора записей?
Как найти, какой регистр хранит нужное значение?
Все функции → Регистры сведений и просмотрите названия. Точнее — найти в конфигураторе реквизит формы, который выводит значение, и посмотреть, откуда он заполняется.