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

Мы рассмотрим все актуальные способы: от стандартных средств платформы до SQL-запросов и внешних обработок. Особое внимание уделим типовым ошибкам, которые допускают даже опытные специалисты, и покажем, как их избежать. Если вы администрируете базу 1С или разрабатываете конфигурации, эта инструкция станет вашим гидом по работе с одним из самых важных объектов метаданных.

1. Основные понятия: что такое регистр сведений и когда его нужно редактировать

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

  • 💰 Курсы валют (привязка к валюте и дате)
  • 📦 Цены номенклатуры (привязка к товару, типу цены и дате)
  • 📊 Плановые показатели (привязка к подразделению и месяцу)
  • 🔧 Настройки системы (например, параметры интеграций)

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

  • 🔄 Исправление ошибок — если пользователь ввел неверные данные (например, неправильный курс доллара на прошлую дату).
  • 📅 Перенос данных — при миграции из одной конфигурации в другую или обновлении версии.
  • 🛠️ Тестирование — когда нужно сымитировать определенные условия для отладки.
  • 📈 Массовые изменения — например, пересчет цен по новому алгоритму.
⚠️ Внимание: Изменение записей в регистрах сведений с периодичностью "По позиции регистратора" (например, регистр ЦеныНоменклатуры в УТ 11) может привести к рассинхронизации с документами-регистраторами. Перед правкой проверьте, не управляется ли регистр документами!

2. Способ 1: Редактирование через пользовательский интерфейс (для непериодических регистров)

Самый простой метод — использовать стандартные формы 1С. Он подходит для непериодических регистров или регистров с периодичностью "В пределах" (например, НастройкиПользователей). Порядок действий:

  1. Откройте меню Все функции (или Операции → Регистры сведений в старых версиях).
  2. Найдите нужный регистр в дереве метаданных. Например: РегламентированныйУчет → КурсыВалют.
  3. Нажмите Открыть список — откроется форма со всеми записями.
  4. Дважды кликните по строке для редактирования или добавьте новую запись кнопкой Создать.

Для периодических регистров (например, ЦеныНоменклатуры) интерфейс может отличаться:

  • 🔍 Используйте отбор по измерениям (номенклатура, склад) и периоду (дата).
  • 📅 Для изменения исторических данных установите флажок Показывать история.
  • 🔄 После правки нажмите Записать и закрыть — изменения применятся сразу.

Данные введены корректно (без опечаток в кодах, суммах)

Период изменения не блокирован другими пользователями

Изменения не конфликтуют с документами (проверьте регистраторы)

Сделан бэкап базы (для критичных правок)

-->

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

  • ❌ Нет инструментов для массового редактирования.
  • ❌ Нельзя изменить записи, защищенные на уровне РЛС (роли, права доступа).
  • ❌ Для больших объемов данных интерфейс работает медленно.

3. Способ 2: Программное изменение через встроенный язык 1С

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

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

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

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

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

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

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

УстановитьПараметр() Изменяет реквизиты существующей записи
Запись = РегистрыСведений.ЦеныНоменклатуры.НайтиПоРеквизиту("Номенклатура", СсылкаНаТовар);

Запись.Цена = НоваяЦена;

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

Очистить() Удаляет записи по отбору
Отбор = Новый Структура("Период, Валюта", ТекущаяДата(), Валюта);

РегистрыСведений.КурсыВалют.Очистить(Отбор);

Ключевые нюансы программного изменения:

  • 🔐 Всегда проверяйте права доступа через ПраваДоступа.Проверка().
  • 📅 Для периодических регистров укажите точный Период — иначе запись может "затеряться".
  • 🔄 После массовых изменений выполните РегламентныеЗадания.Выполнить(), если регистр используется в фоне.
💡

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

Пример массового обновления курсов валют из внешнего источника:

// Получаем данные из XML-файла ЦБ РФ

ДанныеКурсов = ПолучитьКурсыИзФайла("cbr.xml");

// Для каждой валюты обновляем запись

Для Каждого ВалютаИзФайла Из ДанныеКурсов Цикл

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

Запись.Валюта = Справочники.Валюты.НайтиПоКоду(ВалютаИзФайла.Код);

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

Запись.Курс = ВалютаИзФайла.Значение;

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

КонецЦикла;

4. Способ 3: Использование запросов 1С для сложных правок

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

  • 🔍 Обновить записи по сложному условию (например, цены только для определенной группы товаров).
  • 📊 Перенести данные между регистрами.
  • 🧹 Очистить устаревшие записи (старше определенной даты).

Базовый синтаксис запроса для изменения регистра сведений:

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

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

"ВЫБРАТЬ

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

| ЦеныНоменклатуры.Период КАК Период,

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

|ИЗ

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

|ГДЕ

| ЦеныНоменклатуры.ТипЦен = &ТипЦены

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

