Поиск нерабочих ссылок в базе 1С: где они лежат и чем их ловить
Содержание
Чтобы проверить, что ссылка в 1С битая, отправьте по её адресу запрос HEAD и посмотрите код ответа. Коды 200–399 значат, что страница жива. 404 и 410 — страницы нет. Отсутствие ответа вообще — сервер недоступен или домен не существует. Всё остальное — детали: откуда взять список адресов и как не повесить базу, пока вы их проверяете.
Нерабочая ссылка в 1С — это не одна проблема, а три. Бывают ссылки на внешние ресурсы (сайты, документы в облаке, адреса сервисов). Бывают ссылки на объекты самой базы, которые удалили или которых нет. И бывают ссылки на файлы на диске: путь есть, файла нет. Ниже разбираем первый вариант и то, что обычно путают с ним.
Где в базе 1С лежат ссылки
Прежде чем что-то проверять, нужно собрать адреса. Они прячутся в разных местах:
- 🔗 Реквизиты строкового типа — «Сайт», «Адрес в интернете», «Ссылка на документ» в карточках контрагентов, номенклатуры, проектов.
- 🔗 Контактная информация — вид «Веб-страница» у контрагентов и физлиц.
- 🔗 Форматированные документы — описания номенклатуры, комментарии, инструкции с гиперссылками внутри текста.
- 🔗 Присоединённые файлы с типом «ссылка» и внешние хранилища, где вместо файла лежит путь.
- 🔗 Настройки интеграций — адреса веб-сервисов, обмена, онлайн-касс, шлюзов.
- 🔗 Макеты и справочные тексты, добавленные доработчиками.
Если не уверены, где в вашей конфигурации живут адреса, откройте конфигуратор и посмотрите структуру метаданных: нас интересуют реквизиты типа Строка неограниченной длины и состав контактной информации. Для проверки списка контрагентов отдельно выгрузите в таблицу значений только вид контактной информации «Веб-страница» — это самый частый источник мусора.
Ссылки на объекты базы (СправочникСсылка.Номенклатура и подобные) — другая история. Они «ломаются» удалением элемента и ловятся стандартной проверкой ссылочной целостности, а не запросом по сети. Не смешивайте.
Ручная проверка: HTTP-запрос из 1С
Это основной способ. Метод HEAD просит у сервера только заголовки без тела страницы, поэтому проверка быстрая и почти не грузит канал.
Минимальная процедура
Функция КодОтветаСсылки(Знач Адрес, Таймаут = 10)
Попытка
Адрес = СокрЛП(Адрес);
Если НЕ СтрНачинаетсяС(НРег(Адрес), "http") Тогда
Адрес = "http://" + Адрес;
КонецЕсли;
СтруктураURI = ПолучитьСтруктуруURI(Адрес);
Защищено = (НРег(СтруктураURI.Схема) = "https");
Порт = ?(СтруктураURI.Порт = Неопределено, ?(Защищено, 443, 80), СтруктураURI.Порт);
Соединение = Новый HTTPСоединение(СтруктураURI.Хост, Порт, , , , Таймаут,
?(Защищено, Новый ЗащищенноеСоединениеOpenSSL, Неопределено));
Путь = СтруктураURI.ПутьНаСервере;
Запрос = Новый HTTPЗапрос(?(ПустаяСтрока(Путь), "/", Путь));
Ответ = Соединение.ВызватьHTTPМетод("HEAD", Запрос);
Возврат Ответ.КодСостояния;
Исключение
Возврат 0; // сервер не ответил или домена нет
КонецПопытки;
КонецФункции
Функцию ПолучитьСтруктуруURI в типовых конфигурациях часто приходится писать самому: она раскладывает адрес на схему, хост, порт и путь. Если в вашей конфигурации есть готовая из библиотеки стандартных подсистем — используйте её.
Как читать результат
| Код | Что значит | Что делать |
|---|---|---|
| 200–299 | Страница доступна | Ничего |
| 301, 302, 307, 308 | Переадресация | Пройти по Location и проверить конечный адрес |
| 403 | Сервер вас не пускает | Не считать битой, проверить вручную |
| 404, 410 | Страницы нет | Ссылка битая |
| 405, 501 | HEAD не поддерживается | Повторить запросом GET |
| 5xx | Ошибка на стороне сервера | Проверить позже, может быть временным |
| 0 | Нет ответа, ошибка DNS или таймаут | Проверить домен и повторить |
Не считайте ссылку битой по одной неудачной попытке. Сайт мог лежать пять минут. Разумное правило: помечать ссылку нерабочей, только если она не отвечает два-три раза подряд с интервалом в несколько часов.
Некоторые сайты отдают 404 или 403 на запросы без заголовка User-Agent. Добавьте его в запрос через Запрос.Заголовки.Вставить("User-Agent", "Mozilla/5.0"), иначе получите ложные «битые».
Внешние сервисы и обработки для массовой проверки
Когда адресов много — сотни и тысячи, — ручной цикл неудобен. Есть три пути.
Готовая внешняя обработка
На форумах и в каталогах расширений 1С встречаются обработки «Проверка ссылок». Принцип у всех один: выгружают адреса из выбранных реквизитов, в потоке опрашивают их и показывают таблицу с кодами. Перед запуском проверьте:
- Что обработка не отправляет ваши данные на чужой сервер. Откройте модуль и поищите вызовы
HTTPСоединение. - Что она работает в тестовой копии. Не запускайте незнакомый код на рабочей базе.
- Умеет ли она ограничивать число одновременных запросов. Без этого можно получить бан у чужого сайта.
Внешние сервисы
Сервисы проверки ссылок на сайтах и краулеры (в том числе бесплатные) принимают список адресов или карту сайта и отдают отчёт. Подходит так: выгрузили адреса из 1С в файл, загрузили в сервис, получили таблицу кодов. Минус — выгрузка и загрузка вручную. Плюс — не нужно ничего программировать, а сервис обычно точнее определяет переадресации.
Своя обработка с фоновыми заданиями
Если проверять придётся регулярно, лучше написать небольшую внешнюю обработку . Схема простая:
- Запрос собирает адреса из нужных реквизитов в таблицу значений.
- Таблица делится на пачки по 20–50 адресов.
- Каждая пачка уходит в фоновое задание.
- Результаты пишутся в регистр сведений : адрес, код, дата проверки, число неудач подряд.
Так интерфейс не зависает, а один зависший сайт не тормозит остальные.
Журнал регистрации и технологический журнал
Эти журналы не найдут битые ссылки сами по себе, но подскажут, где они уже ломают работу.
Журнал регистрации открывается из меню администрирования. Отфильтруйте его по уровню «Ошибка» и по периоду, затем просмотрите комментарии. Типичные следы нерабочих адресов:
Не удалось разрешить имя хоста— домена не существует;Превышено время ожидания— сервер не ответил за отведённое время;Ошибка SSLили сообщение о проверке сертификата — истёк сертификат или цепочка не доверенная;- ответ с кодом 404 в тексте ошибки обмена или обращения к веб-сервису.
Если ошибки разбросаны, сгруппируйте события по пользователю и приложению: так видно, какая фоновая задача или регламентное задание раз за разом стучится по мёртвому адресу.
Технологический журнал нужен, когда журнал регистрации молчит. Его включают файлом logcfg.xml на сервере. Для поиска сетевых сбоев обычно достаточно событий-исключений (EXCP) с фильтром по длительности и по тексту. Настраивайте его аккуратно: на нагруженной базе технологический журнал быстро раздувается и занимает диск. Включайте на время диагностики и потом отключайте.
Как найти ссылки внутри текстов и форматированных документов
Самое неприятное — адреса, которые вшиты в длинный текст: в описания номенклатуры, в комментарии, в поля с форматированным документом. Реквизит с такой ссылкой не выберешь отдельным запросом.
Строки и текстовые реквизиты
Для обычных строк подойдёт перебор с помощью СтрНайти. Ищем начало http, затем идём до пробела или конца строки:
Функция НайтиАдресаВТексте(Знач Текст)
Результат = Новый Массив;
Позиция = СтрНайти(Текст, "http");
Пока Позиция > 0 Цикл
Хвост = Сред(Текст, Позиция);
Конец = СтрДлина(Хвост);
Для Индекс = 1 По СтрДлина(Хвост) Цикл
Символ = Сред(Хвост, Индекс, 1);
Если Символ = " " ИЛИ Символ = Символы.ПС ИЛИ Символ = ")" ИЛИ Символ = """" Тогда
Конец = Индекс - 1;
Прервать;
КонецЕсли;
КонецЦикла;
Результат.Добавить(Лев(Хвост, Конец));
Текст = Сред(Хвост, Конец + 1);
Позиция = СтрНайти(Текст, "http");
КонецЦикла;
Возврат Результат;
КонецФункции
Форматированный документ
Из форматированного документа сначала получите HTML через ПолучитьHTML, затем ищите значения в атрибутах href. Гиперссылки в документе хранятся именно там, а видимый текст ссылки может вообще не совпадать с адресом. Поэтому искать по тексту без разбора HTML нельзя — потеряете часть адресов.
Что делать с найденным
Не исправляйте тексты автоматом. Сначала запишите в регистр список: объект, адрес, код. Затем человек решает — заменить на новый адрес, убрать или оставить. Автозамена в чужих описаниях заканчивается обычно хуже, чем сама битая ссылка.
Ссылки на файлы и сетевые папки: проверка без интернета
Если адрес ведёт не на сайт, а на файл в сетевой папке или на диске сервера, запрос по HTTP не поможет. Здесь проверяют наличие файла.
Файл = Новый Файл(ПутьКФайлу);
Если НЕ Файл.Существует() Тогда
// путь нерабочий: записываем в результат проверки
КонецЕсли;
Есть две особенности, на которых спотыкаются чаще всего:
- 📁 Код выполняется на сервере или на клиенте — и путь проверяется с того компьютера, где работает код. Диск
Z:, который виден пользователю, серверу 1С может быть недоступен. Для серверной проверки используйте путь вида\\сервер\папка\файл. - 📁 Учётная запись, от имени которой работает служба сервера 1С, должна иметь право на чтение этой папки. Иначе все файлы окажутся «несуществующими».
Для файлов в томах хранения присоединённых файлов картина другая: в базе остаётся запись, а файла в томе уже нет, например после чистки диска. Такие записи видны по ошибке при открытии вложения. Сверять их удобнее обходом списка присоединённых файлов в цикле с попыткой получить двоичные данные и записью неудач в тот же регистр результатов.
Не удаляйте «пустые» записи файлов сразу. Сначала убедитесь, что том хранения подключён и том не перенесли: иначе вы потеряете записи о файлах, которые целы.
Регулярная проверка и профилактика
Один прогон ничего не решает: через месяц часть адресов снова протухнет. Чтобы ловить их вовремя, превратите проверку в процесс.
Регламентное задание
Создайте регламентное задание, которое раз в неделю прогоняет свежие и сомнительные адреса. Не проверяйте всё каждый раз:
- адреса с кодом 200 перепроверяйте раз в месяц;
- адреса с ошибкой — раз в сутки до трёх подряд неудач;
- после трёх неудач — помечайте как нерабочие и отправляйте ответственному.
Что хранить в регистре
Достаточно пяти полей: объект-владелец, адрес, последний код, дата последней успешной проверки, счётчик неудач. По нему легко строится отчёт «что сломалось за неделю».
Профилактика
- Проверяйте адрес при вводе: пусть форма сразу вызывает
КодОтветаСсылкии предупреждает пользователя, если ответа нет. - Не храните ссылки на временные ресурсы: короткие ссылки облачных дисков и мессенджеров живут недолго.
- Для документов, на которые ссылаетесь часто, храните копию файла в базе, а не только адрес.
- Ограничьте скорость: не больше нескольких запросов в секунду к одному домену.
Частые ошибки при проверке ссылок
- ❌ Проверка методом
GETвместоHEAD. Вы скачиваете страницы целиком, и проверка идёт в разы дольше. - ❌ Нет таймаута. Один «молчащий» сервер подвешивает весь цикл. Ставьте 5–15 секунд.
- ❌ Проверка с рабочего сервера без разрешения исходящего трафика. Если брандмауэр режет доступ, все ссылки покажутся битыми. Сначала проверьте, что сервер 1С вообще выходит в интернет.
- ❌ Не учитывают прокси. В корпоративной сети нужен прокси-сервер: задайте его через
ИнтернетПрокси, иначе получите массовый код 0. - ❌ Считают 403 за «битую». Страница существует, просто закрыта для роботов.
Частые вопросы
Можно ли проверить ссылки, не программируя?
Почему ссылка открывается в браузере, а 1С показывает 404 или 403?
User-Agent или отличает робота от браузера. Добавьте заголовок и повторите запрос методом GET.