Содержание:
- Выборка объектов с помощью запроса
- Использование объектной модели
- Поиск подстроки 1С «Объект не найден» в представлении ссылки
Трудно найти человека, который при работе с информационными базами данных на платформе 1С более или менее продолжительное время, ни разу не столкнулся с "битыми" ссылками в 1С, которые содержат поля таблиц баз данных (пресловутый текст в 1С «Объект не найден» c уникальным идентификатором отсутствующего объекта в поле со ссылкой на отсутствующий объект информационной базы). Причинами возникновения таких ситуаций могут быть выполнение удаления объектов информационных баз без контроля ссылочной целостности, аварийные завершения работы информационных баз, ошибки при обменах данными и т.д.
Сразу хочется отметить, что следует отличать ситуации с "битыми" ссылками в 1С от ситуаций, когда у пользователя из-за некорректных настроек прав доступа просто нет возможности "видеть" даже представление объекта информационной базы, запрещенного ему для открытия и просмотра, в таких случаях в видимом для пользователя поле со ссылкой на такой объект тоже содержится строка, включающая текст «Объект не найден».
Существуют несколько способов выявления "битых" ссылок в 1С в таблицах информационной базы.
1. Выборка объектов с помощью запроса
Первый способ: выборка объектов информационной базы с "битыми" ссылками в 1С с помощью запроса.
ТекстЗапроса =
"ВЫБРАТЬ
| ПеремещениеТоваров.Ссылка КАК Ссылка
|ИЗ
| Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
|ГДЕ
| НЕ ПеремещениеТоваров.СкладОтравитель ЕСТЬ NULL
| И ПеремещениеТоваров.СкладОтравитель.Ссылка ЕСТЬ NULL".
В данном случае мы с помощью запроса производим поиск документов «Перемещение товаров», у которых "битая" ссылка на склад-отправитель. Для этого в условии отбора убеждаемся, что ссылка на склад-отправитель в принципе не пустая(часть условия "ГДЕ": "НЕ ПеремещениеТоваров.СкладОтравитель ЕСТЬ NULL") и, если это так, то проверяем ссылку на "битость"(часть условия "ГДЕ": "ПеремещениеТоваров.СкладОтравитель.Ссылка ЕСТЬ NULL").
Во второй части условия "ГДЕ" ("ПеремещениеТоваров.СкладОтравитель.Ссылка ЕСТЬ NULL") вместо "Ссылка" можно использовать другие реквизиты склада-отправителя, например, "Код" ("ПеремещениеТоваров.СкладОтравитель.Код ЕСТЬ NULL") – в таком случае мы также сможем отобрать перемещения с "битыми" ссылками на склад-отправитель.
Следует оговорить ситуацию, когда нужно произвести выборку объектов с битыми ссылками в 1С, но при этом поле объекта, в котором возможна "битая" ссылка, имеет составной тип, а нам требуется найти "битые" ссылки только определенного типа. Например, если в нашем случае склад-отправитель имеет составной тип "Склады" + "Подразделения организаций", а нам нужно отобрать только перемещения с "битыми" складами-отправителями типа "Подразделения организаций", в текст нашего запроса в условие "ГДЕ" добавится часть "ПеремещениеТоваров.СкладОтравитель ССЫЛКА Справочник.ПодрадзделенияОрганизаций". Запрос примет следующий вид:
"ВЫБРАТЬ
| ПеремещениеТоваров.Ссылка КАК Ссылка
|ИЗ
| Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
|ГДЕ
| ПеремещениеТоваров.СкладОтравитель ССЫЛКА Справочник.ПодрадзделенияОрганизаций
| И НЕ ПеремещениеТоваров.СкладОтравитель ЕСТЬ NULL
| И ПеремещениеТоваров.СкладОтравитель.Ссылка ЕСТЬ NULL".
2. Использование объектной модели
Второй способ: определение "битой" ссылки с использованием объектной модели данных 1С.
При данном способе для поиска "битых" ссылок используется метод ПолучитьОбъект() платформы 1С по ссылке на объект информационной базы, который возвращает «Неопределено» в случаях с "битыми" ссылками:
Если ЗначениеЗаполнено(ДокументПеремещения.СкладОтправитель) И (ДокументПеремещения.СкладОтправитель.ПолучитьОбъект() = Неопределено) Тогда
// Здесь выполняется требуемый код обработки найденного объекта с "битой" ссылкой.
КонецЕсли;
Если поле с "битой" ссылкой имеет составной тип, и нам необходимо выявлять только битые ссылки определенного типа, тогда, как и при первом случае, мы соответствующим способом модифицируем условие:
Если (ТипЗнч(Объект.СкладОтравитель) = Тип("СправочникСсылка.ПодрадзделенияОрганизаций")) И ЗначениеЗаполнено(ДокументПеремещения.СкладОтправитель) И (ДокументПеремещения.СкладОтправитель.ПолучитьОбъект() = Неопределено) Тогда
// Здесь выполняется требуемый код обработки найденного объекта с "битой" ссылкой.
3. Поиск подстроки «Объект не найден» в представлении ссылки
Третий способ: поиск подстроки «Объект не найден» в представлении ссылки.
Если СтрНайти(ДокументПеремещения.СкладОтправитель, "Объект не найден") > 0 Тогда
// Здесь выполняется требуемый код обработки найденного объекта с "битой" ссылкой.
КонецЕсли;
По поводу последнего способа хотелось бы отметить следующее: хотя на первый взгляд он выглядит не очень "красивым", по сравнению со вторым способом, он является более предпочтительным с точки зрения производительности, так как метод ПолучитьОбъект(), используемый во втором способе, немного больше "нагружает" систему в случаях, когда при проверке условия ссылка оказывается не "битой", и платформа выделяет дополнительные ресурсы вычислительной машины для создания в ее памяти копии объекта информационной базы по проверяемой ссылке.
При это нужно быть аккуратным – используя в коде поиск "битых" ссылок по подстроке «Объект не найден», нужно учитывать, что подстрока "Объект не найден" в представлении "битой" ссылки может изменяться в зависимости от языка, используемого в "региональных установках информационной базы".
Специалист компании «Кодерлайн»
Аскер Жансуев