Запрос.УстановитьПараметр("ТипЦены", Справочники.ТипыЦен.Розница);

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

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

// Обновляем записи по результату запроса

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

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

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

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

Запись.Период = Выборка.Период;

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

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

КонецЦикла;

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

  • Высокая производительность — запросы работают быстрее, чем поэлементная обработка.
  • 🎯 Точный контроль над условиями отбора (можно использовать любые поля).
  • 🔄 Возможность предварительного просмотра изменений (выведите результат запроса в таблицу перед записью).
⚠️ Внимание: При использовании запросов с ОБЪЕДИНИТЬ или ЛЕВОЕ СОЕДИНЕНИЕ для регистров сведений может произойти дублирование записей, если не указать уникальные ключи (измерения + период). Всегда проверяйте результат на тестовых данных!

5. Способ 4: Прямое редактирование через SQL (для администраторов)

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

Основные таблицы для регистров сведений в SQL:

  • _InfoRg{ИД_Регистра} — служебная информация.
  • _AccumRg{ИД_Регистра} — данные для регистров сведений с независимым режимом записи.
  • _Balance{ИД_Регистра} — данные для регистров сведений с подчинением регистратору.

Пример SQL-запроса для обновления курса доллара на определенную дату (для 1С:Предприятие 8.3 на MS SQL Server):

UPDATE _AccumRg12345678  -- Замените на реальный ИД регистра КурсыВалют

SET

_Fld123987 = 98.75 -- Поле "Курс" (ИД поля можно найти в конфигураторе)

WHERE

_Fld123456 = '000000001' -- Ссылка на валюту (Доллар США)

AND _Period = CONVERT(DATETIME, '2026-05-15 00:00:00', 120)

Критические моменты при работе с SQL:

  • 🔑 Идентификаторы таблиц и полей уникальны для каждой базы. Их можно найти в конфигураторе через Все функции → Метаданные → Регистры сведений.
  • 🔒 Всегда делайте бэкап базы перед прямыми изменениями.
  • 🛡️ После правки выполните Тестирование и исправление в конфигураторе (меню Администрирование).
Как найти ИД регистра и полей в конфигураторе

1. Откройте конфигуратор в режиме "Конфигуратор".

2. Перейдите в дерево метаданных и найдите нужный регистр сведений.

3. Нажмите правой кнопкой → "Свойства" → вкладка "Данные".

4. В поле "Имя таблицы" будет указан ИД (например, _AccumRg12345678).

5. Для полей смотрите свойства реквизитов — там указаны их ИД в SQL.

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

6. Способ 5: Внешние обработки и расширения для массовых правок

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

  • 📁 Сохранять настройки отборов и правил преобразования.
  • 🔄 Автоматизировать рутинные операции (например, ежемесячный пересчет цен).
  • 🛠️ Добавлять дополнительную логику (валидацию, логгирование).

Популярные готовые решения:

Обработка Назначение Ссылка (Инфостарт)
Универсальная обработка для регистров сведений Массовое редактирование, копирование, очистка записей infostart.ru/public/12345/
Перенос данных между регистрами Миграция данных между похожими регистрами infostart.ru/public/67890/
Редактор периодических регистров Удобный интерфейс для правки исторических данных infostart.ru/public/54321/

Пример кода для собственной обработки массового обновления цен:

Процедура ОбновитьЦеныНа10Процентов(Команда)

// Получаем все актуальные цены

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

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

"ВЫБРАТЬ

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

| ЦеныНоменклатуры.Период КАК Период,

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

|ИЗ

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

|ГДЕ

| ЦеныНоменклатуры.ТипЦен = &ТипЦены

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

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

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

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

Транзакция = Новый Транзакция();

Попытка

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

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

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

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

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

Запись.Период = Выборка.Период;

Запись.Цена = Окр(Выборка.СтараяЦена * 1.1, 2); // Увеличиваем на 10%

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

КонецЦикла;

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

Сообщить("Цены успешно обновлены!");

Исключение

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

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

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

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

Через пользовательский интерфейс

С помощью встроенного языка 1С

SQL-запросы к базе

Внешние обработки

Другой вариант

-->

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

Даже опытные специалисты допускают ошибки при работе с регистрами сведений. Вот самые распространенные:

  • 🔄 Забывают про периодичность — пытаются записать данные на дату, которая уже занята другой записью (для регистров с периодичностью "В пределах"). Решение: используйте Период = Макс(Период) + 1 секунда.
  • 🔐 Игнорируют права доступа — изменения не применяются из-за РЛС. Решение: проверяйте права через ПраваДоступа.Проверка("РегистрСведений.ИмяРегистра", "Изменение").
  • 📅 Не учитывают регистраторы — правят записи в регистре, который управляется документами (например, ЦеныНоменклатуры в УТ 11). Решение: изменяйте документ-регистратор, а не запись напрямую.
  • 🗑️ Не очищают кэш — после массовых изменений данные не обновляются в отчетах. Решение: выполните ОчиститьКэшЗначенийРегистровСведений().

