Почему во внешней обработке не виден регистр из расширения и как исправить ошибку «Таблица не найдена» в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При активном внедрении механизмов расширения конфигурации в 1С:Предприятие разработчики часто сталкиваются со следующей проблемой: в базу добавляется собственное расширение, внутри него создается новый объект метаданных (например, справочник или РегистрСведений._СчетаПодразделений), но при попытке обратиться к нему из внешней обработки (.epf) система выдает ошибку «Таблица не найдена». Более того, при редактировании текста запроса во внешней обработке через стандартный Конструктор запросов добавленный регистр просто отсутствует в списке доступных таблиц.

В этой статье мы подробно разберем, почему возникает такое поведение платформы, как обойти ограничения Конструктора запросов на старых релизах платформы (включая популярные версии 8.3.12–8.3.27) и как правильно настроить свойства расширения, чтобы внешние обработки стабильно работали с новыми объектами.

Выясняем причину: почему платформа выдает ошибку «Таблица не найдена»

Когда мы работаем с расширениями в 1С, крайне важно понимать, как платформа разграничивает видимость объектов. Существует два ключевых фактора, из-за которых внешняя обработка может «не видеть» таблицу вашего нового регистра:

  1. Неверно выбранное «Назначение расширения». Это важнейшее свойство самого расширения, которое определяет степень его интеграции с основной конфигурацией. Если для расширения установлено назначение Дополнение, то все созданные в нем новые объекты метаданных будут аппаратно изолированы. Платформа не позволит внешней обработке или коду основной конфигурации обратиться к ним через запросы напрямую — результатом всегда будет ошибка обращения к таблице.
  2. Ограничения Конфигуратора в старых версиях платформы. До релиза 8.3.28 Конструктор запросов, запущенный в контексте внешней обработки, анализирует исключительно метаданные основной конфигурации. Он физически «не знает» о существовании объектов, добавленных через расширения, даже если они установлены в базу данных. При этом сам код запроса в режиме 1С:Предприятие работать будет, но визуально составить его в Конфигураторе не получится.

Рассмотрим подробнее по шагам, как решить каждую из этих проблем.

Шаг 1. Настройка свойства «Назначение расширения»

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

Выполним следующие действия:

  1. Откроем Конфигуратор и перейдем в меню Конфигурация — Расширения конфигурации.
  2. В открывшемся списке выберем наше расширение и откроем его палитру свойств (нажав клавишу F4 или выбрав пункт свойства в контекстном меню).
  3. Найдем свойство Назначение.
  4. Если там установлено значение Дополнение, обязательно заменим его на Адаптация или Исправление. Назначение Адаптация является наиболее предпочтительным для расширений, добавляющих новую бизнес-логику и справочную информацию.
  5. Сохраним изменения и обновим конфигурацию базы данных.

Установка режима Адаптация снимает жесткую изоляцию данных, делая таблицы вашего регистра доступными для внешних запросов.

Шаг 2. Обход ограничений Конструктора запросов на платформах до версии 8.3.28

Если мы работаем на версиях платформы ниже 8.3.28 (например, на 8.3.12, как автор темы на форуме), то Конструктор запросов во внешней обработке все равно не покажет наш регистр _СчетаПодразделений в списке доступных таблиц. Как же составить правильный запрос, не допустив синтаксических ошибок?

Проанализируем три основных метода обхода этой проблемы:

Метод А. Временное создание отчета/обработки внутри самого расширения

Это самый простой и быстрый способ визуально спроектировать сложный запрос:

  1. В дереве объектов нашего расширения временно создадим новый объект — например, отчет ВременныйОтчетДляЗапроса.
  2. Перейдем в схему компоновки данных или в модуль этого отчета и запустим Конструктор запросов.
  3. Поскольку мы находимся внутри контекста самого расширения, Конструктор запросов отобразит все новые таблицы, включая наш регистр РегистрСведений._СчетаПодразделений.
  4. Визуально настроим связи, выберем нужные поля и сгенерируем текст запроса.
  5. Скопируем полученный текст запроса из временного отчета и вставим его в модуль нашей внешней обработки.
  6. Удалим временный отчет из расширения, чтобы не засорять конфигурацию.

Метод Б. Использование консоли запросов в режиме «1С:Предприятие»

В режиме пользователя база данных работает с уже объединенными метаданными (основная конфигурация + все активные расширения). Мы можем воспользоваться этим:

  1. Запустим сеанс «1С:Предприятие» под пользователем с полными правами.
  2. Откроем любую внешнюю обработку «Консоль запросов» (желательно управляемую форму).
  3. В консоли запросов откроем конструктор. В списке таблиц мы увидим наш регистр из расширения.
  4. Сформируем запрос, проверим его работоспособность на реальных данных.
  5. Перенесем готовый текст запроса в Конфигуратор, в код нашей внешней обработки.

Метод В. Ручное написание текста запроса

Если запрос простой, мы можем написать его вручную в модуле внешней обработки, игнорируя предупреждения конфигуратора. Главное — строго соблюдать синтаксис имен объектов расширения. Например, код обращения к регистру сведений должен выглядеть следующим образом:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	_СчетаПодразделений.Подразделение КАК Подразделение,
    |	_СчетаПодразделений.Счет КАК Счет
    |ИЗ
    |	РегистрСведений._СчетаПодразделений КАК _СчетаПодразделений";

// Установка параметров запроса выполняется стандартным методом
Запрос.УстановитьПараметр("Подразделение", ВыбранноеПодразделение);

РезультатЗапроса = Запрос.Выполнить();

Обратите внимание: имя таблицы пишется точно так же, как оно задано в расширении (с учетом вашего префикса, например, префикса нижнего подчеркивания _СчетаПодразделений). Несмотря на то, что Конфигуратор может подчеркивать этот текст красным цветом или не предлагать автозаполнение, в режиме предприятия этот код отработает корректно.

Шаг 3. Очистка кэша и перезапуск сеанса

Часто разработчики сталкиваются с ситуацией: «Вчера не работало, сегодня пришел — всё работает само». Это связано с кэшированием метаданных платформой 1С. Когда вы добавляете новый объект в расширение конфигурации, запущенный сеанс внешней обработки может обращаться к устаревшей структуре БД.

Чтобы гарантированно применить изменения структуры данных, выполните следующие действия:

  1. Полностью закройте сеансы 1С:Предприятия и Конфигуратора.
  2. Очистите локальный кэш конфигурации. Для этого можно запустить 1С с параметром командной строки /ClearCache или вручную удалить папки кэша из каталогов %LocalAppData%\1C\1Cv8 и %AppData%\1C\1Cv8.
  3. Снова запустите базу и проверьте работоспособность обработки.

Шаг 4. Настройка безопасного режима внешней обработки

Если внешняя обработка запускается через механизм «Дополнительные отчеты и обработки» библиотеки стандартных подсистем (БСП) и при этом для нее включен Безопасный режим, платформа может заблокировать доступ к таблицам расширения из соображений безопасности.

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

Кардинальное решение проблемы в платформе 1С:Предприятие 8.3.28

Если у вас есть возможность обновить версию технологической платформы, настоятельно рекомендуем перейти на версию 8.3.28 или выше. В этом релизе фирма «1С» полностью устранила данное неудобство для разработчиков.

Начиная с версии 8.3.28, реализован полноценный механизм «Доступность объектов расширения из внешних обработок и отчётов»:

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

← На главную