Регистр сведений в 1С: запись вручную и из кода

· 8 мин

Содержание

Чтобы вручную внести запись в регистр сведений , нужно открыть его форму списка (чаще всего — через Главное меню → Все функции → Регистры сведений) и нажать «Создать». Из встроенного языка запись создают либо менеджером записи (СоздатьМенеджерЗаписи), либо набором записей (СоздатьНаборЗаписей). Какой способ подойдёт — зависит от того, независимый регистр или подчинён регистратору, периодический он или нет.

Ниже — оба способа заполнения с точными путями меню и рабочими примерами кода, разбор ошибки, когда запись «не сохраняется» или затирает чужие данные, и проверка результата запросом.

Что хранит регистр сведений и что влияет на способ записи

Регистр сведений — это таблица, где ключ записи задают измерения, а полезные данные — ресурсы. Есть ещё реквизиты (справочная информация, в ключ не входят). Для одной комбинации измерений в регистре может быть только одна запись — это принципиально отличает его от регистра накопления.

На способ заполнения влияют две настройки регистра, заданные в конфигураторе:

  • 🔑 Режим записи. Независимый — записи живут сами по себе, их можно добавлять вручную и кодом напрямую. Подчинён регистратору — записи создаёт только документ-регистратор при проведении, вручную их не внести.
  • 📅 Периодичность. Непериодический — ключ только из измерений. Периодический (в пределах секунды, дня, месяца и т. д.) — в ключ добавляется поле Период, и для одной комбинации измерений хранится история значений по датам.

Типичный пример независимого периодического регистра — «Цены номенклатуры»: по одной позиции хранится цена на каждую дату. Пример подчинённого регистратору — «Штатное расписание» в ЗУП, где записи делает кадровый документ.

Прежде чем заполнять, посмотрите эти два свойства регистра. Если он подчинён регистратору, дальше читать про ручной ввод и менеджер записи незачем — такой регистр заполняется только через движения документа.

Как открыть регистр сведений в интерфейсе

Часть регистров выведена в нужный раздел прикладного решения и открывается оттуда. Но многие служебные регистры в командном интерфейсе не показаны — до них добираются через «Все функции».

Включить эту команду нужно один раз:

  1. Нажмите кнопку Главное меню (значок в левом верхнем углу интерфейса «Такси»).
  2. Выберите Сервис → Параметры.
  3. Поставьте флажок «Отображать команду “Все функции”» и нажмите «ОК».

После этого откройте сам регистр:

  1. Главное меню → Все функции.
  2. Разверните ветку Регистры сведений.
  3. Дважды щёлкните нужный регистр — откроется его форма списка.

В форме списка видны колонки измерений, ресурсов и (для периодического регистра) период. Здесь же — кнопки добавления и удаления записей.

Если регистр подчинён регистратору, форма списка откроется в режиме просмотра: кнопка создания будет недоступна. Это не ошибка — так и задумано.

Ручное добавление записи через форму списка

Для независимого регистра запись вводят прямо в форме:

  1. В открытой форме списка нажмите «Создать» (или клавишу Insert).
  2. Если регистр периодический — заполните поле Период. Это дата (а для периодичности «в пределах секунды» — дата со временем), на которую действует значение.
  3. Заполните все измерения — это ключ записи. Пустое измерение тоже допустимо, если так настроено, но чаще его заполняют обязательно.
  4. Заполните ресурсы — собственно значения (цена, количество, признак).
  5. При необходимости заполните реквизиты.
  6. Нажмите «Записать и закрыть».

Если ввести запись с той же комбинацией измерений (и периода — для периодического регистра), что уже есть, программа не задвоит её, а предложит перезаписать. Это следствие уникальности ключа.

Редактировать существующую запись можно двойным щелчком по строке. Удаляется запись клавишей Delete и подтверждением — для регистра сведений удаление происходит сразу, без пометки на удаление.

Если нужно внести десятки однотипных записей, ручной ввод утомителен и легко ошибиться. Для пакетной загрузки удобнее обработка «Загрузка данных из табличного документа» или собственный код — о нём ниже.

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

В коде есть два механизма. Выбор между ними — главный вопрос при программной записи.

Менеджер записи — одна запись за раз

Подходит для независимого регистра, когда нужно записать или обновить одну запись по известному ключу:

Менеджер = РегистрыСведений.ЦеныНоменклатуры.СоздатьМенеджерЗаписи();
Менеджер.Период       = ТекущаяДата();
Менеджер.Номенклатура = ВыбраннаяНоменклатура;  // измерение
Менеджер.Цена         = 1500;                    // ресурс
Менеджер.Записать(Истина); // Истина — перезаписать, если запись с таким ключом уже есть

Параметр Записать(Истина) означает: если запись с такой комбинацией измерений (и периода) уже существует — заместить её. При Записать(Ложь) и наличии такой записи будет вызвано исключение.

Набор записей — когда записей несколько

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

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

Запись = Набор.Добавить();
Запись.Период       = ТекущаяДата();
Запись.Номенклатура = ВыбраннаяНоменклатура;
Запись.Цена         = 1500;

Набор.Записать(Истина); // Истина — заместить все записи, попадающие под отбор

Здесь важны две вещи:

  • Отбор задаёт, что именно будет замещено. Записать(Истина) удаляет из регистра все записи, подходящие под установленный отбор, и пишет на их место содержимое набора. Если отбор установлен по номенклатуре — затронется только эта номенклатура.
  • Значения в самих записях должны соответствовать отбору. Если в отборе одна номенклатура, а в добавленной записи — другая, при записи возникнет ошибка.

