При доработке типовых конфигураций (например, «Бухгалтерия предприятия 2.0») часто возникает потребность сохранять дополнительные табличные данные, привязанные к документу, не изменяя структуру самого типового объекта метаданных. Добавление новой табличной части напрямую в документ усложняет поддержку и последующие обновления конфигурации. Кроме того, при редактировании данных внешними обработками в обычном приложении открытая форма документа не синхронизируется с базой данных автоматически, требуя постоянного переоткрытия или перечитывания объекта.
Оптимальным архитектурным выходом становится вынос вспомогательных данных в отдельный независимый регистр сведений. Однако при таком подходе возникает закономерный вопрос: как обеспечить удаление записей регистра при удалении самого документа, чтобы не нарушать ссылочную целостность базы данных? Разберем эту задачу подробно.
Проанализируем механизм контроля ссылок платформы «1С:Предприятие». Если в независимом регистре сведений создано измерение со ссылочным типом данных (например, ДокументСсылка.РасходныйКассовыйОрдер), то при стандартной попытке удаления документа процедура контроля ссылочной целостности обнаружит наличие записей в регистре. В результате платформа заблокирует удаление объекта, выдав предупреждение о том, что на документ ссылаются другие данные.
Рассмотрим штатный и наиболее надежный способ решения этой задачи, заложенный в платформу разработчиками 1С. Для того чтобы платформа понимала зависимость записей регистра от документа, используется специальный признак у измерения.
Разберем настройку по шагам:
Выясним, как именно работает флаг Ведущее:
ДокументОбъект.Удалить()) платформа автоматически на уровне СУБД удаляет все записи регистра сведений, где в ведущем измерении указан удаляемый документ.Обратим внимание на важное ограничение метаданных: флаг Ведущее может быть установлен только у измерений регистра сведений. У ресурсов и реквизитов данное свойство недоступно.
Разберем важный нюанс поведения платформы: флаг Ведущее отрабатывает исключительно при физическом удалении записи из таблицы базы данных. Если пользователь просто пометил документ на удаление (ПометкаУдаления = Истина), записи в независимом регистре сведений остаются неизменными и продолжают считываться запросами и отчетами.
Если бизнес-логика требует очищать записи сразу в момент установки пометки на удаление, необходимо задействовать программную синхронизацию через подписку на события.
Посмотрим на пример реализации через подписку на событие ПередЗаписью документа:
Процедура ДокументПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Проверяем, изменился ли признак пометки на удаление
Если Источник.ПометкаУдаления <> Источник.Ссылка.ПометкаУдаления Тогда
Если Источник.ПометкаУдаления Тогда
// Документ помечается на удаление - очищаем набор записей
Набор = РегистрыСведений.НашРегистрСведений.СоздатьНаборЗаписей();
Набор.Отбор.Документ.Установить(Источник.Ссылка);
Набор.Записать(); // Записываем пустой набор для очистки
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Такой подход гарантирует, что данные будут очищены сразу при пометке объекта на удаление, а в случае физического удаления остатки хвостов (если они появятся) удалит сама платформа за счет свойства Ведущее.
Проанализируем проблему, с которой столкнулся автор темы при работе с формой документа в обычном приложении. Когда внешняя обработка изменяет табличную часть напрямую в объекте базы данных, открытая форма ничего об этом не знает, поскольку работает со своей локальной копией объекта в оперативной памяти. Из-за этого при попытке пользователя нажать «ОК» или «Записать» возникает конфликт блокировок и версий, а данные приходится перечитывать вручную.
Использование независимого регистра сведений исключает эту проблему:
ДокументОбъект и не меняя его версию.Рассмотрим альтернативные пути реализации, которые можно применить в зависимости от ограничений проекта:
Таким образом, использование независимого регистра сведений с установленным свойством Ведущее у измерения-ссылки представляет собой наиболее сбалансированное решение, сохраняющее чистоту конфигурации и целостность базы данных.