Как программно удалить запись из регистра сведений в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

В процессе разработки в системе 1С:Предприятие часто возникает необходимость программного манипулирования данными регистров сведений. Одной из самых распространенных задач является удаление конкретной записи. В этой статье мы подробно разберем, как это сделать правильно, какие методы существуют и с какими подводными камнями можно столкнуться в процессе реализации.

Метод 1: Использование Менеджера записи

Самый простой и интуитивно понятный способ удаления одной записи из независимого регистра сведений — это использование объекта РегистрСведенийМенеджерЗаписи. Этот метод идеально подходит, когда нам точно известны значения всех ключевых измерений записи, которую нужно удалить.

Рассмотрим по шагам, как работает этот механизм:

  1. Создаем объект менеджера записи для конкретного регистра.
  2. Заполняем значения всех измерений (и периода, если регистр периодический). Это необходимо, чтобы система могла однозначно идентифицировать запись.
  3. Вызываем метод Прочитать(), чтобы проверить наличие записи в базе.
  4. Вызываем метод Удалить().

Проанализируем пример кода:


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

// Пытаемся прочитать запись из базы данных
Запись.Прочитать();

// Если запись существует, удаляем ее
Если Запись.Выбран() Тогда
    Запись.Удалить();
КонецЕсли;

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

Метод 2: Удаление через Набор записей (оптимальный способ)

Хотя менеджер записи удобен, опытные разработчики часто предпочитают использовать РегистрСведенийНаборЗаписей. Это более универсальный и эффективный метод, особенно если нужно очистить данные по определенному фильтру. При использовании набора записей мы не «вытягиваем» данные из базы, чтобы их потом удалить, а просто даем команду системе перезаписать область данных пустой коллекцией.

Разберем алгоритм работы с набором записей:

  1. Создаем набор записей.
  2. Устанавливаем отбор по необходимым измерениям.
  3. Вызываем метод Записать(Истина). Параметр Истина означает режим замещения: система удалит все существующие в базе записи, попадающие под фильтр, и запишет те, что находятся в наборе. Если набор пустой — данные просто удалятся.

Посмотрим на пример:


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

// Записываем пустой набор с замещением
Набор.Записать(Истина);

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

Разбор ошибки «Недопустимое значение параметра» в методе Выбрать()

Иногда разработчики пытаются найти запись через метод Выбрать(), передавая в него структуру отбора, и получают ошибку. Выясним причину этой ситуации. Метод Выбрать(СтруктураОтбора) имеет жесткие ограничения. В качестве полей для отбора могут выступать только измерения, для которых установлено свойство Индексировать или Ведущее.

Если вы столкнулись с ошибкой в коде типа:


СтруктураОтбора = Новый Структура("Услуга, Источник", УслугаОбъект, КлиентОбъект);
Выборка = РегистрыСведений.Ц_Источники.Выбрать(СтруктураОтбора); // Ошибка здесь!

Проверьте следующие моменты:

Если вам нужно удалить записи, найденные по сложному фильтру, лучше использовать цикл по выборке, но внутри получать именно менеджер записи:


Выборка = РегистрыСведений.Ц_Источники.Выбрать(СтруктураОтбора);
Пока Выборка.Следующий() Цикл
    МЗ = Выборка.ПолучитьМенеджерЗаписи();
    МЗ.Удалить();
КонецЦикла;

Особенности периодических и подчиненных регистров

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

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

Регистры, подчиненные регистратору: В таких регистрах (где режим записи установлен в «Подчинение регистратору») вы не можете использовать МенеджерЗаписи.Удалить(). Записи в них жестко связаны с документом-регистратором. Чтобы удалить запись, вам придется работать с полным набором записей этого документа:

  1. Создать набор записей.
  2. Установить отбор по полю Регистратор.
  3. Прочитать набор.
  4. Найти в наборе нужную строку и удалить ее из коллекции.
  5. Записать набор.

Важные рекомендации по контексту и блокировкам

При выполнении программного удаления всегда учитывайте среду выполнения. В современной архитектуре 1С (управляемое приложение) все операции с регистрами должны происходить на стороне Сервера. Попытка вызвать РегистрыСведений.ИмяРегистра.СоздатьМенеджерЗаписи() в клиентском модуле приведет к ошибке, так как глобальный контекст доступа к данным на клиенте ограничен.

Также помним про блокировки данных. Метод Записать() или Удалить() устанавливает исключительную блокировку на уровне СУБД. Если ваша процедура выполняется долго или внутри транзакции, это может блокировать работу других пользователей. Старайтесь делать выборки максимально узкими, используя точные значения всех измерений в отборах.

Подводя итог: для удаления одной конкретной записи используйте МенеджерЗаписи, предварительно заполнив все измерения и вызвав Прочитать(). Если же нужно очистить данные по фильтру или сделать это максимально эффективно — используйте НаборЗаписей с методом Записать(Истина).

← На главную