Работа с регистрами сведений в 1С:Предприятие — одна из ключевых задач для разработчиков и администраторов. Эти объекты конфигурации хранят данные, которые не привязаны к документам, но критичны для бизнес-логики: курсы валют, остатки на складах, настройки пользователей и многое другое. Однако даже опытные специалисты иногда путают два фундаментальных понятия: основной отбор и измерения. Почему они так важны? Как правильно их настроить? И какие ошибки могут привести к некорректной работе системы?
В этой статье мы разберёмся, что такое регистр сведений, чем отличаются его измерения от ресурсов, как работает основной отбор и почему его неправильная настройка может "сломать" отчёты. Мы проанализируем реальные примеры из типовой конфигурации 1С:Управление торговлей и покажем, как избежать типичных ошибок при работе с этими объектами. А в конце — ответим на частые вопросы, которые возникают у начинающих (и не только) программистов 1С.
Что такое регистр сведений и зачем он нужен
Регистр сведений — это объект конфигурации 1С:Предприятие 8, предназначенный для хранения данных, которые не связаны с документами, но должны быть доступны в любой момент. В отличие от регистров накопления, которые фиксируют движения (например, приход/расход товаров), регистры сведений хранят текущие состояния: курсы валют, цены номенклатуры, настройки прав доступа и т.д.
Примеры использования:
- 💰 Курсы валют — актуальные значения для пересчёта сумм в иностранной валюте.
- 📦 Цены номенклатуры — текущие цены товаров для продажи или закупки.
- 👥 Настройки пользователей — индивидуальные параметры интерфейса или прав.
- 📅 Графики работы — расписания сотрудников или складов.
Главное преимущество регистра сведений — быстрый доступ к данным без необходимости перебора документов. Например, чтобы узнать актуальный курс доллара, системе не нужно искать последний документ "Установка курсов валют" — она просто берёт значение из регистра.
Измерения регистра сведений: что это и как они работают
Измерения — это поля регистра сведений, по которым данные могут группироваться. Они определяют, какие именно сведения хранятся в регистре. Например, в регистре "Цены номенклатуры" измерениями могут быть:
- 📌 Номенклатура — какой товар.
- 🏷️ Тип цен — оптовая, розничная, закупочная.
- 📅 Период действия — с какой даты цена актуальна.
Комбинация значений измерений формирует уникальный ключ записи в регистре. Например, одна и та же номенклатура может иметь разные цены для оптовой и розничной продажи — и регистр разделит эти данные по измерению "Тип цен".
Важно понимать, что измерения влияют на:
- 🔍 Поиск данных — по каким критериям будет происходить выборка.
- 📊 Агрегацию — как данные будут группироваться в отчётах.
- 🔄 Обновление — какие записи будут перезаписаны при изменении.
Если в регистре слишком много измерений, это может замедлить работу системы. Оптимальное количество — 3-5, не более.
Основной отбор: почему он "основной" и как его настроить
Основной отбор — это механизм, который автоматически применяется при чтении данных из регистра сведений. Он позволяет ограничить выборку записей по заданным критериям ещё до обращения к базе данных. Это значительно ускоряет работу системы, особенно при больших объёмах данных.
Например, в регистре "Курсы валют" основной отбор может быть настроен так, чтобы всегда возвращались только актуальные курсы (с датой не позже текущей). Это избавляет от необходимости писать дополнительные условия в запросах.
Как настроить основной отбор:
- Откройте конфигуратор 1С:Предприятие.
- Перейдите в ветку
Общие → Регистры сведений. - Выберите нужный регистр и откройте его свойства.
- На вкладке
Данныенайдите разделОсновной отбор. - Добавьте условия (например,
Период <= &ТекущаяДата).
☑️ Проверка основного отбора
Ошибки в настройке основного отбора могут привести к:
- ❌ Потере данных — если отбор слишком строгий, часть записей не будет видна.
- ❌ Замедлению работы — если отбор слишком сложный или не оптимизирован.
- ❌ Некорректным отчётам — если отбор не учитывает бизнес-логику.
Что будет, если не настроить основной отбор?
Без основного отбора система будет считывать ВСЕ записи регистра, включая устаревшие. Например, в регистре "Цены номенклатуры" это приведёт к тому, что в документах будут подставляться цены, актуальные год назад, если они не перезаписаны новыми.
Взаимодействие измерений и основного отбора: как это работает на практике
Измерения и основной отбор тесно связаны: отбор применяется к комбинациям измерений. Например, если в регистре "Графики работы" измерениями являются "Сотрудник" и "Дата", а основной отбор ограничивает выборку текущим месяцем, то система вернёт только графики для указанного периода.
Рассмотрим пример на базе типовой конфигурации 1С:Зарплата и Управление Персоналом:
| Регистр сведений | Измерения | Основной отбор | Результат |
|---|---|---|---|
| Графики работы сотрудников | Сотрудник, Дата | Дата >= НачалоМесяца(&ТекущаяДата) | Только актуальные графики за текущий месяц |
| Цены номенклатуры | Номенклатура, Тип цен, Период | Период <= &ТекущаяДата | Только действующие цены на сегодня |
| Курсы валют | Валюта, Дата | Дата = MAX(Дата) по валюте | Последний актуальный курс для каждой валюты |
Если основной отбор неверно сконфигурирован, это может привести к невидимым ошибкам в бизнес-процессах. Например, если в регистре "Цены номенклатуры" отбор настроен на дату "<= ТекущаяДата", но не учитывает тип цен, то в документах могут подставляться цены из другого типа (оптовые вместо розничных).
Основной отбор должен учитывать ВСЕ измерения, которые влияют на актуальность данных. Например, для цен важны и дата, и тип цен, и возможно даже склад или контрагент.
Типичные ошибки при работе с регистрами сведений
Даже опытные разработчики иногда допускают ошибки при настройке регистров сведений. Вот наиболее распространённые:
- Избыточные измерения — добавление лишних полей, которые не используются в отчётах или бизнес-логике. Это усложняет поддержку и замедляет выборку.
- Неправильный основной отбор — например, отбор по дате "= ТекущаяДата" вместо "<= ТекущаяДата", из-за чего не видны записи за прошлые периоды.
- Отсутствие индексов — если по измерению часто ищут данные, но индекс не создан, запросы будут тормозить.
- Игнорирование прав доступа — настройка отбора без учёта ролей пользователей, из-за чего одни видят данные, а другие — нет.
Пример ошибки с основным отбором:
// Некорректный отбор (вернёт только записи за сегодня)
Период = &ТекущаяДата
// Правильный отбор (вернёт все актуальные записи)
Период <= &ТекущаяДата
Ещё одна частая проблема — дублирование записей. Если в регистре нет уникального ключа по измерениям, одна и та же комбинация (например, номенклатура + тип цен + дата) может встречаться несколько раз. Это приведёт к некорректной работе отчётов.
Как найти дубли в регистре сведений?
Используйте запрос с группировкой:
Номенклатура, ТипЦен, Дата, КОЛИЧЕСТВО(*) КАК Количество ИЗ РегистрСведений.ЦеныНоменклатуры СГРУППИРОВАТЬ ПО Номенклатура, ТипЦен, Дата ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 1ВЫБРАТЬ
Как оптимизировать работу с регистрами сведений
Чтобы регистры сведений работали быстро и корректно, следуйте этим рекомендациям:
- ⚡ Создавайте индексы для измерений, по которым часто происходит поиск. Например, если в регистре "Цены номенклатуры" часто ищут по полю "Номенклатура", добавьте индекс.
- 🧹 Очищайте устаревшие данные. Регулярно запускайте обработки, которые удаляют записи старше определённого периода (например, курсы валют за прошлый год).
- 🔒 Настраивайте права доступа. Ограничьте возможность изменения регистров только тем пользователям, которым это действительно нужно.
- 📈 Используйте периодичность. Если данные меняются редко (например, настройки пользователей), настройте регистр как
Непериодический— это ускорит доступ.
Для крупных баз данных полезно использовать виртуальные таблицы регистров сведений. Они позволяют получать данные в удобном для отчётов виде без написания сложных запросов. Например, виртуальная таблица СрезПоследних вернёт только актуальные записи на указанную дату.
Пример запроса с виртуальной таблицей:
ВЫБРАТЬ
ЦеныНоменклатурыСрезПоследних.Номенклатура,
ЦеныНоменклатурыСрезПоследних.Цена
ИЗ
РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ТекущаяДата) КАК ЦеныНоменклатурыСрезПоследних
Если регистр сведений используется в отчётах с большими выборками, рассмотрите возможность денормализации данных — переноса части информации в отдельные таблицы для ускорения.
Практические примеры: разбор регистров из типовых конфигураций
Давайте разберём несколько регистров сведений из стандартных конфигураций 1С, чтобы закрепить теорию.
1. Регистр "Курсы валют" (1С:Бухгалтерия):
- Измерения: Валюта, Дата.
- Ресурсы: Курс, Множитель.
- Основной отбор: Дата <= &ТекущаяДата (чтобы не показывать будущие курсы).
- Особенность: Для каждой валюты хранится история курсов, но в документах используется только последний актуальный.
2. Регистр "Цены номенклатуры" (1С:Управление торговлей):
- Измерения: Номенклатура, Тип цен, Период (дата начала действия).
- Ресурсы: Цена, Валюта цены.
- Основной отбор: Период <= &ТекущаяДата (чтобы показывать только действующие цены).
- Особенность: Цены могут зависеть от склада, контрагента или других параметров — это добавляет сложности в настройку.
3. Регистр "Настройки пользователей" (любая конфигурация):
- Измерения: Пользователь, ИмяНастройки.
- Ресурсы: Значение (строка, число или булево).
- Основной отбор: Обычно не используется, так как данные непериодические.
- Особенность: Часто используется для хранения индивидуальных параметров интерфейса или прав.
В типовых конфигурациях основной отбор чаще всего настроен на дату ("<= ТекущаяДата"), но в кастомизированных решениях могут быть более сложные условия, например, с учётом организации или склада.
FAQ: Ответы на частые вопросы о регистрах сведений
🔹 Почему в отчёте не показываются данные из регистра сведений, хотя записи есть?
Скорее всего, проблема в основном отборе. Проверьте:
- Не слишком ли строгие условия (например, отбор по точной дате вместо диапазона)?
- Соответствуют ли данные в регистре условиям отбора (например, если отбор по дате "<= ТекущаяДата", а в регистре записи с будущей датой)?
- Есть ли у пользователя права на чтение этого регистра?
Также проверьте, не используется ли в отчёте виртуальная таблица с дополнительными ограничениями (например, СрезПоследних вместо СрезПервых).
🔹 Можно ли в регистре сведений хранить данные с привязкой к документу?
Технически — да, но это неправильный подход. Регистры сведений предназначены для хранения независимых данных. Если информация привязана к документу (например, "Цена в заказе клиента"), её лучше хранить:
- В самом документе (в табличной части).
- В регистре накопления (если нужно отслеживать движения).
Исключение — служебные данные, которые не меняются при проведении документов (например, "Ставка НДС для номенклатуры").
🔹 Как узнать, какие регистры сведений используются в конфигурации?
Есть несколько способов:
- В конфигураторе перейдите в ветку
Общие → Регистры сведений— там будет полный список. - Используйте поиск по конфигурации (Ctrl+Shift+F) с фильтром "РегистрСведений".
- В режиме 1С:Предприятие откройте
Все функции → Регистры сведений(если права позволяют). - Просмотрите метаданные через встроенный отчёт "Анализ использования объектов".
Обратите внимание на регистры с пометкой "Периодический" — они чаще всего требуют настройки основного отбора.
🔹 Что делать, если регистр сведений тормозит запросы?
Причины замедления и способы решения:
| Причина | Решение |
|---|---|
| Отсутствуют индексы по измерениям | Добавьте индексы для полей, по которым часто ищут данные. |
| Слишком много устаревших записей | Настройте регламентное задание для очистки старых данных. |
| Сложный основной отбор | Упростите условия или перенесите часть логики в запрос. |
| Большое количество измерений | Проанализируйте, все ли измерения необходимы. Возможно, часть можно убрать. |
Также проверьте, не используются ли в запросах функции, которые не могут оптимизироваться (например, ПОДСТРОКА() в условиях ГДЕ).
🔹 Можно ли изменить структуру регистра сведений в работающей базе?
Да, но с осторожностью. При изменении структуры (добавлении/удалении измерений или ресурсов):
- Сделайте резервную копию базы.
- Проверьте, не используются ли удаляемые поля в отчётах или обработках.
- Если добавляете новое измерение, решите, какое значение будет у существующих записей (например, заполнить
NULLили значением по умолчанию). - После изменений перепроверьте все связанные отчёты и документы.
Лучше всего такие изменения вносить в тестовой базе, а затем переносить в рабочую через Конфигуратор или Расширения.
Если вам нужно временно отключить основной отбор (например, для отладки), используйте метод УстановитьОтбор() с пустыми параметрами перед чтением данных.