При работе с современными версиями платформы «1С:Предприятие 8.3» (начиная с релиза 8.3.19 и выше) специалисты часто сталкиваются с появлением в структуре базы данных таблицы URLExternalData. Особенность этой таблицы заключается в том, что она является системной и не отображается в дереве метаданных конфигурации, что вызывает массу вопросов при возникновении ошибок реструктуризации, таких как «Ошибка SDBL: Таблица или поле DataSeparationUse не содержится в разделе FROM». В этой статье мы подробно разберем, зачем нужна эта таблица, как она функционирует и как устранить технические проблемы, связанные с ней.
Рассмотрим природу появления этого объекта. Таблица URLExternalData (в терминах структуры БД — «Хранилище внешних данных навигационных ссылок») была введена для расширения возможностей механизма навигационных ссылок. Ранее навигационные ссылки имели жесткое ограничение по длине, поскольку все параметры (например, отборы в форме списка) должны были упаковываться непосредственно в строку URL. Это делало невозможным передачу сложных структур или больших объемов данных.
Начиная с версии 8.3.19, платформа реализует новый подход: если при формировании ссылки во второй параметр метода ПолучитьНавигационнуюСсылку() передается структура с данными, платформа выполняет следующие действия:
URLExternalData.extdata (GUID).Таким образом, при переходе по ссылке платформа считывает extdata, находит соответствующую запись в URLExternalData, восстанавливает структуру параметров и применяет их к открываемой форме. Это позволяет передавать практически неограниченные объемы настроек через лаконичные ссылки.
Проанализируем, как режим совместимости конфигурации влияет на поведение этой таблицы. Это критически важно для понимания того, почему ошибка может возникать на одних базах и отсутствовать на других при идентичном коде:
URLExternalData). Если в свойствах конфигурации явно не указано иное хранилище в поле ХранилищеВнешнихДанныхНавигационныхСсылок, используется системное.Выясним причину, по которой таблица может присутствовать в базе даже при низком режиме совместимости. Если база данных эксплуатировалась на высоких релизах платформы (например, 8.3.22), платформа могла инициировать создание таблицы при определенных действиях пользователя (например, сохранении в «Избранное»), даже если режим совместимости формально ниже 19-го. Это создает «фантомный» объект, который при последующем обновлении конфигурации вступает в конфликт с логикой SDBL-процессора.
Посмотрим на техническую сторону ошибки DataSeparationUseXXXX. Это поле отвечает за разделение данных в мультиарендных архитектурах (областях данных). Ошибка «Таблица или поле не содержится в разделе FROM» означает, что внутренний движок 1С (SDBL) при генерации SQL-запроса ожидает увидеть в таблице URLExternalData колонки, отвечающие за разделители, но фактически в СУБД их нет, либо они имеют неверный индекс.
Это происходит из-за рассинхронизации логической модели данных, которую хранит платформа, и физической структуры таблиц в SQL. Поскольку таблица URLExternalData системная, она не всегда корректно проходит стандартную процедуру реструктуризации вместе с объектами метаданных .cf файла.
Если при обновлении или работе вы столкнулись с ошибками, связанными с этой таблицей, разберем по шагам варианты исправления ситуации.
Это наиболее «чистый» и рекомендуемый способ. Процесс выгрузки в .dt и последующей загрузки в новую базу данных заставляет платформу пересоздать все системные индексы и таблицы с нуля. Поскольку URLExternalData не является частью прикладных метаданных, при загрузке в новую базу она будет создана в корректном формате, соответствующем текущему релизу платформы и настройкам разделителей.
Рассмотрим более радикальный метод для администраторов БД. Если вы используете MS SQL Server или PostgreSQL, и база не находится в облаке, таблицу можно удалить вручную. Перед этим обязательно создайте резервную копию.
После удаления таблицы URLExternalData средствами SQL, платформа при следующем обращении к механизму внешних навигационных ссылок автоматически создаст её заново с правильной структурой. Это часто помогает, если ошибка SDBL блокирует обновление конфигурации.
Иногда причина кроется не в самой таблице, а в кэшированных данных о разделителях. Выполните следующие действия:
snccntxt в каталоге данных сервера.Выясним, как можно взаимодействовать с этими данными из кода. Платформа не предоставляет прямого доступа к URLExternalData через запросы ВЫБРАТЬ, но работать с данными можно через стандартные хранилища настроек. Если вы хотите реализовать очистку устаревших ссылок (так как платформа не делает этого автоматически, и таблица может бесконтрольно расти), используйте следующий подход:
// Пример получения доступа к хранилищу через встроенный язык
Настройки = СтандартноеХранилищеНастроекВыборка.Выбрать();
Пока Настройки.Следующий() Цикл
// Проверяем дату изменения, чтобы удалить старые данные
Если Настройки.ДатаИзменения < НужнаяДата Тогда
СтандартноеХранилищеНастроек.Удалить("ВнешниеДанныеНавигационныхСсылок", Настройки.КлючОбъекта, Настройки.КлючНастроек);
КонецЕсли;
КонецЦикла;
Обратите внимание, что для использования этого кода необходимо, чтобы в свойствах конфигурации было явно указано хранилище для внешних данных навигационных ссылок. В противном случае работа будет вестись с системным хранилищем, доступ к которому ограничен.
Подведем итог: таблица URLExternalData — это важный элемент современной инфраструктуры 1С, обеспечивающий гибкость работы с навигационными ссылками. Ошибки SDBL, связанные с ней, чаще всего вызваны «наследованием» некорректной структуры таблицы при переходе между версиями платформы. Использование метода выгрузки/загрузки .dt или временное удаление таблицы на уровне СУБД являются проверенными способами восстановления работоспособности базы данных.