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