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

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

Если вы администратор или разработчик, работающий с 1С 8.3, эта инструкция поможет избежать типичных ошибок, таких как дублирование записей, нарушение последовательности периодов или потери данных при массовых изменениях. Для новичков мы подробно разберем базовые понятия, а опытные пользователи найдут здесь нюансы работы с транзакциями и оптимизацией запросов.

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

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

  • 📅 Курсы валют (привязаны к датам)
  • 📊 Цены номенклатуры (могут меняться ежемесячно или еженедельно)
  • 👥 Персональные данные сотрудников (оклады, надбавки)
  • 📦 Остатки на складах (если используются как альтернатива регистрам накопления)

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

  • 🔄 Корректировка исторических данных — например, если был введен неверный курс валюты на прошлую дату.
  • 📝 Массовое обновление — когда нужно изменить цены на группу товаров или пересчитать коэффициенты.
  • 🔧 Исправление ошибок, возникших из-за сбоев или некорректных обработок.
  • 🔄 Перенос данных между периодами (например, при реорганизации структуры предприятия).

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

📊 Как часто вам приходится редактировать регистры сведений в 1С?
Ежедневно
Раз в неделю
Раз в месяц
Реже
Никогда

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

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

2.1. Ручное редактирование через интерфейс

Самый простой способ — изменить запись непосредственно в форме регистра. Для этого:

  1. Откройте список регистра сведений через меню Все функции → Регистры сведений.
  2. Найдите нужную запись (используйте фильтры по периоду, измерениям или реквизитам).
  3. Дважды кликните по строке или нажмите Изменить (F2).
  4. Внесите правки и сохраните (Ctrl+S или кнопка Записать и закрыть).

Этот метод подходит для разовых изменений, но имеет ограничения:

  • ❌ Нет возможности массового редактирования.
  • ❌ Риск нарушить целостность данных при изменении исторических записей.
  • ❌ Не все регистры доступны для ручного редактирования (зависит от прав пользователя).
💡

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

2.2. Программное изменение через встроенный язык

Для массовых или сложных изменений используется встроенный язык . Основные методы:

  • 📝 Запись нового значения с помощью менеджера регистра:
Регистр = РегистрыСведений.ИмяРегистра;

Запись = Регистр.СоздатьМенеджерЗаписи();

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

Запись.Измерение1 = ЗначениеИзмерения;

Запись.Реквизит1 = НовоеЗначение;

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

  • 🔄 Изменение существующей записи (требует выборки):
Запрос = Новый Запрос;

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

"ВЫБРАТЬ

| РегистрСведений.ИмяРегистра КАК Регистр

|ИЗ

| РегистрСведений.ИмяРегистра КАК Регистр

|ГДЕ

| Регистр.Период = &Период

| И Регистр.Измерение1 = &Измерение";

Запрос.УстановитьПараметр("Период", Дата);

Запрос.УстановитьПараметр("Измерение", Значение);

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

Если Не Результат.Пустой() Тогда

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

Запись.Прочитать(Результат[0]);

Запись.Реквизит1 = НовоеЗначение;

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

КонецЕсли;

Программный метод позволяет:

  • ✅ Работать с большими объемами данных.
  • ✅ Контролировать транзакции (откат при ошибках).
  • ✅ Автоматизировать рутинные операции.
Что такое менеджер записи?

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

2.3. Использование обработок и внешних отчетов

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

  • 📊 Универсальные обработки для массового редактирования (например, "Помощник изменения регистров сведений").
  • 📈 Специализированные отчеты, которые позволяют экспортировать данные в Excel, редактировать и импортировать обратно.
  • 🔧 Собственные обработки с интерфейсом для удобного изменения записей.

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

2.4. Прямая работа с базой данных (SQL)

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

  • ⚠️ Нарушается целостность объектов (не обновляются итоги, не срабатывают триггеры).
  • ⚠️ Может привести к несовместимости с будущими обновлениями платформы.
  • ⚠️ Требует глубоких знаний структуры базы данных .

Пример SQL-запроса для изменения записи (только для опытных администраторов!):

UPDATE [dbo].[_InfoRgXXX]

SET [Field1] = 'НовоеЗначение'

WHERE [Period] = '2026-01-01'

AND [Dimension1] = 'ЗначениеИзмерения';

⚠️ Внимание: Прямое изменение таблиц базы данных через SQL может привести к необратимой порче данных. Используйте этот метод только в крайних случаях и обязательно делайте резервную копию перед изменениями. После правки выполните тестирование и исправление базы через chdbfl.exe.

2.5. Обмен данными и интеграции

Если регистр сведений синхронизируется с внешними системами (например, через REST API, COM-соединение или 1C:EDT), изменения могут поступать автоматически. В этом случае:

  • 🔄 Настройте правила конвертации данных в плане обмена.
  • 📡 Используйте веб-сервисы для безопасного обновления записей.
  • 🔒 Контролируйте права доступа к интеграционным методам.

Пример кода для изменения записи через HTTP-сервис:

Адрес = "http://server/ws/Register.1cws?wsdl";

