Регистры сведений в 1С:Предприятие — это универсальный инструмент для хранения данных с привязкой к периодам, измерениям и реквизитам. Они используются для учета курсов валют, цен номенклатуры, остатков на складах и других динамических параметров. Однако работа с ними требует аккуратности: неправильное изменение записей может привести к расхождению данных, ошибкам в отчетах или даже блокировке базы. Эта статья поможет разобраться, как безопасно редактировать записи в регистрах сведений — от ручных правок в пользовательском режиме до программных методов для разработчиков.
Мы рассмотрим все актуальные способы: от стандартных средств платформы до SQL-запросов и внешних обработок. Особое внимание уделим типовым ошибкам, которые допускают даже опытные специалисты, и покажем, как их избежать. Если вы администрируете базу 1С или разрабатываете конфигурации, эта инструкция станет вашим гидом по работе с одним из самых важных объектов метаданных.
1. Основные понятия: что такое регистр сведений и когда его нужно редактировать
Регистр сведений — это периодический независимый объект в 1С, который хранит данные с привязкой к одному или нескольким измерениям (например, номенклатура + склад) и периоду (дата). В отличие от регистров накопления, он не поддерживает обороты, а просто фиксирует состояние на определенный момент времени. Типичные примеры использования:
- 💰 Курсы валют (привязка к валюте и дате)
- 📦 Цены номенклатуры (привязка к товару, типу цены и дате)
- 📊 Плановые показатели (привязка к подразделению и месяцу)
- 🔧 Настройки системы (например, параметры интеграций)
Редактировать записи в регистре сведений приходится в нескольких случаях:
- 🔄 Исправление ошибок — если пользователь ввел неверные данные (например, неправильный курс доллара на прошлую дату).
- 📅 Перенос данных — при миграции из одной конфигурации в другую или обновлении версии.
- 🛠️ Тестирование — когда нужно сымитировать определенные условия для отладки.
- 📈 Массовые изменения — например, пересчет цен по новому алгоритму.
⚠️ Внимание: Изменение записей в регистрах сведений с периодичностью "По позиции регистратора" (например, регистр ЦеныНоменклатуры в УТ 11) может привести к рассинхронизации с документами-регистраторами. Перед правкой проверьте, не управляется ли регистр документами!
2. Способ 1: Редактирование через пользовательский интерфейс (для непериодических регистров)
Самый простой метод — использовать стандартные формы 1С. Он подходит для непериодических регистров или регистров с периодичностью "В пределах" (например, НастройкиПользователей). Порядок действий:
- Откройте меню
Все функции(илиОперации → Регистры сведенийв старых версиях). - Найдите нужный регистр в дереве метаданных. Например:
РегламентированныйУчет → КурсыВалют. - Нажмите
Открыть список— откроется форма со всеми записями. - Дважды кликните по строке для редактирования или добавьте новую запись кнопкой
Создать.
Для периодических регистров (например, ЦеныНоменклатуры) интерфейс может отличаться:
- 🔍 Используйте отбор по измерениям (номенклатура, склад) и периоду (дата).
- 📅 Для изменения исторических данных установите флажок
Показывать история. - 🔄 После правки нажмите
Записать и закрыть— изменения применятся сразу.
Данные введены корректно (без опечаток в кодах, суммах)
Период изменения не блокирован другими пользователями
Изменения не конфликтуют с документами (проверьте регистраторы)
Сделан бэкап базы (для критичных правок)
-->
Этот способ удобен для разовых правок, но имеет ограничения:
- ❌ Нет инструментов для массового редактирования.
- ❌ Нельзя изменить записи, защищенные на уровне РЛС (роли, права доступа).
- ❌ Для больших объемов данных интерфейс работает медленно.
3. Способ 2: Программное изменение через встроенный язык 1С
Для автоматизации или массовых правок используйте встроенный язык 1С. Основные методы работы с регистрами сведений:
| Метод | Описание | Пример кода |
|---|---|---|
Записать() |
Создает или обновляет запись |
|
УстановитьПараметр() |
Изменяет реквизиты существующей записи |
|
Очистить() |
Удаляет записи по отбору |
|
Ключевые нюансы программного изменения:
- 🔐 Всегда проверяйте права доступа через
ПраваДоступа.Проверка(). - 📅 Для периодических регистров укажите точный
Период— иначе запись может "затеряться". - 🔄 После массовых изменений выполните
РегламентныеЗадания.Выполнить(), если регистр используется в фоне.
Перед массовым изменением записей в регистре сведений ЦеныНоменклатуры проверьте, не используются ли эти цены в открытых заказах клиентов. Иначе после правки документы могут стать неактуальными, и менеджерам придется пересчитывать их вручную.
Пример массового обновления курсов валют из внешнего источника:
// Получаем данные из 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. Записываем в новый регистр
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Запись = РегистрыСведений.НовыеЦены.СоздатьМенеджерЗаписи();
Запись.Номенклатура = Выборка.Номенклатура;
Запись.Период = Выборка.Период;
Запись.Цена = Выборка.Цена;
Запись.Записать();
КонецЦикла;
Можно ли откатить изменения в регистре сведений, если я ошибся?
Да, есть несколько способов:
- 🔙 Восстановление из бэкапа — если изменения критичные.
- 📅 Ручной откат — для периодических регистров можно записать новые данные с более поздней датой (они перекроют ошибочные).
- 🔄 Транзакции — если изменения выполнялись в транзакции, и она не была зафиксирована, данные откатятся автоматически.
- 📝 Журнал изменений — если велся лог, можно вручную восстановить предыдущие значения.