Перейти к содержимому

6.14 Что произойдёт, если удалить запись регистра сведений и создать новую с такими же полями?

Опубликовано: Обновлено:

Telegram → Просто о платформе 1С

❓ 6.14 Что произойдёт, если удалить запись регистра сведений и создать новую с такими же полями (измерениями, ресурсами, реквизитами)?


Здесь речь о данных информационной базы, а не об объектах встроенного языка.

Объектные данные имеют собственную ссылку. Это элементы справочников, документы, элементы планов видов характеристик и другие объекты.

Если удалить элемент и обычным способом создать новый с теми же реквизитами, ссылки будут разными. Одинаковое содержимое не делает их одним объектом.

Записи регистров собственной ссылки не имеют. Для них используется другой принцип: запись определяется значениями ключевых полей.

У объекта идентичность определяется ссылкой, у записи регистра — ключом записи.


Ключ записи — это комбинация полей, значения которых обеспечивают уникальность записи регистра.

Платформа не позволяет существовать двум записям с одинаковыми значениями ключевых полей.

Состав ключа зависит от периодичности и подчиненности регистра:

Регистр сведенийКлюч записи
НепериодическийИзмерения
ПериодическийИзмерения и Период
Периодичность «По позиции регистратора»Измерения, Период и Регистратор

Ресурсы и реквизиты хранят содержание записи, но в ключ записи не входят.

Например, если в непериодическом регистре измерениями являются Организация и Номенклатура:

Организация = Ромашка
Номенклатура = Стол
Цена = 1000

то ключ записи:

Организация + Номенклатура

Ключ записи позволяет однозначно идентифицировать запись регистра по значениям ключевых полей.


У регистра сведений, подчинённого регистратору, существует поле НомерСтроки, но оно не входит в ключ записи регистра сведений.

Поэтому разные номера строк не позволяют сохранить несколько записей с одинаковыми значениями ключевых полей.

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


Добавление, изменение и удаление данных регистра выполняются наборами записей.

  • У независимого регистра область набора ограничивается отбором, в частности по измерениям.
  • У подчинённого регистра набор связан с регистратором.

При записи с замещением существующие данные в пределах отбора заменяются содержимым набора.

Отбор определяет, какие записи будут заменены, а содержимое набора — что останется вместо них.


Особенно важно понимать работу отбора при записи независимого регистра сведений.

Допустим, в регистре ЦеныНоменклатуры находятся записи:

НоменклатураЦена
Стол10 000
Стул5 000
Шкаф30 000

Создадим пустой набор записей без отбора:

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

Получается:

Отбор не установлен
↓
Область записи — весь регистр
↓
Набор пустой
↓
Все записи регистра удаляются

Если в набор без отбора добавить одну запись, то при записи с замещением существующие записи будут заменены содержимым набора.

Поэтому запись независимого регистра без отбора с замещением может затронуть весь регистр.


Для работы с отдельной записью независимого регистра можно использовать РегистрСведенийМенеджерЗаписи.

Через него выполняются:

  • программная запись менеджером записи;
  • интерактивная запись из формы записи;
  • интерактивное редактирование записи в форме списка.

Сам менеджер работает с данными регистра через наборы записей.


Почему обработчики вызываются дважды при записи менеджера записи?

Заголовок раздела «Почему обработчики вызываются дважды при записи менеджера записи?»

При записи существующей записи через менеджер записи платформа последовательно записывает два набора:

  1. Пустой набор (Количество = 0) — для удаления прежней записи.
  2. Набор с записью (Количество = 1) — для записи новых значений.

Для каждого набора выполняются обработчики модуля набора записей:

ПередЗаписью → запись в базу → ПриЗаписи

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

Сначала обработчик получает пустой набор, затем — набор с новой записью.

Пустой набор — это ноль строк, а не строка с пустыми значениями. Код модуля набора должен учитывать этот случай.

Например:

Процедура ПередЗаписью(Отказ, Замещение)
Если Количество() = 0 Тогда
Возврат;
КонецЕсли;
// Работа с записями набора
КонецПроцедуры

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

Ключ определяет запись. Отбор определяет область записей, с которой работает набор. Именно эту область платформа заменяет при записи набора с замещением.