При выполнении процедуры «Тестирование и исправление информационной базы» (ТиИ) администраторы и программисты нередко сталкиваются с сообщением об ошибке: «Проверка логической целостности. Справочник.БанковскиеСчета: Не определен владелец». Попытка открыть такую запись в пользовательском режиме обычно приводит к блокирующему предупреждению «Не найден владелец банковского счета», из-за чего форму элемента невозможно отредактировать или пометить на удаление обычным способом.
Разберем по шагам, почему возникает данная ситуация, как найти проблемные записи, проверить наличие ссылок на них в документах и корректно исправить данные.
Справочник БанковскиеСчета является подчиненным. В качестве его владельца выступают элементы справочников Организации или Контрагенты. Нарушение логической целостности возникает в следующих случаях:
chdbfl.exe) поврежденные поля могут очищаться или принимать значение NULL.Владелец в режиме загрузки данных.Для обнаружения всех поврежденных банковских счетов воспользуемся консолью запросов или напишем простой запрос. Посмотрим на пример текста запроса, который выбирает все записи справочника с отсутствующей ссылкой на владельца:
ВЫБРАТЬ
СпрСчета.Ссылка КАК БанковскийСчет,
СпрСчета.Код КАК Код,
СпрСчета.НомерСчета КАК НомерСчета
ИЗ
Справочник.БанковскиеСчета КАК СпрСчета
ГДЕ
СпрСчета.Владелец.Ссылка IS NULL
ИЛИ СпрСчета.Владелец = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
ИЛИ СпрСчета.Владелец = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
Этот запрос позволяет получить список конкретных ссылок на проблемные элементы, которые вызывают ошибки при тестировании целостности базы.
Прежде чем принимать решение об удалении или изменении найденных счетов, необходимо выяснить, используются ли они в проведенных документах и регистрах информационной базы.
Рассмотрим два основных способа поиска ссылок:
НайтиПоСсылкам() во внешней обработке.Разберем пример программного поиска ссылок на проблемный объект:
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(ПроблемныйБанковскийСчет);
ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);
Для Каждого Стр Из ТаблицаСсылок Цикл
Сообщить("Найдена ссылка в объекте: " + Строка(Стр.Данные));
КонецЦикла;
Если на банковский счет нет ссылок в информационной базе, его можно безболезненно удалить. Если же ссылки присутствуют в учетных документах, удалять элемент нельзя — необходимо восстановить владельца или выполнить замену ссылок.
Проанализируем три основных способа устранения ошибки в зависимости от ситуации.
Если в базе обнаружено множество битых ссылок, платформа может восстановить их автоматически:
Платформа автоматически создаст элементы-заглушки (например, «Объект не найден...»), восстановив связи. После этого форму счета можно будет открыть интерактивно, отредактировать созданного владельца или корректно перенести данные.
Поскольку интерактивное открытие карточки счета блокируется встроенными проверками формы, исправление можно выполнить программно с помощью свойства ОбменДанными.Загрузка. Установка этого флага в значение Истина отключает выполнение кода в модуле объекта и подписках на события при записи.
Рассмотрим пример кода для привязки счета к корректному владельцу:
СчетОбъект = СсылкаНаСчет.ПолучитьОбъект();
СчетОбъект.ОбменДанными.Загрузка = Истина;
СчетОбъект.Владелец = НужныйКонтрагентИлиОрганизация;
СчетОбъект.Записать();
Если счет не используется и подлежит полному удалению из базы, выполним непосредственное удаление:
СчетОбъект = СсылкаНаСчет.ПолучитьОбъект();
СчетОбъект.ОбменДанными.Загрузка = Истина;
СчетОбъект.Удалить();
Если проблемный счет использовался в документах, но у организации или контрагента уже заведен новый рабочий банковский счет, воспользуемся типовой обработкой «Поиск и замена значений». Она позволяет перенаправить все движения документов со старого поврежденного счета на действующий, после чего старый объект удаляется стандартным удалением помеченных объектов.
При тестировании объемных файловых баз на 32-разрядном клиенте 1С может возникать ошибка «Недостаточно свободной памяти». Разберем шаги для ее устранения:
x86-64, который снимает ограничение адресного пространства в 2–3 ГБ..dt, загружаем в тестовую СУБД (PostgreSQL или MS SQL Server), проводим тестирование на сервере и выгружаем обратно.