Перезапись записей регистра в 1С: интерфейс, перепроведение и код

· 9 мин

Содержание

Перезаписать регистр сведений в 1С 8.3 можно тремя путями. Независимый регистр правят прямо в списке через меню «Все функции». Регистр, подчинённый документам, перезаписывают перепроведением этих документов. Массовые правки делают кодом: набор записей с отбором и метод Записать(), который по умолчанию заменяет старые записи новыми.

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

Что значит «перезаписать регистр» и какие бывают регистры

В 1С записи регистров хранятся не по одной, а наборами. Набор определяется отбором: например, все записи одного документа-регистратора или все записи по одному контрагенту на одну дату. Когда программа записывает набор, она по умолчанию удаляет все старые записи, попадающие под отбор, и записывает новые. Это и есть перезапись.

Отсюда главное правило: набор без отбора при записи заменяет весь регистр целиком. Пустой набор без отбора стирает регистр полностью.

Виды регистров в конфигурации:

  • 📘 Регистр сведений — хранит значения по измерениям: курсы, цены, настройки, сведения о сотрудниках. Бывает периодическим (с полем «Период») и непериодическим.
  • 📦 Регистр накопления — остатки и обороты: товары на складах, взаиморасчёты.
  • 📒 Регистр бухгалтерии — проводки по плану счетов.
  • 🧮 Регистр расчёта — начисления в зарплатных конфигурациях.

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

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

Режим записи видно в Конфигураторе: откройте свойства регистра на вкладке «Данные», поле «Режим записи». В пользовательском режиме проще проверить на практике: у подчинённого регистра в списке есть колонка «Регистратор», а ввести новую запись вручную нельзя.

Ручная правка и очистка записей в пользовательском режиме

Для небольших правок код не нужен. Открыть любой регистр можно через меню «Все функции».

Как включить «Все функции»

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

В типовых конфигурациях на БСП последних релизов есть альтернатива: Администрирование → Обслуживание → Функции для технического специалиста. Там то же дерево объектов.

Что можно сделать в списке

  • ✏️ Изменить запись. Откройте её двойным щелчком, поправьте значение, нажмите «Записать и закрыть». Старая запись заменится новой с теми же измерениями.
  • ➕ Добавить запись кнопкой «Создать». Если запись с такими же измерениями и периодом уже есть, программа откажет в записи: ключ должен быть уникальным.
  • 🗑️ Удалить записи. Выделите строки (Shift или Ctrl + щелчок) и нажмите Delete. В отличие от справочников, записи регистра удаляются сразу, без пометки.

Удаление записей регистра сведений не попадает в «Удаление помеченных объектов» и не отменяется. Выгрузите базу перед массовым удалением.

Периодический регистр: исправить или добавить новую запись

У периодического регистра сведений есть два разных сценария, и их часто путают.

  • 🕓 Значение было ошибочным с самого начала. Например, цену ввели с опечаткой. Тогда правят существующую запись: дата остаётся прежней, меняется только значение. Документы, проведённые после этой даты, при необходимости перепроводят.
  • 📅 Значение поменялось с какой-то даты. Например, новая цена действует с 1-го числа. Старую запись не трогают: создают новую с новой датой. Тогда история сохраняется, а документы прошлых периодов продолжают брать старое значение.

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

Подчинённый регистр: перепроведение

Записи подчинённого регистра в списке доступны только для просмотра. Правильный путь — исправить документ и провести его заново. Если ошибка затронула сотни документов, используйте групповое перепроведение. В Бухгалтерии 3.0 оно находится в Администрирование → Обслуживание → Корректировка данных → Групповое перепроведение документов.

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

Конфигуратор: что в нём можно и чего нельзя

В Конфигураторе данные регистров не редактируются: там нет списка записей. Он нужен для трёх административных задач.

1. Резервная копия перед правкой

Администрирование → Выгрузить информационную базу сохраняет файл .dt. Для этого нужен монопольный доступ: попросите пользователей выйти из базы. Для клиент-серверной базы копию можно сделать и средствами СУБД.

2. Тестирование и исправление

Администрирование → Тестирование и исправление — штатная утилита платформы. Для регистров важны флажки:

  • 🔍 Проверка логической целостности информационной базы — находит записи, ссылающиеся на несуществующие объекты.
  • 🔁 Пересчёт итогов — пересчитывает таблицы итогов регистров накопления и бухгалтерии.
  • 🧱 Реструктуризация таблиц информационной базы — пересобирает таблицы.

Утилита тоже требует монопольного доступа. Запускайте её только после выгрузки .dt: режим «Исправление» может удалить битые записи.

3. Создание внешней обработки

В Конфигураторе пишут обработку для массовой перезаписи: Файл → Новый → Внешняя обработка. О ней — в разделе про автоматизацию.

Консоль запросов: найти записи, но не изменить

