Как исправить ошибку «Не определен владелец» в справочнике банковских счетов 1С?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

При выполнении процедуры «Тестирование и исправление информационной базы» (ТиИ) администраторы и программисты нередко сталкиваются с сообщением об ошибке: «Проверка логической целостности. Справочник.БанковскиеСчета: Не определен владелец». Попытка открыть такую запись в пользовательском режиме обычно приводит к блокирующему предупреждению «Не найден владелец банковского счета», из-за чего форму элемента невозможно отредактировать или пометить на удаление обычным способом.

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

Причины возникновения ошибки

Справочник БанковскиеСчета является подчиненным. В качестве его владельца выступают элементы справочников Организации или Контрагенты. Нарушение логической целостности возникает в следующих случаях:

  1. Некорректное удаление владельца: если элемент-владелец был удален напрямую без контроля ссылочной целостности или очищен в результате некорректного обмена данными.
  2. Восстановление базы после сбоя: после применения утилит восстановления файловых баз (например, chdbfl.exe) поврежденные поля могут очищаться или принимать значение NULL.
  3. Сбои при записи: программная запись элементов без заполнения обязательного реквизита Владелец в режиме загрузки данных.

Шаг 1. Поиск элементов с отсутствующим владельцем

Для обнаружения всех поврежденных банковских счетов воспользуемся консолью запросов или напишем простой запрос. Посмотрим на пример текста запроса, который выбирает все записи справочника с отсутствующей ссылкой на владельца:


ВЫБРАТЬ
    СпрСчета.Ссылка КАК БанковскийСчет,
    СпрСчета.Код КАК Код,
    СпрСчета.НомерСчета КАК НомерСчета
ИЗ
    Справочник.БанковскиеСчета КАК СпрСчета
ГДЕ
    СпрСчета.Владелец.Ссылка IS NULL
    ИЛИ СпрСчета.Владелец = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
    ИЛИ СпрСчета.Владелец = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)

Этот запрос позволяет получить список конкретных ссылок на проблемные элементы, которые вызывают ошибки при тестировании целостности базы.

Шаг 2. Проверка ссылочной целостности

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

Рассмотрим два основных способа поиска ссылок:

  1. Штатный интерактивный инструмент: в интерфейсе перейдем в меню «Операции» → «Обработки» → «Поиск ссылок на объекты». Добавим в список проверяемых объектов найденные проблемные банковские счета и выполним поиск.
  2. Программный метод: воспользуемся методом глобального контекста НайтиПоСсылкам() во внешней обработке.

Разберем пример программного поиска ссылок на проблемный объект:


МассивСсылок = Новый Массив;
МассивСсылок.Добавить(ПроблемныйБанковскийСчет);

ТаблицаСсылок = НайтиПоСсылкам(МассивСсылок);

Для Каждого Стр Из ТаблицаСсылок Цикл
    Сообщить("Найдена ссылка в объекте: " + Строка(Стр.Данные));
КонецЦикла;

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

Шаг 3. Варианты исправления проблемы

Проанализируем три основных способа устранения ошибки в зависимости от ситуации.

Вариант 1. Автоматическое создание владельцев через Тестирование и исправление

Если в базе обнаружено множество битых ссылок, платформа может восстановить их автоматически:

  1. Создадим резервную копию информационной базы.
  2. Откроем конфигуратор и перейдем в меню «Администрирование» → «Тестирование и исправление...».
  3. Установим флажки «Проверка логической целостности» и «Проверка ссылочной целостности».
  4. В переключателе «При наличии ссылок на несуществующие объекты» выберем вариант «Создавать объекты».
  5. Запустим выполнение процедуры.

Платформа автоматически создаст элементы-заглушки (например, «Объект не найден...»), восстановив связи. После этого форму счета можно будет открыть интерактивно, отредактировать созданного владельца или корректно перенести данные.

Вариант 2. Программное заполнение владельца или удаление

Поскольку интерактивное открытие карточки счета блокируется встроенными проверками формы, исправление можно выполнить программно с помощью свойства ОбменДанными.Загрузка. Установка этого флага в значение Истина отключает выполнение кода в модуле объекта и подписках на события при записи.

Рассмотрим пример кода для привязки счета к корректному владельцу:


СчетОбъект = СсылкаНаСчет.ПолучитьОбъект();
СчетОбъект.ОбменДанными.Загрузка = Истина;
СчетОбъект.Владелец = НужныйКонтрагентИлиОрганизация;
СчетОбъект.Записать();

Если счет не используется и подлежит полному удалению из базы, выполним непосредственное удаление:


СчетОбъект = СсылкаНаСчет.ПолучитьОбъект();
СчетОбъект.ОбменДанными.Загрузка = Истина;
СчетОбъект.Удалить();

Вариант 3. Замена ссылок с помощью стандартной обработки

Если проблемный счет использовался в документах, но у организации или контрагента уже заведен новый рабочий банковский счет, воспользуемся типовой обработкой «Поиск и замена значений». Она позволяет перенаправить все движения документов со старого поврежденного счета на действующий, после чего старый объект удаляется стандартным удалением помеченных объектов.

Что делать при ошибке нехватки памяти во время ТиИ?

При тестировании объемных файловых баз на 32-разрядном клиенте 1С может возникать ошибка «Недостаточно свободной памяти». Разберем шаги для ее устранения:

  1. Поэтапный запуск: запускаем проверки в окне «Тестирование и исправление» по отдельности, предварительно выбрав пункт «Сжатие таблиц информационной базы».
  2. Использование 64-разрядного клиента: запускаем процедуру ТиИ с помощью толстого клиента x86-64, который снимает ограничение адресного пространства в 2–3 ГБ.
  3. Временная выгрузка в клиент-сервер: выгружаем базу в файл .dt, загружаем в тестовую СУБД (PostgreSQL или MS SQL Server), проводим тестирование на сервере и выгружаем обратно.
← На главную