При активном использовании механизмов расширений в 1С разработчики часто сталкиваются с ситуацией, когда новые объекты метаданных, созданные внутри расширения, ведут себя нестабильно при выполнении регламентных операций. Одна из самых серьезных проблем — внезапное исчезновение записей в регистрах бухгалтерии или накопления после проведения процедуры Тестирования и исправления (ТИИ). Выглядит это так: документ в расширении проведен, движения в базе есть, но стоит запустить ТИИ, как система рапортует об удалении "лишних" записей, ссылающихся на несуществующие объекты.
В этой статье мы подробно разберем, почему платформа 8.3 (особенно ранних релизов) считает движения расширений «битыми» ссылками, и как правильно проектировать систему, чтобы избежать потери данных.
Для того чтобы понять, почему Тестирование и исправление удаляет записи, нам необходимо заглянуть на уровень хранения данных в СУБД. Проанализируем механизм работы ссылочной целостности. В основной конфигурации существует регистр (например, Хозрасчетный). Поле Регистратор в этом регистре имеет составной тип данных, который жестко определен в основной конфигурации. Когда мы в расширении создаем новый документ и указываем его в качестве регистратора для этого регистра, платформа должна динамически расширить этот составной тип.
Однако в старых релизах платформы (в частности, 8.3.13 и 8.3.14) при работе в режиме совместимости 8.3.12 и ниже, этот механизм работал с особенностями:
Как показывает практика и обсуждения экспертов, стабильная работа с новыми метаданными в расширениях началась с релизов 8.3.15 и выше. Проанализируем, что меняется при переходе на новые версии:
В новых версиях платформы механизмы расширения метаданных были существенно переработаны. Если вы планируете создавать свои документы и использовать их как регистраторы для типовых регистров, рекомендуется:
Важный момент: Если вы используете платформу 8.3.13, расширения в ней считаются "недоделанными" для работы с глубоким изменением структуры данных. В этом случае риск потери данных при ТИИ остается крайне высоким.
Если нам необходимо добавить новый документ как регистратор к типовому регистру, недостаточно просто создать документ. Рассмотрим правильную последовательность действий:
РегистрБухгалтерии.Хозрасчетный (или другой нужный регистр) в ваше расширение.Адаптация или Дополнение).Проанализируем ситуацию: когда мы добавляем регистр в расширение, платформа начинает более корректно отслеживать связи между "родными" таблицами и таблицами расширения. Однако помните, что даже при таком подходе на старых платформах ТИИ может вести себя агрессивно.
Если вы не можете обновить платформу или опасаетесь за сохранность данных при будущих обновлениях, рассмотрим наиболее стабильный "старый" метод. Вместо создания документа целиком в расширении, мы создаем "пустой" объект в основной конфигурации.
Рассмотрим алгоритм реализации:
пр_ДокументКонтейнер).Почему это работает? С точки зрения платформы и механизма ТИИ, этот документ является частью основной конфигурации. Ссылочная целостность проверяется по стандартным правилам, идентификатор типа объекта (TableID) всегда известен системе, независимо от того, подключено расширение в данный момент или нет. Это исключает удаление движений при любых проверках.
Иногда полезно перед запуском ТИИ убедиться, что ссылки в регистре корректны. Рассмотрим пример кода, который позволяет проверить, какие записи в регистре накопления могут быть проблемными:
Процедура ПроверитьДвиженияНаБитыеСсылки()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйДвижения.Регистратор КАК Регистратор,
| ХозрасчетныйДвижения.Период КАК Период
|ИЗ
| РегистрБухгалтерии.Хозрасчетный КАК ХозрасчетныйДвижения
|ГДЕ
| ХозрасчетныйДвижения.Регистратор.Ссылка ЕСТЬ NULL";
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Найден битый регистратор: " + Выборка.Регистратор);
КонецЦикла;
Иначе
Сообщить("Ошибок ссылочной целостности не обнаружено.");
КонецЕсли;
КонецПроцедуры
Если этот код возвращает записи, значит, ТИИ гарантированно их удалит. Если записи возвращаются только при отключенном расширении — значит, проблема именно в механизме интеграции метаданных расширения и основной базы.
Если в вашей базе уже есть документы в расширениях и движения по ним, придерживайтесь следующих правил при запуске тестирования:
Обновление конфигурации базы данных в расширении, а затем повторить проверку.Выясним причину удаления окончательно: если при выполнении запроса РЕГ.Регистратор ССЫЛКА Документ.МойДокументИзРасширения система выдает ошибку или Ложь в тех местах, где записи должны быть, значит, текущий релиз платформы некорректно обрабатывает расширение типов в физических таблицах. В таком случае единственным выходом будет либо обновление платформы, либо переход к схеме с "документом-контейнером" в основной конфигурации.
Подведем итог: расширения — мощный инструмент, но для изменения структуры регистров (особенно типовых, таких как Хозрасчетный) требуется современная платформа (8.3.15+) и осторожность при выполнении низкоуровневых операций с базой данных.