Новый регистр в Конфигураторе 1С 8.3: от выбора типа до записи из кода
Содержание
Регистр сведений
создают в Конфигураторе: откройте дерево конфигурации, щёлкните правой кнопкой по ветке «Регистры сведений» и выберите «Добавить». Дальше задайте имя, периодичность и режим записи, на вкладке «Данные» добавьте измерения и ресурсы, затем сохраните конфигурацию и обновите конфигурацию базы данных (F7). Это общий порядок для платформы 8.3, он не зависит от того, Бухгалтерия у вас, ЗУП или своя разработка.
Частая ошибка новичков — начинать с кнопки «Добавить». Сначала решают, какой регистр нужен и что будет ключом записи. Если ключ выбран неудачно, через месяц регистр придётся переделывать вместе с данными.
Какой регистр выбрать под задачу
В 1С четыре вида регистров. Для хранения справочной информации, которая меняется во времени, почти всегда подходит регистр сведений.
| Вид регистра | Что хранит | Пример |
|---|---|---|
| Регистр сведений | Значения по набору ключей, при необходимости — с датой | Цены, курсы, ответственные лица, настройки |
| Регистр накопления | Движения прихода и расхода, остатки или обороты | Товары на складах, взаиморасчёты |
| Регистр бухгалтерии | Проводки по плану счетов | Хозрасчётный регистр в БП |
| Регистр расчёта | Начисления с периодами действия | Начисления зарплаты |
Простое правило выбора:
- 📌 нужно знать «какое значение действует на дату» — регистр сведений;
- 📦 нужно знать «сколько осталось» или «сколько прошло за период» — регистр накопления;
- 🧾 нужны дебет, кредит и план счетов — регистр бухгалтерии ;
- 💰 нужны вытеснение и перерасчёт по периодам действия — регистр расчёта.
Регистр накопления пишется только документом-регистратором, а его ресурсы — только числа. У регистра сведений таких ограничений нет: ресурсом может быть строка, ссылка, булево. Поэтому его используют гораздо шире.
Что решить до создания
Ответьте на три вопроса и запишите ответы. По ним настраивается весь объект.
- Что является ключом? Например, «номенклатура + вид цены». Это будущие измерения.
- Нужна ли история? Если важно, какая цена была 1 марта, регистр делают периодическим.
- Кто пишет данные? Пользователь вручную или документ при проведении. От этого зависит режим записи.
Подготовка конфигурации к изменениям
Если конфигурация типовая и стоит на поддержке, кнопка «Добавить» будет недоступна. Объекты на замке менять нельзя.
Есть два пути:
- Расширение конфигурации . Регистр создаётся в расширении, типовая остаётся на полной поддержке и спокойно обновляется. Для доработок типовых баз это предпочтительный способ. Расширения появились в 8.3.6, а возможность добавлять в них собственные регистры — в более поздних версиях платформы, поэтому держите платформу актуальной.
- Включение возможности изменений.
Конфигурация → Поддержка → Настройка поддержки, кнопка включения изменений. После этого обновления типовой придётся ставить через сравнение и объединение.
Включение возможности изменений необратимо усложняет обновление типовой базы. Перед ним выгрузите информационную базу в файл .dt через Администрирование → Выгрузить информационную базу.
Для своей разработки «с нуля» ничего этого не нужно: просто откройте конфигурацию через Конфигурация → Открыть конфигурацию.
Создание регистра сведений в Конфигураторе: по шагам
Шаг 1. Добавить объект
- В дереве конфигурации раскройте ветку «Регистры сведений».
- Правой кнопкой по ветке — «Добавить». Откроется окно редактирования объекта.
- На первой вкладке задайте Имя латиницей или кириллицей без пробелов, например
ЦеныПоставщиков. Синоним заполнится сам — поправьте его под пользователя.
Имя потом используется в коде и запросах. Переименовывать регистр, на который уже ссылаются модули, неудобно, так что подумайте над ним сразу.
Шаг 2. Выбрать периодичность
Свойство «Периодичность» определяет, хранит ли регистр историю и с какой точностью.
| Значение | Когда выбирать |
|---|---|
| Непериодический | История не нужна: «ответственный за склад», настройки |
| В пределах секунды | Значение меняется несколько раз в день |
| В пределах дня | Цены, курсы — самый частый вариант |
| В пределах месяца | Плановые показатели, нормативы на месяц |
| В пределах квартала / года | Редко меняющиеся значения |
| Позиция регистратора | Только при подчинении регистратору: каждая запись привязана к моменту документа |
Для периодического регистра в записи появляется поле Период. При периодичности «в пределах дня» платформа приводит период к началу дня. Две записи с одинаковыми измерениями в один день не уживутся.
Шаг 3. Выбрать режим записи
- Независимый. Записи вводят вручную в форме списка или записывают кодом. Подходит для справочной информации.
- Подчинение регистратору. Записи создаёт документ при проведении, при отмене проведения они удаляются. Список документов-регистраторов задаётся на вкладке «Регистраторы».
Режим записи и периодичность лучше выбрать правильно с первого раза: их смена на заполненном регистре ведёт к реструктуризации и может потребовать переноса данных.
Шаг 4. Подсистемы, права, формы
- Отметьте подсистему, иначе пользователи не увидят регистр в интерфейсе «Такси».
- В ролях выдайте права на чтение и, если нужно, на изменение. Без прав регистр не откроется даже при наличии команды.
- Формы можно не создавать: платформа сгенерирует формы списка и записи автоматически. Своя форма нужна, если требуется особое поведение.
Измерения, ресурсы и реквизиты регистра сведений
На вкладке «Данные» три списка. От того, куда вы положите поле, зависит, будет ли оно частью ключа.
| Тип поля | Роль | Пример для цен поставщиков |
|---|---|---|
| Измерение | Часть ключа записи, по нему ищут | Поставщик, Номенклатура |
| Ресурс | Хранимое значение | Цена |
| Реквизит | Сопутствующая информация, не ключ | Комментарий, Автор изменения |
Уникальность записи определяет сочетание периода и всех измерений. Если положить «Цену» в измерения, регистр начнёт хранить несколько цен на одну дату — почти наверняка это ошибка проектирования.
Полезные свойства измерений
- 🔑 Ведущее. Запись «принадлежит» объекту: при удалении элемента справочника связанные записи регистра тоже удалятся, а в форме элемента удобно выводить его записи.
- 🔍 Основной отбор. Для регистров с подчинением регистратору позволяет быстро отбирать записи по измерению.
- 🚫 Запрет незаполненных значений. Не даст записать строку с пустым измерением. Включайте для ключей, без которых запись бессмысленна.
- 📇 Индексировать. Описано ниже, в разделе про производительность.
Типы ресурсов
Для каждого ресурса задайте тип и, для чисел, длину и точность. Цене обычно хватает 15 знаков с точностью 2. Для курсов валют точность берут больше — 4 знака после запятой.
Ресурс составного типа удобен на этапе прототипа, но в запросах с ним сложнее работать и он хуже индексируется. Если тип известен, указывайте один.
Обновить конфигурацию базы данных
После настройки сохраните конфигурацию и выполните Конфигурация → Обновить конфигурацию базы данных (F7). Платформа покажет список изменений структуры и попросит подтвердить их.
Добавление нового регистра создаёт в базе новые таблицы. Для такого обновления обычно нужен монопольный доступ: попросите пользователей выйти из базы, иначе обновление не применится.
Виртуальные таблицы: срез последних и срез первых
У периодического регистра сведений есть две виртуальные таблицы. Они избавляют от ручного поиска «самой свежей записи на дату».
- СрезПоследних — последние записи на дату по каждому сочетанию измерений. Например, действующая цена на 15 марта.
- СрезПервых — первые записи после даты. Используют реже, например чтобы найти ближайшее будущее изменение.
У непериодического регистра виртуальных таблиц нет — там каждая запись и так единственная по ключу.
Пример запроса цен на дату:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Цены.Номенклатура КАК Номенклатура,
| Цены.Цена КАК Цена
|ИЗ
| РегистрСведений.ЦеныПоставщиков.СрезПоследних(
| &НаДату,
| Поставщик = &Поставщик) КАК Цены";
Запрос.УстановитьПараметр("НаДату", ТекущаяДатаСеанса());
Запрос.УстановитьПараметр("Поставщик", Поставщик);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Строка(Выборка.Номенклатура) + ": " + Формат(Выборка.Цена, "ЧДЦ=2"));
КонецЦикла;
Условие — внутрь параметров
Главный приём оптимизации: отбор по измерениям пишите во втором параметре виртуальной таблицы, как в примере выше. Тогда платформа сначала отберёт нужные записи, а потом построит срез.
Если вместо этого написать ГДЕ Цены.Поставщик = &Поставщик после таблицы, срез построится по всем поставщикам и только потом отфильтруется. На регистре в миллион строк разница во времени заметна сразу.
В параметрах можно отбирать только по измерениям. Условие на ресурс оставьте в ГДЕ.
Индексы и скорость работы регистра
Каждый регистр сведений получает индекс по своему ключу: период и измерения в порядке их следования. Поэтому порядок измерений имеет значение.
Ставьте первым измерение, по которому чаще всего отбирают. Если почти все запросы идут «по поставщику», пусть «Поставщик» стоит выше «Номенклатуры». Порядок меняется стрелками в списке измерений.
Свойство «Индексировать» у измерения, ресурса или реквизита создаёт дополнительный индекс:
- Не индексировать — по умолчанию;
- Индексировать — отдельный индекс по полю;
- Индексировать с доп. упорядочиванием — индекс с учётом сортировки, нужен для упорядоченных выборок в динамических списках.
Индексируйте реквизит или ресурс, если по нему регулярно отбирают в запросах или в списке. Лишние индексы замедляют запись, поэтому не включайте их «на всякий случай».
Если регистр большой и в отчётах постоянно нужен срез последних, посмотрите свойство «Разрешить итоги среза последних» в свойствах регистра. Платформа будет хранить готовый срез, а чтение ускорится ценой более медленной записи.
Как заполнять регистр из кода
Для записи есть два инструмента: менеджер записи и набор записей. Их часто путают.
| Инструмент | Что делает | Когда брать |
|---|---|---|
| Менеджер записи | Читает и пишет одну запись по ключу | Только независимый режим, единичная правка |
| Набор записей | Работает со всеми записями по отбору | Массовая запись, любой режим |
Одна запись через менеджер
МенеджерЗаписи = РегистрыСведений.ЦеныПоставщиков.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Период = НачалоДня(ТекущаяДатаСеанса());
МенеджерЗаписи.Поставщик = Поставщик;
МенеджерЗаписи.Номенклатура = Номенклатура;
МенеджерЗаписи.Цена = 1250;
МенеджерЗаписи.Записать();
Если запись с таким периодом и измерениями уже есть, Записать() её заменит: параметр замещения у менеджера по умолчанию равен Истина.
Много записей через набор
Набор = РегистрыСведений.ЦеныПоставщиков.СоздатьНаборЗаписей();
Набор.Отбор.Период.Установить(НачалоДня(ТекущаяДатаСеанса()));
Набор.Отбор.Поставщик.Установить(Поставщик);
Для Каждого СтрокаПрайса Из ТаблицаПрайса Цикл
Запись = Набор.Добавить();
Запись.Период = НачалоДня(ТекущаяДатаСеанса());
Запись.Поставщик = Поставщик;
Запись.Номенклатура = СтрокаПрайса.Номенклатура;
Запись.Цена = СтрокаПрайса.Цена;
КонецЦикла;
Набор.Записать(Истина);
Записать(Истина) удаляет все записи, подходящие под отбор, и пишет новые. Так прайс поставщика на дату полностью перезаписывается одной транзакцией.
Набор с пустым отбором и Записать(Истина) очистит регистр целиком. Всегда устанавливайте отбор перед записью с замещением.
Запись из документа при проведении
Для регистра с подчинением регистратору записи формируют в обработке проведения документа:
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.ЦеныПоставщиков.Записывать = Истина;
Для Каждого СтрокаТЧ Из Товары Цикл
Движение = Движения.ЦеныПоставщиков.Добавить();
Движение.Период = Дата;
Движение.Поставщик = Контрагент;
Движение.Номенклатура = СтрокаТЧ.Номенклатура;
Движение.Цена = СтрокаТЧ.Цена;
КонецЦикла;
КонецПроцедуры
Документ должен быть отмечен на вкладке «Регистраторы» самого регистра, иначе свойства Движения.ЦеныПоставщиков у него не будет. Конструктор движений (кнопка на вкладке «Движения» документа) сгенерирует такой код автоматически.
Чтение одной записи по ключу
Для независимого регистра удобен метод Получить менеджера регистра:
Отбор = Новый Структура("Поставщик, Номенклатура", Поставщик, Номенклатура);
Значения = РегистрыСведений.ЦеныПоставщиков.ПолучитьПоследнее(ТекущаяДатаСеанса(), Отбор);
ЦенаНаСегодня = Значения.Цена;
ПолучитьПоследнее возвращает структуру ресурсов на дату — это тот же срез последних, но для одной записи. Для непериодического регистра используйте Получить(Отбор).