Разработка и Конфигурация · 10 мин
Как связать справочник с регистром сведений в 1С
Как связать справочник с регистром сведений в 1С через измерения и ресурсы. Настройка в конфигураторе, ведение подчинённого регистра, примеры кода и типичные ошибки.
Связь справочника с регистром сведений — базовый приём в 1С, который позволяет хранить дополнительные данные об элементах справочника: цены номенклатуры, адреса контрагентов, ответственных лиц, параметры оборудования. Технически связь реализуется через измерение регистра, тип которого указывает на нужный справочник.
Такой подход предпочтительнее добавления реквизитов в сам справочник, когда значений несколько на один элемент, они меняются во времени или должны редактироваться независимо. Например, история цен товара или несколько телефонов контрагента невозможно корректно хранить в реквизитах справочника, а регистр сведений решает эту задачу штатно.
Ниже разберём оба сценария: настройку связи в конфигураторе при разработке собственной конфигурации и работу с уже существующими связями в типовых решениях, включая программное чтение и запись данных.
Когда нужна связь справочника с регистром сведений
Прямое добавление реквизитов в справочник работает, пока на один элемент приходится одно значение: единица измерения, артикул, ставка НДС. Как только появляется множественность или историчность, реквизиты перестают справляться.
Типичные ситуации, где нужен регистр сведений:
- несколько значений на один элемент — телефоны, адреса, банковские счета контрагента;
- значения, меняющиеся во времени, — цены, курсы, проценты скидок;
- данные, которые редактируют другие пользователи или другие процессы, без перезаписи карточки элемента;
- параметры, зависящие от комбинации элементов — например, цена товара для конкретного контрагента.
Обратный признак: если вы добавляете в справочник реквизиты «Телефон1», «Телефон2», «Телефон3» — это верный сигнал, что данные пора выносить в регистр сведений.
Создание связи в конфигураторе
Откройте конфигуратор, в дереве конфигурации найдите ветку «Регистры сведений» и создайте новый регистр (или откройте существующий). Дальнейшая настройка сводится к нескольким шагам.
- 1Создайте регистр сведений и задайте имя, например «АдресаКонтрагентов»
- 2Добавьте измерение, например «Контрагент», с типом «СправочникСсылка.Контрагенты»
- 3Установите у измерения признак «Ведущее», если запись не должна существовать без элемента справочника
- 4Добавьте ресурсы — хранимые значения: адрес, телефон, цена и т.п.
- 5При необходимости истории установите периодичность регистра: «В пределах секунды», «дня», «месяца» и т.д.
- 6Обновите конфигурацию базы данных (F7) и согласитесь с реструктуризацией
Признак «Ведущее» у измерения важен: он означает, что при удалении элемента справочника связанные записи регистра будут удалены автоматически. Без этого признака в регистре останутся «осиротевшие» записи, ссылающиеся на несуществующие объекты.
Если на один элемент справочника должна приходиться только одна запись — например, основной склад подразделения — оставьте регистр непериодическим с единственным измерением. Уникальность измерения сама обеспечит ограничение «один элемент — одна запись».
Периодический или непериодический регистр
Выбор периодичности определяет, сможете ли вы хранить историю изменений значения. Это решение принимается на этапе проектирования, и изменить его потом без потери данных сложно.
| Критерий | Непериодический | Периодический |
|---|---|---|
| Количество записей на элемент | Одна | Много, с разными датами |
| История изменений | Не хранится, старое значение затирается | Хранится, доступен срез на любую дату |
| Типичное применение | Основной склад, фото, признак | Цены, курсы валют, ставки |
| Чтение актуального значения | Прямое чтение записи | Срез последних на дату |
Периодичность «В пределах секунды» подходит, когда значение может меняться несколько раз в день. «В пределах дня» — стандарт для цен и курсов. Более крупные интервалы (месяц, год) используются редко и ограничивают точность истории.
Ввод данных из карточки элемента справочника
Чтобы пользователь видел и редактировал записи регистра прямо из формы элемента справочника, в типовых конфигурациях применяется два подхода. Первый — размещение на форме элемента динамического списка регистра с отбором по ссылке. Второй — команда перехода к списку регистра с автоматически установленным отбором.
В собственной конфигурации проще всего добавить на форму элемента таблицу с динамическим списком регистра сведений и в параметрах списка задать отбор: измерение равно текущей ссылке. Тогда при открытии карточки контрагента пользователь сразу увидит все его адреса и сможет добавлять новые.
В типовых конфигурациях (УТ, ERP, БП) связь уже настроена: в карточке номенклатуры есть переход к ценам, в карточке контрагента — к контактной информации. Эти механизмы построены именно на регистрах сведений, подчинённых по измерению справочнику, и их можно использовать как образец.
Программная работа со связанными данными
Запись значения в регистр сведений выполняется через менеджер записи или набор записей. Для одиночной записи удобнее менеджер:
Запись = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
Запись.Период = ТекущаяДатаСеанса();
Запись.Номенклатура = СсылкаНаТовар;
Запись.Цена = 1500;
Запись.Записать();
Чтение актуального значения из периодического регистра — через срез последних:
Отбор = Новый Структура("Номенклатура", СсылкаНаТовар);
Срез = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДатаСеанса(), Отбор);
Если ЗначениеЗаполнено(Срез.Цена) Тогда
// используем Срез.Цена
КонецЕсли;
В запросах связь справочника с регистром выражается через левое соединение или виртуальную таблицу среза последних. Виртуальная таблица «СрезПоследних» эффективнее, когда нужны актуальные значения по многим элементам сразу — например, при выводе списка товаров с ценами.
ВЫБРАТЬ Номенклатура.Ссылка КАК Товар, Цены.Цена КАК Цена ИЗ Справочник.Номенклатура КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Дата, ) КАК Цены ПО Цены.Номенклатура = Номенклатура.СсылкаТипичные ошибки и ограничения
Отдельно стоит упомянуть права доступа. Регистр сведений имеет собственные права, независимые от справочника: пользователь может видеть карточку контрагента, но не видеть его адреса, если на регистр не выданы права чтения. Проверяйте настройку ролей для обоих объектов.
Проверка результата
Как проверить результат
Запись сохраняется, измерение заполнено ссылкой на элемент справочника
Ошибка уникальности или пустое измерение
В списке видны только записи текущего элемента
Отображаются записи всех элементов
Связанные записи регистра удаляются вместе с элементом (при ведущем измерении)
В регистре остаются записи с битыми ссылками
Возвращается запись с максимальной датой, не превышающей заданную
Возвращается старая или будущая запись
Быстрая проверка через консоль запросов: выберите элемент справочника и выполните запрос к регистру с отбором по измерению. Если запись находится, а в форме элемента не отображается — проблема в настройке отбора динамического списка, а не в данных.
Что важно запомнить
Связь создаётся измерением регистра с типом ссылки на справочник. Признак «Ведущее» обеспечивает каскадное удаление, периодичность — историю значений. Для ввода из карточки используйте динамический список с отбором по ссылке, для чтения актуальных значений — срез последних.
Частые вопросы
Можно ли связать один регистр сведений с несколькими справочниками?
Да. Добавьте несколько измерений, каждое со своим типом ссылки. Например, регистр «Цены по контрагентам» может иметь измерения «Номенклатура» и «Контрагент» — тогда каждая запись хранит цену конкретного товара для конкретного клиента. Уникальность записи определяется комбинацией всех измерений.
Чем связь через регистр сведений лучше табличной части справочника?
Табличная часть хранится внутри элемента и перезаписывается вместе с ним, что вызывает конфликты при одновременной работе пользователей и не даёт истории изменений. Регистр сведений позволяет редактировать записи независимо, хранить периодичность и строить эффективные выборки. Табличная часть оправдана только для небольших списков, редактируемых строго вместе с карточкой.
Как получить все элементы справочника, для которых нет записи в регистре?
Используйте запрос с левым соединением и условием «ЕСТЬ NULL»: выберите элементы справочника, соедините с регистром по измерению и отфильтруйте строки, где поле регистра равно NULL. Это стандартный способ найти товары без цен или контрагентов без адресов.
Что делать, если в регистре появились записи с битыми ссылками?
Битые ссылки возникают при удалении элементов справочника, когда у измерения не установлен признак «Ведущее». Установите этот признак для будущего, а существующие записи очистите обработкой: запросом найдите записи, у которых ссылка измерения не существует в справочнике, и удалите их набором записей.
Нужен ли регистратор для связи справочника с регистром сведений?
Нет. Режим «Подчинение регистратору» используется, когда записи создаются документами — например, установка цен документом «Установка цен номенклатуры». Для простой связи «элемент — значение» достаточно независимого регистра, где записи создаются вручную или программно.
Как вывести значение из регистра сведений в список справочника?
Если список справочника реализован как динамический список, дополните его запрос левым соединением с регистром (или со срезом последних для периодического регистра) и выведите нужный ресурс как колонку. Учтите, что соединение с большим регистром может замедлить открытие списка — при необходимости добавьте индексы по измерению.