Язык запросов 1С умеет только читать данные. Конструкций UPDATE или DELETE, как в SQL, в нём нет. Поэтому консоль запросов — инструмент поиска: она показывает, какие записи надо перезаписать.

Пример запроса, который ищет записи регистра сведений с ошибочным значением ресурса:

ВЫБРАТЬ
    Рег.Период КАК Период,
    Рег.Контрагент КАК Контрагент,
    Рег.Значение КАК Значение
ИЗ
    РегистрСведений.ИмяРегистра КАК Рег
ГДЕ
    Рег.Значение = &СтароеЗначение

Для подчинённого регистра добавьте в выборку поле Регистратор — получите список документов для перепроведения.

Чтобы изменить найденное, нужен код на встроенном языке. Его выполняют во внешней обработке или в обработке для произвольного кода. Такие обработки распространяются как внешние файлы .epf.

Прямые UPDATE в базе SQL Server или PostgreSQL в обход платформы нарушают лицензионные условия 1С и легко ломают ссылочную целостность. Работайте только через объекты платформы.

Перезапись кодом: набор записей и менеджер записи

Это главный инструмент для массовой правки. Есть два объекта.

Набор записей

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

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

Для Каждого Запись Из Набор Цикл
    Запись.Значение = НовоеЗначение;
КонецЦикла;

Набор.Записать(); // Замещение = Истина по умолчанию

Для подчинённого регистра отбор ставят по регистратору:

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

Как ведёт себя метод Записать():

ВызовЧто произойдёт
Набор.Записать() или Набор.Записать(Истина)Старые записи по отбору удаляются, записываются строки набора
Набор.Записать(Ложь)Строки добавляются к существующим; для регистра сведений при совпадении ключа будет ошибка
Набор.Очистить(); Набор.Записать() с отборомУдаляются все записи, попавшие под отбор
То же без отбораУдаляется весь регистр

Менеджер записи

Удобен для одной записи независимого регистра сведений. У подчинённых регистров менеджера записи нет.

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

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

Внешняя обработка для массовой перезаписи

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

Как собрать

  1. В Конфигураторе: Файл → Новый → Внешняя обработка.
  2. Добавьте реквизиты СтароеЗначение и НовоеЗначение нужного типа.
  3. Создайте форму, перетащите на неё реквизиты, добавьте команду «Заменить».
  4. В модуле формы напишите обработчик команды и серверную процедуру.
&НаКлиенте
Процедура Заменить(Команда)
    ЗаменитьНаСервере();
    Сообщить("Готово");
КонецПроцедуры

&НаСервере
Процедура ЗаменитьНаСервере()
    Запрос = Новый Запрос(
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    Рег.Контрагент КАК Контрагент
    |ИЗ
    |    РегистрСведений.ИмяРегистра КАК Рег
    |ГДЕ
    |    Рег.Значение = &СтароеЗначение");
    Запрос.УстановитьПараметр("СтароеЗначение", Объект.СтароеЗначение);
    Выборка = Запрос.Выполнить().Выбрать();

    НачатьТранзакцию();
    Попытка
        Пока Выборка.Следующий() Цикл
            Набор = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей();
            Набор.Отбор.Контрагент.Установить(Выборка.Контрагент);
            Набор.Прочитать();
            Для Каждого Запись Из Набор Цикл
                Если Запись.Значение = Объект.СтароеЗначение Тогда
                    Запись.Значение = Объект.НовоеЗначение;
                КонецЕсли;
            КонецЦикла;
            Набор.Записать();
        КонецЦикла;
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение;
    КонецПопытки;
КонецПроцедуры

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

На десятках тысяч записей одна транзакция держит блокировки долго и мешает пользователям. Разбейте работу на порции по 500–1000 наборов, каждую в своей транзакции, и запускайте вечером.

Как запустить

В пользовательском режиме: главное меню → Файл → Открыть, выберите файл .epf. Платформа покажет предупреждение безопасности, его нужно подтвердить. Пользователю нужны права на интерактивное открытие внешних обработок — обычно это администратор.

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

Перед Набор.Записать() можно установить Набор.ОбменДанными.Загрузка = Истина. Тогда не выполнятся обработчики ПередЗаписью и ПриЗаписи в модуле набора записей. Это ускоряет запись и обходит проверки.

Обратная сторона: пропускаются и те действия, которые конфигурация делает при записи. Например, обновление связанных данных. Используйте флаг, только если точно знаете, что делает модуль этого регистра.

Какой способ перезаписи вам подходит?

Проверка и восстановление данных после перезаписи

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

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

Если что-то пошло не так, вернуть состояние можно только из резервной копии. Загрузка .dt заменяет всю базу, поэтому изменения других пользователей после выгрузки потеряются. Потому массовые правки делают в нерабочее время.

Перед массовой перезаписью регистра
Выполнено: 0 / 5

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

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