Работа с регистрами сведений в 1С:Предприятие 8.3 — одна из самых востребованных задач среди разработчиков и администраторов систем. Перезапись данных в регистре может потребоваться при исправлении ошибок, актуализации информации или массовом обновлении записей. Однако неправильные действия чреваты потерей данных, нарушением целостности базы или даже блокировкой работы пользователей.

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

Прежде чем приступить к практическим действиям, важно понять: регистры сведений в 1С 8.3 бывают периодическими и непериодическими, а также могут иметь разные режимы записи (оперативные, неоперативные). От этого зависит выбор метода перезаписи. Если вы работаете с периодическим регистром, где данные привязаны к датам, подход будет иным, чем для непериодического, где хранится актуальное состояние.

📊 Какой тип регистра сведений вы чаще используете?
Периодический
Непериодический
Оба типа примерно одинаково
Не знаю, в чем разница

1. Что такое регистр сведений и когда требуется его перезапись

Регистр сведений в 1С:Предприятие 8.3 — это объект конфигурации, предназначенный для хранения информации, которая может изменяться со временем. В отличие от справочников, где данные структурированы иерархически, регистры оптимизированы для быстрого чтения и записи больших массивов данных. Они широко используются для:

  • 📊 Хранения курсов валют, цен номенклатуры, остатков на складах
  • 📅 Фиксации периодических данных (например, графиков работы сотрудников)
  • 🔧 Настроек системы, которые могут меняться (параметры интеграций, лимиты и т.д.)
  • 📈 Агрегации данных для отчетности (промежуточные расчеты, кэшированные значения)

Перезапись регистра сведений может потребоваться в следующих случаях:

  • 🔄 Массовое обновление данных — например, изменение цен на всю номенклатуру после инфляции или переоценки.
  • 🐞 Исправление ошибок — если в регистр были занесены некорректные данные (например, ошибочный курс валюты на определенную дату).
  • 🔗 Синхронизация с внешними системами — когда нужно привести данные в в соответствие с данными из ERP, CRM или бухгалтерских программ.
  • 📉 Очистка устаревших записей — удаление или архивирование данных за прошедшие периоды для оптимизации производительности.

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

⚠️ Внимание: Если регистр сведений участвует в механизме Планы обмена или используется для Регламентных заданий, его перезапись может нарушить работу этих процессов. Перед массовыми изменениями проверьте зависимости в конфигураторе!

2. Способы перезаписи регистра сведений: сравнение методов

В 1С 8.3 существует несколько способов перезаписи регистра сведений, каждый из которых имеет свои плюсы и минусы. Выбор метода зависит от объема данных, требуемой скорости выполнения и уровня доступа к системе. Рассмотрим основные подходы:

Метод Когда использовать Плюсы Минусы
Ручной ввод в пользовательском режиме Единичные изменения, небольшие объемы данных ✅ Не требует доступа к конфигуратору
✅ Минимальный риск ошибок
❌ Долго для больших массивов
❌ Человеческий фактор
Обработка «Универсальная перезапись» Массовые изменения без программирования ✅ Визуальный интерфейс
✅ Подходит для непериодических регистров
❌ Ограниченная функциональность
❌ Не всегда стабильно работает с периодическими регистрами
Запрос на языке 1С Сложные условия отбора, большие объемы ✅ Гибкость и точность
✅ Можно автоматизировать
❌ Требует знания языка
❌ Риск ошибок в коде
Объектная модель (МенеджерЗаписи) Программная перезапись с контролем ✅ Полный контроль над процессом
✅ Подходит для сложных регистров
❌ Медленнее, чем запрос
❌ Требует транзакции
Внешняя обработка или расширение Регулярные операции, интеграции ✅ Можно доработать под задачи
✅ Повторное использование
❌ Дополнительная поддержка
❌ Возможны конфликты с обновлениями

Для единичных изменений проще всего использовать ручной ввод через форму регистра. Например, если нужно исправить курс доллара на конкретную дату, достаточно открыть регистр КурсыВалют, найти запись и отредактировать её. Однако для массовых операций (например, обновить цены на 10% для 5000 позиций номенклатуры) ручной метод не подходит — здесь потребуется программный подход.

Один из самых универсальных способов — использование запроса на языке 1С. Он позволяет гибко отбирать записи по любым критериям и обновлять их пакетно. Например, следующий запрос обновит все цены в регистре ЦеныНоменклатуры на 5%:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| ЦеныНоменклатуры.Ссылка КАК Ссылка,

| ЦеныНоменклатуры.Цена * 1.05 КАК НоваяЦена

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

|ГДЕ