Прокси = Новый HTTPСервисПрокси(Адрес, "", "", "");

Параметры = Новый Структура();

Параметры.Вставить("Период", ТекущаяДата());

Параметры.Вставить("Измерение1", Значение);

Параметры.Вставить("Реквизит1", НовоеЗначение);

Результат = Прокси.ИзменитьЗаписьРегистра(Параметры);

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

Рассмотрим подробный алгоритм ручного редактирования на примере регистра сведений КурсыВалют.

Шаг 1. Открытие регистра сведений

Есть два способа открыть регистр:

  1. Через главное меню: Все функции → Регистры сведений → КурсыВалют.
  2. Через поиск: нажмите Ctrl+Shift+F, введите название регистра и выберите его из списка.

Если регистр не отображается, проверьте:

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

Шаг 2. Поиск нужной записи

Используйте фильтры для быстрого поиска:

  • 📅 Установите период (дату), за который нужно изменить запись.
  • 🔍 Задайте значения измерений (например, валюта — USD).
  • 🔍 Отфильтруйте по реквизитам (например, курс больше 90).

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

Шаг 3. Редактирование и сохранение

После открытия записи:

  1. Измените нужные реквизиты (например, поле Курс).
  2. Проверьте корректность введенных данных (особенно для числовых и датовых полей).
  3. Сохраните изменения кнопкой Записать и закрыть или Ctrl+S.

Убедитесь, что период записи корректен|Проверьте значения измерений|Сверьте новые данные с источником|Удостоверьтесь, что нет дублирующих записей-->

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

После сохранения:

  • 🔄 Обновите список записей (F5).
  • 📊 Проверьте, что изменения отобразились в отчетах (например, в Отчет по курсам валют).
  • 🔍 Убедитесь, что не появились ошибки в журнале регистрации (Администрирование → Журнал регистрации).
⚠️ Внимание: Если после изменения записи в регистре сведений перестали корректно работать отчеты, возможно, нарушена последовательность периодов. В этом случае воспользуйтесь обработкой Проверка и исправление итогов или пересчитайте итоги вручную.

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

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

4.1. Изменение одной записи

Предположим, нужно изменить курс доллара на конкретную дату:

// Получаем менеджер регистра

Регистр = РегистрыСведений.КурсыВалют;

// Создаем объект записи

Запись = Регистр.СоздатьМенеджерЗаписи();

// Устанавливаем параметры выборки

Запись.Период = '2026-05-15';

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

// Читаем существующую запись

Если Запись.Прочитать() Тогда

// Меняем курс

Запись.Курс = 92.50;

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

Сообщить("Запись успешно изменена!");

Иначе

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

КонецЕсли;

4.2. Массовое изменение записей

Если нужно увеличить все курсы валют на 5% за последний месяц:

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

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

"ВЫБРАТЬ

| КурсыВалют.Ссылка КАК Ссылка

|ИЗ

| РегистрСведений.КурсыВалют КАК КурсыВалют

|ГДЕ

| КурсыВалют.Период МЕЖДУ &НачалоПериода И &КонецПериода";

НачалоПериода = НачалоМесяца(ТекущаяДата());

КонецПериода = КонецМесяца(ТекущаяДата());

Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);

Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

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

Регистр = РегистрыСведений.КурсыВалют;

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

Попытка

Для Каждого Строка Из Результат Цикл

Запись = Регистр.СоздатьМенеджерЗаписи();

Запись.Прочитать(Строка.Ссылка);

Запись.Курс = Запись.Курс * 1.05; // Увеличиваем на 5%

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

КонецЦикла;

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

Сообщить("Массовое изменение завершено!");

Исключение

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

Сообщить("Ошибка: " + ОписаниеОшибки());

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

💡

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

4.3. Создание новой записи, если она отсутствует

Иногда нужно гарантированно установить значение, даже если записи еще нет:

Регистр = РегистрыСведений.КурсыВалют;

Запись = Регистр.СоздатьМенеджерЗаписи();

// Устанавливаем ключевые поля

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

Запись.Валюта = Справочники.Валюты.USD;

// Пробуем прочитать существующую запись

Если Не Запись.Прочитать() Тогда

// Если записи нет, создаем новую

Запись.Курс = 93.00;

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

Сообщить("Создана новая запись!");

Иначе

// Если запись есть, обновляем ее

Запись.Курс = 93.00;

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

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

КонецЕсли;

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

Чтобы удалить запись из регистра сведений:

Регистр = РегистрыСведений.КурсыВалют;

Запись = Регистр.СоздатьМенеджерЗаписи();

Запись.Период = '2026-05-10';

Запись.Валюта = Справочники.Валюты.USD;

Если Запись.Прочитать() Тогда

Запись.Удалить();

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

Иначе

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

КонецЕсли;

⚠️ Внимание: Удаление записей из регистра сведений может привести к разрыву последовательности периодов, что повлияет на отчеты. Если удаляете исторические данные, проверьте зависимые документы и отчеты.

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

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

5.1. Дублирование записей