Пример ошибки с периодичностью:

// Некорректно: пытаемся записать на ту же дату

Запись.Период = ТекущаяДата(); // Если на сегодня уже есть запись, она не обновится!

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

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

// Корректно: ищем последний период и добавляем 1 секунду

ПоследняяЗапись = РегистрыСведений.КурсыВалют.Последний(ТекущаяДата());

Если ПоследняяЗапись = Неопределено Тогда

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

Иначе

Запись.Период = ПоследняяЗапись.Период + 1; // Смещаем на 1 секунду

КонецЕсли;

💡

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

8. Безопасность и резервное копирование

Любые изменения в регистрах сведений — это риск для целостности данных. Чтобы минимизировать последствия, следуйте правилам:

  • 💾 Бэкап перед правкой — даже для мелких изменений. В 1С можно создать резервную копию через:
    Администрирование → Обслуживание → Резервное копирование и восстановление
  • 🔒 Блокировка базы — на время массовых правок ограничьте доступ других пользователей (через Администрирование → Пользователи).
  • 📝 Лог изменений — ведите журнал правок (дату, кто изменял, что именно). Пример кода для логгирования:
    Процедура ЗаписатьВЖурнал(Действие, Объект, Комментарий)
    

    ЗаписьЖурнала = Документы.ЖурналИзменений.СоздатьДокумент();

    ЗаписьЖурнала.Дата = ТекущаяДата();

    ЗаписьЖурнала.Пользователь = Пользователи.ТекущийПользователь();

    ЗаписьЖурнала.Действие = Действие;

    ЗаписьЖурнала.Объект = Объект;

    ЗаписьЖурнала.Комментарий = Комментарий;

    ЗаписьЖурнала.Записать();

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

Если после правки возникли проблемы, восстановите данные из бэкапа или используйте откат транзакций (если изменения выполнялись в транзакции). Пример:

Транзакция = Новый Транзакция();

Попытка

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

// Ваш код изменений

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

Исключение

Транзакция.ОтменитьТранзакцию(); // Откат при ошибке

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

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

⚠️ Внимание: В облачных версиях 1С (например, 1С:Fresh) нет прямого доступа к SQL и файловой системе. Для резервного копирования используйте стандартные инструменты платформы или API.

FAQ: Частые вопросы по работе с регистрами сведений

Можно ли изменить запись в регистре сведений, которая создана документом?

Нет, если регистр подчинен регистратору (управляется документами). В этом случае нужно:

  1. Найти документ, который создал запись (через отчет Анализ регистра).
  2. Отменить проведение документа.
  3. Изменить данные в документе и провести его заново.

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

Как узнать, какой регистр сведений используется в конкретном отчете?

Откройте отчет в конфигураторе:

  1. Перейдите на вкладку Текст (для СКД) или Модуль (для обычных отчетов).
  2. Найдите в коде упоминания РегистрСведений. или РегистрыСведений..
  3. Или используйте Поиск ссылок (правая кнопка на регистре → Найти использования).
Почему после изменения записи в регистре сведений ничего не поменялось в отчете?

Возможные причины:

  • 🗄️ Кэш данных — очистите кэш регистров через Администрирование → Обслуживание → Тестирование и исправление (флаг "Очистка кэша").
  • 📅 Неверный период — проверьте, что запись попала в диапазон дат, используемый в отчете.
  • 🔍 Отбор в отчете — возможно, ваша запись не попадает под условия отбора (например, по организации или складу).
  • 🔄 Зависимые регистры — некоторые отчеты берут данные из расчетных регистров, которые пересчитываются по расписанию (например, СебестоимостьТоваров).
Как перенести данные из одного регистра сведений в другой?

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

  1. Первый запрос выбирает данные из источника.
  2. Второй запрос записывает их в целевой регистр.

Пример кода:

// 1. Читаем данные из исходного регистра

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

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

"ВЫБРАТЬ

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

| Источник.Период КАК Период,

| Источник.Цена КАК Цена

|ИЗ

| РегистрСведений.СтарыеЦены КАК Источник";

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

// 2. Записываем в новый регистр

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

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

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

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

Запись.Период = Выборка.Период;

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

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

КонецЦикла;

Можно ли откатить изменения в регистре сведений, если я ошибся?

Да, есть несколько способов:

  • 🔙 Восстановление из бэкапа — если изменения критичные.
  • 📅 Ручной откат — для периодических регистров можно записать новые данные с более поздней датой (они перекроют ошибочные).
  • 🔄 Транзакции — если изменения выполнялись в транзакции, и она не была зафиксирована, данные откатятся автоматически.
  • 📝 Журнал изменений — если велся лог, можно вручную восстановить предыдущие значения.