| ЦеныНоменклатуры.Период = &ТекущаяДата";

Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

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

Запись.Период = ТекущаяДата();

Запись.Ссылка = Выборка.Ссылка;

Запись.Цена = Выборка.НоваяЦена;

Запись.Записать();

КонецЦикла;

⚠️ Внимание: При использовании запросов для массовой перезаписи обязательно заключайте операции в Транзакцию, чтобы избежать частичного обновления данных при сбоях. Также учитывайте, что длительные транзакции могут блокировать работу других пользователей!
💡

Перед массовой перезаписью регистра сделайте резервную копию базы данных или хотя бы экспортируйте данные регистра в файл (через ВыгрузитьДанные()). Это поможет быстро откатиться в случае ошибки.

3. Пошаговая инструкция: перезапись регистра сведений через конфигуратор

Если вам нужно перезаписать регистр сведений программно, самый надежный способ — использовать конфигуратор 1С и встроенный язык. Ниже приведена универсальная инструкция, которая подходит для большинства регистров. Для примера возьмем регистр КурсыВалют, где требуется обновить курс евро на текущую дату.

Открыть конфигуратор в режиме "1С:Предприятие"|Создать резервную копию базы данных|Проверить права доступа (полные права)|Определить точный период записи (для периодических регистров)|Подготовить данные для записи (например, новый курс валюты)-->

Шаг 1. Открытие сеанса для записи

Перезапись регистра должна выполняться в привилегированном режиме, особенно если регистр используется в транзакциях. Откройте конфигуратор, перейдите в меню Файл → Открыть и выберите вашу базу. Затем запустите Отладку (F5) или создайте внешнюю обработку.

Шаг 2. Создание менеджера записи

Для работы с регистром сведений используется объект МенеджерЗаписи. Его можно создать следующим образом:

МенеджерЗаписи = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();

Шаг 3. Установка параметров записи

Для периодического регистра обязательно указываем период (дату), для непериодического этот шаг можно пропустить. Также задаем отбор по измерениям (например, по валюте):

МенеджерЗаписи.Период = ТекущаяДата();

МенеджерЗаписи.Валюта = Справочники.Валюты.НайтиПоНаименованию("Евро");

Шаг 4. Запись новых данных

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

МенеджерЗаписи.Курс = 95.50; // Новый курс евро

МенеджерЗаписи.Записать();

Шаг 5. Проверка результата

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

Запрос = Новый Запрос;

Запрос.Текст = "ВЫБРАТЬ Курс ИЗ РегистрСведений.КурсыВалют ГДЕ Валюта = &Валюта И Период = &Дата";

Запрос.УстановитьПараметр("Валюта", Справочники.Валюты.НайтиПоНаименованию("Евро"));

Запрос.УстановитьПараметр("Дата", ТекущаяДата());

Результат = Запрос.Выполнить().Выбрать();

Если Результат.Следующий() Тогда

Сообщить("Новый курс евро: " + Результат.Курс);

Иначе

Сообщить("Запись не найдена!");

КонецЕсли;

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

МенеджерЗаписи = РегистрыСведений.НастройкиИнтеграции.СоздатьМенеджерЗаписи();

МенеджерЗаписи.Параметр = "Timeout";

МенеджерЗаписи.Значение = 300; // Новое значение таймаута

МенеджерЗаписи.Записать();

Что делать, если запись не обновляется?

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

1. Права доступа — у пользователя должны быть права на запись в регистр.

2. Транзакции — если код выполняется в транзакции, которая не зафиксирована (ЗафиксироватьТранзакцию()), изменения не сохранятся.

3. Блокировки — другой пользователь или процесс может блокировать регистр. Проверьте в Активные пользователи (меню Сервис → Активные пользователи).

4. Период — для периодических регистров убедитесь, что указали корректную дату. Если запись существует на другую дату, она не будет затронута.

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

4. Массовая перезапись регистра сведений с помощью запроса

Когда требуется обновить большое количество записей в регистре (например, скорректировать цены на всю номенклатуру или обновить статусы контрагентов), ручные методы становятся неэффективными. В таких случаях оптимально использовать запрос с конструкцией ОБНОВИТЬ.

Преимущество этого подхода:

  • 🚀 Высокая скорость — запрос выполняется на уровне СУБД, что в десятки раз быстрее, чем поэлементная запись.
  • 🎯 Гибкий отбор — можно обновлять только те записи, которые соответствуют сложным условиям.
  • 🔒 Транзакционность — легко обернуть в транзакцию для отката при ошибках.

Рассмотрим пример: предположим, что в регистре ЦеныНоменклатуры нужно увеличить все цены на 10%, но только для товаров определенной группы (например, «Электроника»).

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ РАЗРЕШЕННЫЕ

