Почему очищаются записи в регистре сведений "Дополнительные сведения" в 1С:УНФ и как это исправить?

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

Разработчики в среде 1С часто сталкиваются с загадочной проблемой: после успешной программной загрузки тысяч записей в регистр сведений, связанных с дополнительными реквизитами или сведениями, через некоторое время эти данные бесследно исчезают. Особенно часто это происходит в современных конфигурациях, таких как 1С:Управление нашей фирмой (УНФ), построенных на базе Библиотеки стандартных подсистем (БСП).

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

Причина №1. Опасная перезапись набора записей без установки отборов

Это классическая техническая ошибка, которую совершают как начинающие, так и опытные разработчики при спешном написании обработок загрузки данных. Рассмотрим, как работает механизм записи в регистры сведений на платформе 1С:Предприятие.

Когда мы используем объект типа РегистрСведенийНаборЗаписей, платформа ожидает, что перед вызовом метода Записать() будут четко определены фильтры (отборы) по измерениям регистра. Если отборы не установлены, то при записи набора с параметром замещения Истина (который применяется по умолчанию) система полностью очистит все существующие записи в регистре, удовлетворяющие пустому отбору (то есть вообще все записи в таблице базы данных).

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


// Опасный код, который может очистить весь регистр!
Набор = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей();
// Отбор по измерению "Объект" или "Свойство" забыли установить!
НоваяЗапись = Набор.Добавить();
НоваяЗапись.Объект = СсылкаНаОбъект;
НоваяЗапись.Свойство = СсылкаНаСвойство;
НоваяЗапись.Значение = ЗначениеСвойства;
Набор.Записать(); // Произойдет затирание других данных!

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

Причина №2. Конфликт с логикой БСП (Обход стандартного API)

В конфигурации 1С:УНФ свойства и реквизиты управляются подсистемой «Свойства» из состава БСП. Это сложный механизм со своими правилами кэширования и контроля целостности данных. Когда мы записываем данные напрямую в регистр сведений ДополнительныеСведения, минуя программный интерфейс БСП, мы создаем рассогласование в системе.

Выясним, что происходит в этот момент:

  1. Вы программно записали 10 000 строк напрямую в регистр. Записи физически появились в базе данных.
  2. Сам объект-владелец (например, элемент справочника Номенклатура) «не знает» о том, что у него появились новые свойства, так как его версия данных и кэш не обновлялись.
  3. Когда пользователь открывает карточку этого товара в интерактивном режиме и нажимает кнопку «Записать и закрыть», срабатывает стандартный код БСП перед записью и при записи объекта.
  4. Система считывает текущие свойства с формы (где ваших программно добавленных записей нет, либо они не сопоставились из-за отсутствия кэша БСП) и принудительно перезаписывает регистр «актуальными» с точки зрения формы значениями. В результате ваши программные записи бесследно стираются.

Причина №3. Влияние регламентных заданий очистки

В БСП интегрированы регламентные механизмы контроля ссылочной целостности. Одним из таких механизмов является автоматическая очистка «осиротевших» записей в регистрах сведений.

Если вы программно связали дополнительное свойство с объектом, который:

то регламентное задание очистки устаревших данных при очередном запуске обнаружит эти несоответствия и полностью удалит записи из регистра ДополнительныеСведения.

Причина №4. Синхронизация данных и планы обмена

Если 1С:УНФ работает в связке с другими конфигурациями (например, 1С:Бухгалтерия или 1С:Розница) через планы обмена (EnterpriseData), прямая запись в регистр сведений не регистрирует изменения на узлах обмена. При очередной синхронизации из мастер-базы прилетает объект-владелец. При его записи в текущую базу стандартные правила обмена перезаписывают табличные части и связанные регистры сведений актуальными данными из пакета обмена, затирая локальные изменения, о которых «не знала» выгружающая база.

---

Как пошагово диагностировать проблему?

Если записи пропадают, не нужно гадать — воспользуемся штатными инструментами платформы для точечного поиска виновника.

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

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

Шаг 2. Используем Консоль регламентных заданий
Если Журнал регистрации указывает на фоновое задание, откроем обработку «Консоль регламентных заданий» и сопоставим время удаления данных с расписанием работы системных задач (таких как очистка ненужных файлов, синхронизация данных или обслуживание базы данных).

---

Как правильно записывать дополнительные сведения программно?

Чтобы избежать очистки данных механизмами БСП и гарантировать целостность базы данных, мы должны отказаться от прямой записи в регистр сведений и использовать официальное API подсистемы «Свойства».

Рассмотрим по шагам правильный алгоритм программной установки дополнительных сведений с использованием общего модуля БСП УправлениеСвойствами.


// Шаг 1. Подготовим ссылку на объект-владелец (например, Номенклатура)
СсылкаНаВладельца = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул", "ID_10023");

Если Не СсылкаНаВладельца.Пустая() Тогда
    
    // Шаг 2. Создадим таблицу для передачи свойств
    ТаблицаСвойств = Новый ТаблицаЗначений;
    ТаблицаСвойств.Колонки.Добавить("Свойство", Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ДополнительныеРеквизитыИСведения"));
    ТаблицаСвойств.Колонки.Добавить("Значение");
    
    // Шаг 3. Заполним строку таблицы
    НоваяСтрока = ТаблицаСвойств.Добавить();
    НоваяСтрока.Свойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Бренд");
    НоваяСтрока.Значение = "Наш Любимый Бренд";
    
    // Шаг 4. Безопасно запишем свойства через штатное API БСП
    ИнформационнаяБазаОБновлена = Ложь; // Параметр для внутреннего использования БСП
    
    УправлениеСвойствами.ЗаписатьСвойстваУОбъекта(
        СсылкаНаВладельца, 
        ТаблицаСвойств, 
        ИнформационнаяБазаОБновлена
    );
    
    ПоказатьОповещениеПользователя("Успех", , "Свойства успешно привязаны к объекту!");
КонецЕсли;

В чем преимущества использования метода УправлениеСвойствами.ЗаписатьСвойстваУОбъекта()?

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

Используя этот подход, мы гарантируем стабильную работу конфигурации 1С:УНФ, сохраняем целостность данных и полностью избавляемся от проблемы таинственного исчезновения дополнительных сведений при массовой загрузке.

← На главную