Если вызвать Набор.Записать(Истина) без установленного отбора, замещение затронет весь регистр — все прежние записи будут стёрты. Это самая частая причина потери данных при работе с набором.

Периодический регистр: не забыть период

Для периодического регистра поле Период входит в ключ. Менеджер записи тогда сам по себе обновит запись именно на эту дату, а прежние даты не тронет. У набора записей для управления историей по датам отбор можно дополнить периодом:

Набор.Отбор.Период.Установить(ДатаСреза);

Так замещение затронет только записи на указанную дату.

Регистр, подчинённый регистратору: запись через движения

Если регистр подчинён регистратору, его записи формирует документ при проведении — в модуле объекта документа, в обработчике ОбработкаПроведения. Отдельно вызывать менеджер или набор для такого регистра нельзя: отбор у набора будет только по регистратору, и запись «чужих» строк приведёт к ошибке.

Движения добавляют через коллекцию Движения документа:

Процедура ОбработкаПроведения(Отказ, Режим)
    Движения.ЦеныНоменклатуры.Записывать = Истина;
    Движение = Движения.ЦеныНоменклатуры.Добавить();
    Движение.Период       = Дата;
    Движение.Номенклатура = Номенклатура;
    Движение.Цена         = Цена;
КонецПроцедуры

Флаг Записывать = Истина говорит платформе сбросить накопленные движения в регистр в конце проведения. Все прежние записи этого документа при этом замещаются новыми — чистить регистр перед повторным проведением не нужно, платформа делает это сама.

Загрузка данных в регистр при обмене и из внешних источников

Когда данные приходят извне — из обмена, файла, другой базы — регистр заполняют тем же набором записей, но в цикле. Общая схема:

  1. Читаете источник (табличный документ, JSON, результат запроса из базы-источника).
  2. Сопоставляете поля источника с измерениями и ресурсами регистра.
  3. Группируете строки по значению измерения, по которому будете делать отбор.
  4. На каждую группу создаёте набор, ставите отбор, добавляете записи, вызываете Записать(Истина).
Сопоставление полей
Колонка «Товар»→Измерение «Номенклатура»
Колонка «Дата»→Поле «Период» (для периодического регистра)
Колонка «Сумма»→Ресурс «Цена»
Признак из файла→Реквизит

Если регистр подчинён регистратору, то при обмене записи придут вместе с документом-регистратором: отдельно их грузить не нужно и нельзя — они часть движений документа.

При массовой загрузке оборачивайте запись в транзакцию и обрабатывайте ошибки. Если среди тысяч строк одна с некорректным значением измерения, без обработки исключения упадёт вся загрузка, а часть данных останется записанной наполовину.

Полезно помнить про ведущее измерение: если у измерения установлен признак «Ведущее» и значение-владелец (например, элемент справочника) удаляется, связанные записи регистра удаляются автоматически. На это стоит рассчитывать при проектировании обмена, а не вычищать регистр вручную.

Как проверить, что данные записались

Быстрее всего — открыть форму списка регистра и посмотреть строки. Для точечной проверки из кода у менеджера регистра есть готовые методы.

Получить ресурсы по ключу (непериодический регистр):

Отбор = Новый Структура("Номенклатура", ВыбраннаяНоменклатура);
Данные = РегистрыСведений.ЦеныНоменклатуры.Получить(Отбор);
Цена = Данные.Цена;

Получить актуальное значение на дату (периодический регистр):

Отбор = Новый Структура("Номенклатура", ВыбраннаяНоменклатура);
Данные = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ТекущаяДата(), Отбор);
Цена = Данные.Цена;

Метод ПолучитьПоследнее(Период, Отбор) возвращает значения ресурсов на ближайшую дату не позже указанной. Парный ему ПолучитьПервое берёт ближайшую запись не раньше даты.

Для сверки большого объёма удобнее запрос к таблице регистра — обычной (РегистрСведений.ЦеныНоменклатуры) или виртуальной СрезПоследних/СрезПервых для периодических регистров. Запрос покажет и дубли ключей, если они как-то образовались, и пустые измерения.

Перед записью регистра из кода проверьте
Выполнено: 0 / 6

Почему запись не сохраняется или затирает лишнее

Диагностика: выберите симптом

Частые вопросы

Чем менеджер записи отличается от набора записей?
Менеджер работает с одной записью по ключу — удобно обновить или удалить конкретную строку. Набор работает с группой записей по отбору и умеет замещать сразу целый срез. Для одной строки берите менеджер, для нескольких или для полной перезаписи по отбору — набор.
Можно ли заполнить вручную регистр, подчинённый регистратору?
Нет. Записи в таком регистре создаёт только документ-регистратор при проведении. Чтобы изменить данные, правят и перепроводят документ, а не сам регистр.
Как удалить одну запись из регистра сведений кодом?
Через менеджер записи: создайте его, задайте ключевые поля (измерения и период), вызовите Прочитать(), затем Удалить(). Либо очистите набор по отбору и запишите пустой набор с замещением.
Зачем в периодическом регистре поле «Период» и что в него писать?
Период — часть ключа: он позволяет хранить историю значений по датам. Пишите дату, с которой значение действует. Срез последних потом сам отдаст актуальную запись на нужный момент.
Что такое ведущее измерение?
Это измерение со ссылкой на объект (справочник, документ), при удалении которого записи регистра удаляются автоматически. Признак «Ведущее» задаётся в свойствах измерения в конфигураторе.