| ЦеныНоменклатуры.Ссылка КАК Ссылка,

| ЦеныНоменклатуры.Цена * 1.10 КАК НоваяЦена

|ПОМЕСТИТЬ ВТ_НовыеЦены

|ИЗ

| РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

| ПО ЦеныНоменклатуры.Номенклатура = Номенклатура.Ссылка

|ГДЕ

| Номенклатура.Группа = &Группа

| И ЦеныНоменклатуры.Период = &ТекущаяДата";

Запрос.УстановитьПараметр("Группа", Справочники.ГруппыНоменклатуры.НайтиПоНаименованию("Электроника"));

Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

Запрос.Выполнить();

Запрос.Текст =

"ВЫБРАТЬ

| ВТ_НовыеЦены.Ссылка КАК Ссылка,

| ВТ_НовыеЦены.НоваяЦена КАК Цена

|ИЗ

| ВТ_НовыеЦены КАК ВТ_НовыеЦены";

Результат = Запрос.Выполнить();

НачатьТранзакцию();

Пока Результат.Выбрать() Цикл

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

Запись.Период = ТекущаяДата();

Запись.Номенклатура = Результат.Ссылка;

Запись.Цена = Результат.Цена;

Запись.Записать();

КонецЦикла;

ЗафиксироватьТранзакцию();

В этом примере мы сначала формируем временную таблицу с новыми ценами, а затем записываем их в регистр. Обратите внимание на использование НачатьТранзакцию() и ЗафиксироватьТранзакцию() — это гарантирует, что либо все записи будут обновлены, либо ни одной (если произойдет ошибка).

Для еще большей оптимизации можно использовать конструкцию ОБНОВИТЬ напрямую (если СУБД поддерживает такие запросы). Например, для PostgreSQL или MS SQL:

Запрос.Текст =

"ОБНОВИТЬ РегистрСведений.ЦеныНоменклатуры

|УСТАНОВИТЬ Цена = Цена * 1.10

|ГДЕ Номенклатура В (

| ВЫБРАТЬ Ссылка

| ИЗ Справочник.Номенклатура

| ГДЕ Группа = &Группа

|)

|И Период = &ТекущаяДата";

⚠️ Внимание: Прямые запросы ОБНОВИТЬ могут не работать в файловом варианте или при использовании некоторых СУБД (например, SQLite). Всегда тестируйте код на копии базы перед применением на рабочей системе!
💡

При массовой перезаписи регистра сведений сначала выполните запрос в режиме ПРОСМОТР (без ОБНОВИТЬ), чтобы убедиться, что отбор работает корректно и затрагивает только нужные записи.

5. Типичные ошибки и как их избежать

Даже опытные разработчики иногда допускают ошибки при работе с регистрами сведений. Ниже приведены самые распространенные проблемы и способы их решения.

Ошибка 1: Забывают указать период для периодического регистра

Если вы работаете с периодическим регистром (например, КурсыВалют или ЦеныНоменклатуры), но не указываете дату в менеджере записи, система либо создаст запись на текущую дату (что не всегда нужно), либо выдаст ошибку. Всегда явным образом задавайте период:

МенеджерЗаписи.Период = Дата(2026, 10, 15); // Конкретная дата

Ошибка 2: Не учитывают блокировки

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

Сервер.АктивныеСеансы(); // В конфигураторе

Или используйте повторные попытки записи с задержкой:

Попытка

МенеджерЗаписи.Записать();

Исключение

Если ТипЗнч(ОписаниеОшибки()) = Тип("ОшибкаБлокировкиДанных") Тогда

Подождать(1000); // Пауза 1 секунда

Повторить попытку;

Иначе

ВызватьИсключение;

КонецЕсли;

КонецПопытки;

Ошибка 3: Неправильный отбор по измерениям

Если в регистре несколько измерений (например, Номенклатура, Склад, ТипЦены), но вы указываете не все ключевые поля, может произойти дублирование записей или запись не в ту "ячейку". Всегда проверяйте структуру регистра в конфигураторе (Регистры сведений → [Имя регистра] → Измерения).

Ошибка 4: Игнорирование транзакций

При массовой перезаписи без транзакций есть риск, что часть данных обновится, а часть — нет (например, из-за сбоя питания или ошибки в коде). Всегда оборачивайте операции в транзакции:

НачатьТранзакцию();

Попытка

// Код перезаписи регистра

ЗафиксироватьТранзакцию();

Исключение

ОтменитьТранзакцию();

ВызватьИсключение;

КонецПопытки;

