Перезапись записей регистра в 1С: интерфейс, перепроведение и код
Содержание
Перезаписать регистр сведений
в 1С 8.3 можно тремя путями. Независимый регистр правят прямо в списке через меню «Все функции». Регистр, подчинённый документам, перезаписывают перепроведением этих документов. Массовые правки делают кодом: набор записей с отбором и метод Записать(), который по умолчанию заменяет старые записи новыми.
Выбор зависит от двух вещей: подчинён ли регистр регистратору и сколько записей нужно поменять. Ниже — как это определить и что делать в каждом случае, включая проверку данных после правки.
Что значит «перезаписать регистр» и какие бывают регистры
В 1С записи регистров хранятся не по одной, а наборами. Набор определяется отбором: например, все записи одного документа-регистратора или все записи по одному контрагенту на одну дату. Когда программа записывает набор, она по умолчанию удаляет все старые записи, попадающие под отбор, и записывает новые. Это и есть перезапись.
Отсюда главное правило: набор без отбора при записи заменяет весь регистр целиком. Пустой набор без отбора стирает регистр полностью.
Виды регистров в конфигурации:
- 📘 Регистр сведений — хранит значения по измерениям: курсы, цены, настройки, сведения о сотрудниках. Бывает периодическим (с полем «Период») и непериодическим.
- 📦 Регистр накопления — остатки и обороты: товары на складах, взаиморасчёты.
- 📒 Регистр бухгалтерии — проводки по плану счетов.
- 🧮 Регистр расчёта — начисления в зарплатных конфигурациях.
Регистр сведений может быть независимым (записи вводят пользователи или обработки) или подчинённым регистратору (записи создаёт документ при проведении). Регистры накопления, бухгалтерии и расчёта всегда подчинены регистратору.
| Режим записи | Где правят | Как перезаписать |
|---|---|---|
| Независимый регистр сведений | Список регистра, обработки, код | Вручную в списке или Записать() набора с отбором по измерениям |
| Подчинён регистратору | Только через документ | Исправить документ и перепровести; кодом — набор с отбором по регистратору |
Режим записи видно в Конфигураторе: откройте свойства регистра на вкладке «Данные», поле «Режим записи». В пользовательском режиме проще проверить на практике: у подчинённого регистра в списке есть колонка «Регистратор», а ввести новую запись вручную нельзя.
Ручная правка и очистка записей в пользовательском режиме
Для небольших правок код не нужен. Открыть любой регистр можно через меню «Все функции».
Как включить «Все функции»
- Откройте главное меню (кнопка с тремя полосками в левом верхнем углу).
- Выберите
Сервис → Параметры. - Установите флажок «Отображать команду “Все функции”» и нажмите «Применить».
- В главном меню появится пункт «Все функции». В нём раскройте ветку «Регистры сведений» и найдите нужный регистр.
В типовых конфигурациях на БСП последних релизов есть альтернатива: Администрирование → Обслуживание → Функции для технического специалиста. Там то же дерево объектов.
Что можно сделать в списке
- ✏️ Изменить запись. Откройте её двойным щелчком, поправьте значение, нажмите «Записать и закрыть». Старая запись заменится новой с теми же измерениями.
- ➕ Добавить запись кнопкой «Создать». Если запись с такими же измерениями и периодом уже есть, программа откажет в записи: ключ должен быть уникальным.
- 🗑️ Удалить записи. Выделите строки (Shift или Ctrl + щелчок) и нажмите
Delete. В отличие от справочников, записи регистра удаляются сразу, без пометки.
Удаление записей регистра сведений не попадает в «Удаление помеченных объектов» и не отменяется. Выгрузите базу перед массовым удалением.
Периодический регистр: исправить или добавить новую запись
У периодического регистра сведений есть два разных сценария, и их часто путают.
- 🕓 Значение было ошибочным с самого начала. Например, цену ввели с опечаткой. Тогда правят существующую запись: дата остаётся прежней, меняется только значение. Документы, проведённые после этой даты, при необходимости перепроводят.
- 📅 Значение поменялось с какой-то даты. Например, новая цена действует с 1-го числа. Старую запись не трогают: создают новую с новой датой. Тогда история сохраняется, а документы прошлых периодов продолжают брать старое значение.
Если в такой ситуации перезаписать старую запись, все отчёты за прошлые периоды покажут новое значение. Ошибку потом трудно заметить: суммы в уже сданной отчётности перестанут сходиться с базой.
Подчинённый регистр: перепроведение
Записи подчинённого регистра в списке доступны только для просмотра. Правильный путь — исправить документ и провести его заново. Если ошибка затронула сотни документов, используйте групповое перепроведение. В Бухгалтерии 3.0 оно находится в Администрирование → Обслуживание → Корректировка данных → Групповое перепроведение документов.
Перепроведение за период полностью перезаписывает движения выбранных документов. Это самый безопасный способ «перезаписать» регистр накопления или бухгалтерии: все проверки и алгоритмы проведения отработают штатно.
Конфигуратор: что в нём можно и чего нельзя
В Конфигураторе данные регистров не редактируются: там нет списка записей. Он нужен для трёх административных задач.
1. Резервная копия перед правкой
Администрирование → Выгрузить информационную базу сохраняет файл .dt. Для этого нужен монопольный доступ: попросите пользователей выйти из базы. Для клиент-серверной базы копию можно сделать и средствами СУБД.
2. Тестирование и исправление
Администрирование → Тестирование и исправление — штатная утилита платформы. Для регистров важны флажки:
- 🔍 Проверка логической целостности информационной базы — находит записи, ссылающиеся на несуществующие объекты.
- 🔁 Пересчёт итогов — пересчитывает таблицы итогов регистров накопления и бухгалтерии.
- 🧱 Реструктуризация таблиц информационной базы — пересобирает таблицы.
Утилита тоже требует монопольного доступа. Запускайте её только после выгрузки .dt: режим «Исправление» может удалить битые записи.
3. Создание внешней обработки
В Конфигураторе пишут обработку для массовой перезаписи: Файл → Новый → Внешняя обработка. О ней — в разделе про автоматизацию.
Консоль запросов: найти записи, но не изменить
Язык запросов 1С умеет только читать данные. Конструкций UPDATE или DELETE, как в SQL, в нём нет. Поэтому консоль запросов — инструмент поиска: она показывает, какие записи надо перезаписать.
Пример запроса, который ищет записи регистра сведений с ошибочным значением ресурса:
ВЫБРАТЬ
Рег.Период КАК Период,
Рег.Контрагент КАК Контрагент,
Рег.Значение КАК Значение
ИЗ
РегистрСведений.ИмяРегистра КАК Рег
ГДЕ
Рег.Значение = &СтароеЗначение
Для подчинённого регистра добавьте в выборку поле Регистратор — получите список документов для перепроведения.
Чтобы изменить найденное, нужен код на встроенном языке. Его выполняют во внешней обработке или в обработке для произвольного кода. Такие обработки распространяются как внешние файлы .epf.
Прямые UPDATE в базе SQL Server или PostgreSQL в обход платформы нарушают лицензионные условия 1С и легко ломают ссылочную целостность. Работайте только через объекты платформы.
Перезапись кодом: набор записей и менеджер записи
Это главный инструмент для массовой правки. Есть два объекта.
Набор записей
Подходит для любого регистра. Алгоритм всегда одинаковый: создать набор, установить отбор, прочитать, изменить, записать.
Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.Контрагент.Установить(Контрагент);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
Запись.Значение = НовоеЗначение;
КонецЦикла;
Набор.Записать(); // Замещение = Истина по умолчанию
Для подчинённого регистра отбор ставят по регистратору:
Набор = РегистрыНакопления.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Прочитать();
// правка строк набора
Набор.Записать();
Как ведёт себя метод Записать():
| Вызов | Что произойдёт |
|---|---|
Набор.Записать() или Набор.Записать(Истина) | Старые записи по отбору удаляются, записываются строки набора |
Набор.Записать(Ложь) | Строки добавляются к существующим; для регистра сведений при совпадении ключа будет ошибка |
Набор.Очистить(); Набор.Записать() с отбором | Удаляются все записи, попавшие под отбор |
| То же без отбора | Удаляется весь регистр |
Менеджер записи
Удобен для одной записи независимого регистра сведений. У подчинённых регистров менеджера записи нет.
МЗ = РегистрыСведений.ИмяРегистра.СоздатьМенеджерЗаписи();
МЗ.Период = Дата;
МЗ.Контрагент = Контрагент;
МЗ.Прочитать();
Если МЗ.Выбран() Тогда
МЗ.Значение = НовоеЗначение;
МЗ.Записать(); // Замещение = Истина
КонецЕсли;
Проверка Выбран() нужна, чтобы не создать новую запись там, где старой не было.
Внешняя обработка для массовой перезаписи
Когда нужно поменять тысячи записей, соберите обработку один раз и запускайте её из пользовательского режима.
Как собрать
- В Конфигураторе:
Файл → Новый → Внешняя обработка. - Добавьте реквизиты
СтароеЗначениеиНовоеЗначениенужного типа. - Создайте форму, перетащите на неё реквизиты, добавьте команду «Заменить».
- В модуле формы напишите обработчик команды и серверную процедуру.
&НаКлиенте
Процедура Заменить(Команда)
ЗаменитьНаСервере();
Сообщить("Готово");
КонецПроцедуры
&НаСервере
Процедура ЗаменитьНаСервере()
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Рег.Контрагент КАК Контрагент
|ИЗ
| РегистрСведений.ИмяРегистра КАК Рег
|ГДЕ
| Рег.Значение = &СтароеЗначение");
Запрос.УстановитьПараметр("СтароеЗначение", Объект.СтароеЗначение);
Выборка = Запрос.Выполнить().Выбрать();
НачатьТранзакцию();
Попытка
Пока Выборка.Следующий() Цикл
Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
Набор.Отбор.Контрагент.Установить(Выборка.Контрагент);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
Если Запись.Значение = Объект.СтароеЗначение Тогда
Запись.Значение = Объект.НовоеЗначение;
КонецЕсли;
КонецЦикла;
Набор.Записать();
КонецЦикла;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
Набор читается целиком по измерению, а меняются только нужные строки. Остальные записи того же контрагента перезапишутся без изменений и не потеряются. Транзакция гарантирует, что при ошибке база не останется в наполовину исправленном виде.
На десятках тысяч записей одна транзакция держит блокировки долго и мешает пользователям. Разбейте работу на порции по 500–1000 наборов, каждую в своей транзакции, и запускайте вечером.
Как запустить
В пользовательском режиме: главное меню → Файл → Открыть, выберите файл .epf. Платформа покажет предупреждение безопасности, его нужно подтвердить. Пользователю нужны права на интерактивное открытие внешних обработок — обычно это администратор.
Флаг ОбменДанными.Загрузка
Перед Набор.Записать() можно установить Набор.ОбменДанными.Загрузка = Истина. Тогда не выполнятся обработчики ПередЗаписью и ПриЗаписи в модуле набора записей. Это ускоряет запись и обходит проверки.
Обратная сторона: пропускаются и те действия, которые конфигурация делает при записи. Например, обновление связанных данных. Используйте флаг, только если точно знаете, что делает модуль этого регистра.
Проверка и восстановление данных после перезаписи
После массовой правки убедитесь, что данные согласованы.
- Повторите поисковый запрос. Записей со старым значением быть не должно. Посчитайте количество до и после: общее число записей не должно уменьшиться, если вы ничего не удаляли.
- Сверьте отчёты. Для регистров накопления сформируйте остатки или оборотно-сальдовую ведомость на дату до и после правки. Расхождения должны быть только там, где вы их ждали.
- Пересчитайте итоги. Если правили регистр накопления или бухгалтерии кодом и остатки в отчётах выглядят странно, запустите пересчёт итогов. В пользовательском режиме он есть в «Функциях для технического специалиста» в разделе управления итогами, в Конфигураторе — в «Тестировании и исправлении».
- Перепроведите зависимые документы. Если от регистра зависят расчёты (себестоимость, амортизация, зарплата), перепроведите документы после даты правки и повторите закрытие месяца .
- Проверьте обмены. Изменённые записи регистрируются к выгрузке в узлы обмена. Убедитесь, что в связанную базу не уйдут ошибочные данные, или, наоборот, что исправление туда дойдёт.
Если что-то пошло не так, вернуть состояние можно только из резервной копии. Загрузка .dt заменяет всю базу, поэтому изменения других пользователей после выгрузки потеряются. Потому массовые правки делают в нерабочее время.
Частые вопросы
Можно ли перезаписать регистр без прав администратора?
Почему исправленные вручную движения документа пропали?
Чем перезапись отличается от удаления и создания записей?
Записать() с замещением платформа сама удаляет старые записи по отбору. Но перезапись одним набором выполняется атомарно и быстрее.Нужна ли перезапись после обновления конфигурации?
Где увидеть, кто изменил записи регистра?
Администрирование → Обслуживание → Журнал регистрации, отбор по событию изменения данных и по метаданным регистра.