Регистры сведений в 1С:Предприятие — это один из ключевых объектов конфигурации, который хранит данные с привязкой к периодам, измерениям и реквизитам. Изменение записей в таких регистрах требует понимания механизмов платформы, так как неправильные действия могут привести к нарушению целостности данных, ошибкам в отчетах или даже блокировке базы. Эта статья поможет разобраться, как корректно редактировать записи в регистре сведений — как вручную через интерфейс, так и программно с использованием встроенного языка 1С.
Особенность регистров сведений заключается в их периодичности: данные могут храниться с привязкой к дате, времени или быть независимыми (непериодическими). Это накладывает ограничения на способы изменения. Например, редактирование исторических данных может потребовать пересчета итогов или даже корректировки связанных документов. В статье мы рассмотрим все актуальные методы — от простого ручного редактирования до сложных программных сценариев с учетом транзакций и блокировок.
Если вы администратор или разработчик, работающий с 1С 8.3, эта инструкция поможет избежать типичных ошибок, таких как дублирование записей, нарушение последовательности периодов или потери данных при массовых изменениях. Для новичков мы подробно разберем базовые понятия, а опытные пользователи найдут здесь нюансы работы с транзакциями и оптимизацией запросов.
1. Что такое регистр сведений и когда требуется изменять его записи
Регистр сведений в 1С — это объект конфигурации, предназначенный для хранения информации, которая может изменяться во времени. В отличие от справочников, где данные хранятся в виде иерархических структур, регистры сведений оптимизированы для работы с периодическими данными. Например:
- 📅 Курсы валют (привязаны к датам)
- 📊 Цены номенклатуры (могут меняться ежемесячно или еженедельно)
- 👥 Персональные данные сотрудников (оклады, надбавки)
- 📦 Остатки на складах (если используются как альтернатива регистрам накопления)
Изменять записи в регистре сведений приходится в нескольких случаях:
- 🔄 Корректировка исторических данных — например, если был введен неверный курс валюты на прошлую дату.
- 📝 Массовое обновление — когда нужно изменить цены на группу товаров или пересчитать коэффициенты.
- 🔧 Исправление ошибок, возникших из-за сбоев или некорректных обработок.
- 🔄 Перенос данных между периодами (например, при реорганизации структуры предприятия).
Важно понимать, что регистры сведений бывают периодическими (данные привязаны к дате) и непериодическими (данные хранятся в одном экземпляре). Способы изменения записей для этих типов отличаются. Например, в непериодическом регистре можно просто перезаписать значение, а в периодическом — придется учитывать Период и возможные Измерения.
2. Способы изменения записей в регистре сведений
В 1С:Предприятие 8.3 существует несколько способов редактирования записей в регистре сведений. Выбор метода зависит от задачи, объема изменений и уровня доступа пользователя. Рассмотрим основные подходы:
2.1. Ручное редактирование через интерфейс
Самый простой способ — изменить запись непосредственно в форме регистра. Для этого:
- Откройте список регистра сведений через меню
Все функции → Регистры сведений. - Найдите нужную запись (используйте фильтры по периоду, измерениям или реквизитам).
- Дважды кликните по строке или нажмите
Изменить(F2). - Внесите правки и сохраните (
Ctrl+Sили кнопкаЗаписать и закрыть).
Этот метод подходит для разовых изменений, но имеет ограничения:
- ❌ Нет возможности массового редактирования.
- ❌ Риск нарушить целостность данных при изменении исторических записей.
- ❌ Не все регистры доступны для ручного редактирования (зависит от прав пользователя).
Если регистр не отображается в списке Все функции, проверьте права доступа в ролях пользователя. Часто администраторы ограничивают доступ к регистрам сведений, чтобы избежать случайных изменений.
2.2. Программное изменение через встроенный язык
Для массовых или сложных изменений используется встроенный язык 1С. Основные методы:
- 📝 Запись нового значения с помощью менеджера регистра:
Регистр = РегистрыСведений.ИмяРегистра;
Запись = Регистр.СоздатьМенеджерЗаписи();
Запись.Период = ТекущаяДата();
Запись.Измерение1 = ЗначениеИзмерения;
Запись.Реквизит1 = НовоеЗначение;
Запись.Записать();
- 🔄 Изменение существующей записи (требует выборки):
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РегистрСведений.ИмяРегистра КАК Регистр
|ИЗ
| РегистрСведений.ИмяРегистра КАК Регистр
|ГДЕ
| Регистр.Период = &Период
| И Регистр.Измерение1 = &Измерение";
Запрос.УстановитьПараметр("Период", Дата);
Запрос.УстановитьПараметр("Измерение", Значение);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Запись = РегистрыСведений.ИмяРегистра.СоздатьМенеджерЗаписи();
Запись.Прочитать(Результат[0]);
Запись.Реквизит1 = НовоеЗначение;
Запись.Записать();
КонецЕсли;
Программный метод позволяет:
- ✅ Работать с большими объемами данных.
- ✅ Контролировать транзакции (откат при ошибках).
- ✅ Автоматизировать рутинные операции.
Что такое менеджер записи?
Менеджер записи — это объект в 1С, который предоставляет методы для работы с отдельной записью регистра. Он позволяет создавать, читать, изменять и удалять записи, а также управлять блокировками. Например, метод Записать() сохраняет изменения, а Прочитать() загружает данные из базы.
2.3. Использование обработок и внешних отчетов
Для упрощения работы с регистрами сведений можно использовать готовые обработки или создавать свои. Например:
- 📊 Универсальные обработки для массового редактирования (например, "Помощник изменения регистров сведений").
- 📈 Специализированные отчеты, которые позволяют экспортировать данные в Excel, редактировать и импортировать обратно.
- 🔧 Собственные обработки с интерфейсом для удобного изменения записей.
Преимущество этого метода — визуальный контроль над изменениями и возможность предварительного просмотра. Однако требуется осторожность при импорте данных, чтобы избежать дублирования или потери информации.
2.4. Прямая работа с базой данных (SQL)
В редких случаях (например, при восстановлении после сбоев) может потребоваться прямое изменение данных в SQL. Это рискованный метод, так как:
- ⚠️ Нарушается целостность объектов 1С (не обновляются итоги, не срабатывают триггеры).
- ⚠️ Может привести к несовместимости с будущими обновлениями платформы.
- ⚠️ Требует глубоких знаний структуры базы данных 1С.
Пример SQL-запроса для изменения записи (только для опытных администраторов!):
UPDATE [dbo].[_InfoRgXXX]
SET [Field1] = 'НовоеЗначение'
WHERE [Period] = '2026-01-01'
AND [Dimension1] = 'ЗначениеИзмерения';
⚠️ Внимание: Прямое изменение таблиц базы данных 1С через SQL может привести к необратимой порче данных. Используйте этот метод только в крайних случаях и обязательно делайте резервную копию перед изменениями. После правки выполните тестирование и исправление базы через chdbfl.exe.
2.5. Обмен данными и интеграции
Если регистр сведений синхронизируется с внешними системами (например, через REST API, COM-соединение или 1C:EDT), изменения могут поступать автоматически. В этом случае:
- 🔄 Настройте правила конвертации данных в плане обмена.
- 📡 Используйте веб-сервисы для безопасного обновления записей.
- 🔒 Контролируйте права доступа к интеграционным методам.
Пример кода для изменения записи через HTTP-сервис:
Адрес = "http://server/ws/Register.1cws?wsdl";
Прокси = Новый HTTPСервисПрокси(Адрес, "", "", "");
Параметры = Новый Структура();
Параметры.Вставить("Период", ТекущаяДата());
Параметры.Вставить("Измерение1", Значение);
Параметры.Вставить("Реквизит1", НовоеЗначение);
Результат = Прокси.ИзменитьЗаписьРегистра(Параметры);
3. Пошаговая инструкция: как изменить запись в регистре сведений вручную
Рассмотрим подробный алгоритм ручного редактирования на примере регистра сведений КурсыВалют.
Шаг 1. Открытие регистра сведений
Есть два способа открыть регистр:
- Через главное меню:
Все функции → Регистры сведений → КурсыВалют. - Через поиск: нажмите
Ctrl+Shift+F, введите название регистра и выберите его из списка.
Если регистр не отображается, проверьте:
- 🔍 Права пользователя (роль должна включать доступ к регистру).
- 🔍 Настройки видимости в конфигураторе (возможно, регистр скрыт).
Шаг 2. Поиск нужной записи
Используйте фильтры для быстрого поиска:
- 📅 Установите период (дату), за который нужно изменить запись.
- 🔍 Задайте значения измерений (например, валюта —
USD). - 🔍 Отфильтруйте по реквизитам (например, курс больше 90).
Если запись не найдена, возможно, она была удалена или никогда не создавалась. В этом случае придется создать новую запись вместо редактирования.
Шаг 3. Редактирование и сохранение
После открытия записи:
- Измените нужные реквизиты (например, поле
Курс). - Проверьте корректность введенных данных (особенно для числовых и датовых полей).
- Сохраните изменения кнопкой
Записать и закрытьилиCtrl+S.
Убедитесь, что период записи корректен|Проверьте значения измерений|Сверьте новые данные с источником|Удостоверьтесь, что нет дублирующих записей-->
Шаг 4. Проверка результата
После сохранения:
- 🔄 Обновите список записей (
F5). - 📊 Проверьте, что изменения отобразились в отчетах (например, в
Отчет по курсам валют). - 🔍 Убедитесь, что не появились ошибки в журнале регистрации (
Администрирование → Журнал регистрации).
⚠️ Внимание: Если после изменения записи в регистре сведений перестали корректно работать отчеты, возможно, нарушена последовательность периодов. В этом случае воспользуйтесь обработкой Проверка и исправление итогов или пересчитайте итоги вручную.
4. Программное изменение записей: примеры кода
Для автоматизации изменений в регистре сведений используйте встроенный язык 1С. Ниже приведены типовые примеры кода для различных сценариев.
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. Использование временных таблиц
Для сложных операций с большими объемами данных используйте временные таблицы:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КурсыВалют.Валюта КАК Валюта,
| МАКСИМУМ(К