Ошибка возникает, когда для одного и того же набора Период + Измерения создается несколько записей. Например:

  • 🔄 При повторном запуске обработки без проверки существования записи.
  • 🔄 При ручном вводе данных без фильтрации.

Как избежать:

  • ✅ Всегда проверяйте существование записи перед созданием новой (Запись.Прочитать()).
  • ✅ Используйте уникальные индексы в конфигураторе (настройте уникальность по полям Период и измерениям).

5.2. Нарушение последовательности периодов

Если в регистре сведений есть записи с Периодом, идущим не по порядку (например, сначала 15.05.2026, потом 10.05.2026), это может привести к:

  • ❌ Некорректной работе отчетов (например, курс валюты на 10.05 будет браться позже, чем на 15.05).
  • ❌ Ошибкам при построении динамических списков.

Решение:

  • ✅ Проверяйте порядок периодов при массовых изменениях.
  • ✅ Используйте обработку Проверка и исправление итогов.

5.3. Ошибки блокировки

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

  • Запись заблокирована другим пользователем
  • Не удалось установить блокировку

Как действовать:

  • ✅ Используйте УстановитьБлокировку() с таймаутом:
Если Не Запись.УстановитьБлокировку(10) Тогда // Таймаут 10 секунд

Сообщить("Не удалось заблокировать запись!");

Возврат;

КонецЕсли;

  • ✅ Настройте регламентные задания на ночное время, чтобы уменьшить нагрузку.

5.4. Несовпадение итогов

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

  • 🔢 Итоги не пересчитаны после изменения.
  • 🔢 Нарушена связь с другими регистрами или документами.

Способы исправления:

  • ✅ Выполните пересчет итогов:
Регистр = РегистрыСведений.КурсыВалют;

Регистр.ПересчитатьИтоги();

  • ✅ Проверьте связанные документы (возможно, нужно перепровести их).

5.5. Ошибки прав доступа

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

  • 🔐 Роли пользователя — должна быть разрешена запись в регистр.
  • 🔐 Права на объекты (измерения и реквизиты регистра).
  • 🔐 Режим блокировки (возможно, включен режим Только чтение).

Для исправления откройте конфигуратор и настройте права в разделе Администрирование → Пользователи и права.

Ошибка Причина Решение
Дублирование записей Повторный ввод без проверки Использовать Запись.Прочитать() перед созданием
Блокировка записи Другой пользователь редактирует данные Установить таймаут или повторить позже
Несовпадение итогов Итоги не пересчитаны Выполнить ПересчитатьИтоги()
Ошибка прав доступа Не хватает прав на запись Настроить роль пользователя
Нарушение периодов Записи не упорядочены по дате Проверять порядок при массовых изменениях

6. Оптимизация работы с регистрами сведений

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

6.1. Использование запросов вместо поочередного чтения

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

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

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

"ВЫБРАТЬ

| КурсыВалют.Ссылка КАК Ссылка,

| КурсыВалют.Курс КАК Курс

|ИЗ

| РегистрСведений.КурсыВалют КАК КурсыВалют

|ГДЕ

| КурсыВалют.Период МЕЖДУ &Начало И &Конец";

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

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

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

Регистр = РегистрыСведений.КурсыВалют;

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

Попытка

Для Каждого Строка Из Результат Цикл

Запись = Регистр.СоздатьМенеджерЗаписи();

Запись.Прочитать(Строка.Ссылка);

Запись.Курс = Строка.Курс * 1.1; // Увеличиваем на 10%

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

КонецЦикла;

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

Исключение

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

Сообщить("Ошибка: " + ОписаниеОшибки());

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

6.2. Работа в фоновом режиме

Для длительных операций используйте фоновые задания, чтобы не блокировать интерфейс пользователя:

ФоновоеЗадание = ФоновыеЗадания.СоздатьФоновоеЗадание(

"ОбновлениеКурсовВалют",

ЭтотОбъект.ИмяМетодаДляОбновления,

СтруктураПараметров);

ФоновоеЗадание.ВыполнитьАсинхронно();

6.3. Кэширование часто используемых данных

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

Процедура ПолучитьКурсВалюты(Дата, Валюта)

Если ЗначенияКэша.Свойство(Дата + "_" + Валюта) Тогда

Возврат ЗначенияКэша[Дата + "_" + Валюта];

Иначе

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

Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1 Курс

|ИЗ РегистрСведений.КурсыВалют

|ГДЕ Период = &Дата И Валюта = &Валюта";

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

Запрос.УстановитьПараметр("Валюта", Валюта);

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

Если Не Результат.Пустой() Тогда

Значение = Результат[0].Курс;

ЗначенияКэша.Вставить(Дата + "_" + Валюта, Значение);

Возврат Значение;

КонецЕсли;

КонецЕсли;

Возврат Неопределено;

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

6.4. Использование временных таблиц

Для сложных операций с большими объемами данных используйте временные таблицы:

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

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

"ВЫБРАТЬ

| КурсыВалют.Валюта КАК Валюта,

| МАКСИМУМ(К