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

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

При доработке типовых конфигураций (например, «Бухгалтерия предприятия 2.0») часто возникает потребность сохранять дополнительные табличные данные, привязанные к документу, не изменяя структуру самого типового объекта метаданных. Добавление новой табличной части напрямую в документ усложняет поддержку и последующие обновления конфигурации. Кроме того, при редактировании данных внешними обработками в обычном приложении открытая форма документа не синхронизируется с базой данных автоматически, требуя постоянного переоткрытия или перечитывания объекта.

Оптимальным архитектурным выходом становится вынос вспомогательных данных в отдельный независимый регистр сведений. Однако при таком подходе возникает закономерный вопрос: как обеспечить удаление записей регистра при удалении самого документа, чтобы не нарушать ссылочную целостность базы данных? Разберем эту задачу подробно.

Причина проблемы ссылочной целостности

Проанализируем механизм контроля ссылок платформы «1С:Предприятие». Если в независимом регистре сведений создано измерение со ссылочным типом данных (например, ДокументСсылка.РасходныйКассовыйОрдер), то при стандартной попытке удаления документа процедура контроля ссылочной целостности обнаружит наличие записей в регистре. В результате платформа заблокирует удаление объекта, выдав предупреждение о том, что на документ ссылаются другие данные.

Основное решение: использование свойства «Ведущее»

Рассмотрим штатный и наиболее надежный способ решения этой задачи, заложенный в платформу разработчиками 1С. Для того чтобы платформа понимала зависимость записей регистра от документа, используется специальный признак у измерения.

Разберем настройку по шагам:

  1. Откроем конфигуратор и перейдем к нашему независимому регистру сведений.
  2. Найдем в составе измерений то поле, которое хранит ссылку на документ.
  3. Откроем палитру свойств этого измерения.
  4. Установим флаг Ведущее в значение «Истина».

Выясним, как именно работает флаг Ведущее:

  1. Контроль ссылочной целостности: Платформа исключает данное измерение из проверки наличия неразрешимых ссылок. При удалении документа записи в таком регистре не считаются препятствием для удаления.
  2. Каскадное физическое удаление: В момент окончательного (физического) удаления документа из информационной базы (будь то обработка «Удаление помеченных объектов» или программный вызов ДокументОбъект.Удалить()) платформа автоматически на уровне СУБД удаляет все записи регистра сведений, где в ведущем измерении указан удаляемый документ.

Обратим внимание на важное ограничение метаданных: флаг Ведущее может быть установлен только у измерений регистра сведений. У ресурсов и реквизитов данное свойство недоступно.

Особенность работы с пометкой на удаление

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

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

Посмотрим на пример реализации через подписку на событие ПередЗаписью документа:


Процедура ДокументПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

    // Проверяем, изменился ли признак пометки на удаление
    Если Источник.ПометкаУдаления <> Источник.Ссылка.ПометкаУдаления Тогда
        
        Если Источник.ПометкаУдаления Тогда
            // Документ помечается на удаление - очищаем набор записей
            Набор = РегистрыСведений.НашРегистрСведений.СоздатьНаборЗаписей();
            Набор.Отбор.Документ.Установить(Источник.Ссылка);
            Набор.Записать(); // Записываем пустой набор для очистки
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

Такой подход гарантирует, что данные будут очищены сразу при пометке объекта на удаление, а в случае физического удаления остатки хвостов (если они появятся) удалит сама платформа за счет свойства Ведущее.

Почему независимый регистр удобнее табличной части в обычном приложении

Проанализируем проблему, с которой столкнулся автор темы при работе с формой документа в обычном приложении. Когда внешняя обработка изменяет табличную часть напрямую в объекте базы данных, открытая форма ничего об этом не знает, поскольку работает со своей локальной копией объекта в оперативной памяти. Из-за этого при попытке пользователя нажать «ОК» или «Записать» возникает конфликт блокировок и версий, а данные приходится перечитывать вручную.

Использование независимого регистра сведений исключает эту проблему:

  1. Внешняя обработка записывает данные только в регистр сведений, вообще не модифицируя сам объект ДокументОбъект и не меняя его версию.
  2. На форму документа достаточно вывести табличное поле, связанное с набором записей регистра или заполняемое запросом при открытии и обновлении формы.
  3. Конфликты блокировок при одновременной работе пользователя с документом полностью исчезают.

Альтернативные архитектурные решения

Рассмотрим альтернативные пути реализации, которые можно применить в зависимости от ограничений проекта:

  1. Подсистема дополнительных сведений (свойств): В конфигурациях линейки «Бухгалтерия предприятия» уже присутствует механизм свойств и категорий. Если требуется хранить небольшой объем данных без сложных таблиц, использование типовых дополнительных реквизитов и сведений позволяет вообще не трогать конфигурацию, сохраняя её на полной поддержке поставщика.
  2. Подчиненный регистр сведений (по регистратору): Если сделать регистр сведений подчиненным регистратору, платформа берет все управление движениями на себя: при распроведении или удалении документа записи регистра очищаются автоматически. Однако этот вариант требует включения регистра в состав движений документа, что снимает документ с типовой поддержки и усложняет обновления конфигурации.

Таким образом, использование независимого регистра сведений с установленным свойством Ведущее у измерения-ссылки представляет собой наиболее сбалансированное решение, сохраняющее чистоту конфигурации и целостность базы данных.

← На главную