Ошибка 5: Непроверенные данные

Если вы загружаете данные для перезаписи из внешнего источника (например, Excel или JSON), убедитесь, что:

  • 🔢 Форматы данных совпадают (например, даты в правильном формате, числа без лишних символов).
  • 🔍 Все ссылки на справочники существуют (используйте Справочники.[Имя].НайтиПоНаименованию() или НайтиПоРеквизиту()).
  • 📏 Данные соответствуют ограничениям регистра (например, отрицательные цены могут быть запрещены).

Для проверки данных перед записью можно использовать временные таблицы:

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Наименование КАК Номенклатура,

| НоваяЦена КАК Цена

|ИЗ

| &ТаблицаДанных КАК Данные

| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура

| ПО Данные.Номенклатура = Номенклатура.Ссылка

|ГДЕ

| Номенклатура.Ссылка ЕСТЬ NULL";

Запрос.УстановитьПараметр("ТаблицаДанных", ТаблицаДанных);

Результат = Запрос.Выполнить();

Если Результат.Количество() > 0 Тогда

Сообщить("Обнаружены несуществующие номенклатуры: " + Результат.ВыгрузитьКолонку("Номенклатура"));

КонецЕсли;

Как отладить ошибку "Недостаточно прав для операции"

Эта ошибка возникает, если у пользователя нет прав на запись в регистр. Решения:

1. Запустите код от имени администратора (пользователь с полными правами).

2. Проверьте настройки ролей в конфигураторе: Администрирование → Пользователи → [Выбрать пользователя] → Права.

3. Если используете Роли, убедитесь, что в них разрешена запись для данного регистра (Регистры сведений → [Имя регистра] → Права).

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

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

Не всегда для перезаписи регистра сведений требуется писать код. В 1С 8.3 есть встроенные инструменты, которые позволяют обновить данные без программирования. Рассмотрим два основных способа.

Способ 1: Ручное редактирование в пользовательском режиме

Если нужно изменить несколько записей, проще всего открыть регистр в режиме 1С:Предприятие:

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

Этот метод подходит для единичных изменений, но неэффективен для массовых операций. Также учитывайте, что в некоторых конфигурациях (например, 1С:Бухгалтерия) доступ к регистрам может быть ограничен.

Способ 2: Обработка «Универсальная перезапись регистров»

В комплекте поставки (или в библиотеке стандартных обработок) есть универсальная обработка для перезаписи регистров сведений. Она позволяет:

  • 🔍 Выбирать регистр из списка доступных.
  • 📅 Указывать период (для периодических регистров).
  • 🔄 Задавать условия отбора (по измерениям).
  • 📝 Массово обновлять значения ресурсов.

Чтобы воспользоваться обработкой:

  1. Откройте Файл → Открыть и выберите обработку (обычно она называется УниверсальнаяПерезаписьРегистров.epf).
  2. Укажите регистр сведений, который нужно обновить.
  3. Задайте отбор (например, по дате, номенклатуре, складу).
  4. Введите новые значения для ресурсов (полей регистра).
  5. Нажмите Выполнить.

Пример интерфейса обработки:

Скриншот обработки универсальной перезаписи регистров в 1С 8.3

Обратите внимание, что универсальная обработка не всегда корректно работает с:

  • 🔗 Регистрами, имеющими сложные измерения (составные типы).
  • 🔒 Регистрами с ограничениями на уровне СУБД.
  • 📡 Распределенными базами (РИБ).

Если обработка не подходит для вашей задачи, придется писать собственное решение на встроенном языке.

Способ 3: Обмен данными (для интеграций)

Если перезапись регистра связана с интеграцией (например, синхронизацией с 1С:УТ, 1С:ЗУП или внешней системой), можно использовать механизмы обмена:

  • 📤 Выгрузка/загрузка данных через XML или JSON.
  • 🔄 Планы обмена (если регистр участвует в обмене).
  • 🌐 Web-сервисы или HTTP-запросы (для облачных решений).

Например, чтобы обновить регистр КурсыВалют данными с сайта Центробанка, можно использовать следующий код:

HTTPСоединение = Новый HTTPСоединение("www.cbr.ru");

HTTPЗапрос = Новый HTTPЗапрос("/scripts/XML_daily.asp");

Ответ = HTTPСоединение.Получить(HTTPЗапрос);

XMLДанные = Новый ЧтениеXML;

XMLДанные.УстановитьСтроку(Ответ.ПолучитьТекст());

НачатьТранзакцию();

Попытка

Пока XMLДанные.Прочитать() Цикл

Если XMLДанные.ТипУзла = ТипУзлаXML.НачалоЭ