Как исправить ошибку «таблица или поле ir2 не содержится в разделе from» при проведении документов и формировании запросов?

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

При переходе на новые версии платформы 1С:Предприятие 8.3 (начиная с релизов 8.3.20 и выше) пользователи и разработчики старых конфигураций (например, Бухгалтерия предприятия 1.6 или сильно кастомизированные решения на базе 8.1) часто сталкиваются с фатальной ошибкой. Она проявляется в виде сообщения «таблица или поле ir2 (или ir1, ir3) не содержится в разделе FROM». Эта проблема может возникать как при интерактивной работе пользователя (проведение документов, формирование отчетов), так и при выполнении регламентных операций, таких как «Закрытие месяца» или «Пересчет итогов» в режиме тестирования и исправления.

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

Анализируем причину возникновения ошибки

Давайте разберем техническую составляющую проблемы. Ошибка с кодом ir2 не является ошибкой в коде самой конфигурации в привычном понимании. Это внутренний программный дефект платформы 1С, зарегистрированный под номером 10235478. Суть проблемы заключается в работе Query Optimizer (оптимизатора запросов) платформы.

Когда конфигурация работает в режиме совместимости «Версия 8.1», платформа использует специфические механизмы трансляции языка запросов 1С в SQL-запросы к СУБД. В новых версиях платформы (8.3.20+) механизм генерации SQL-кода был изменен. При обращении к виртуальным таблицам, таким как СрезПоследних или СрезПервых, движок платформы некорректно назначает внутренние псевдонимы таблицам (те самые ir1, ir2, ir3). В итоге SQL-сервер получает некорректно сформированный запрос, где в поле SELECT указан псевдоним, которого нет в секции FROM, что и вызывает падение процесса.

Проанализируем типичный пример «опасного» запроса, который приводил автор темы:


Запрос.Текст = "ВЫБРАТЬ
| ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних.НематериальныйАктив
|ИЗ
| РегистрСведений.ПервоначальныеСведенияНМАБухгалтерскийУчет.СрезПоследних(&Период, ) КАК ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних
|ГДЕ
| ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних.Организация = &Организация";

Здесь условие фильтрации по организации вынесено в секцию ГДЕ. Именно такое построение запроса в сочетании со старым режимом совместимости провоцирует баг оптимизатора в новых релизах 8.3.

Решение 1: Оптимизация текста запросов (Локальное исправление)

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

Основное правило: переносите условия фильтрации из секции ГДЕ непосредственно в параметры виртуальной таблицы. Это заставляет платформу строить SQL-запрос по иному алгоритму, который в большинстве случаев не подвержен описанному багу.

Переделаем наш пример выше:


Запрос.Текст = "ВЫБРАТЬ
| ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних.НематериальныйАктив
|ИЗ
| РегистрСведений.ПервоначальныеСведенияНМАБухгалтерскийУчет.СрезПоследних(&Период, Организация = &Организация) КАК ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних";

В данном случае мы убрали конструкцию ГДЕ и поместили условие Организация = &Организация во второй параметр метода СрезПоследних. Это наиболее безопасный и правильный с точки зрения производительности способ работы с виртуальными таблицами.

Также стоит попробовать добавить ключевое слово РАЗРЕШЕННЫЕ в текст запроса. Практика показывает, что это иногда меняет логику построения внутреннего дерева запроса и помогает обойти ошибку:

Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ...";

Решение 2: Изменение режима совместимости конфигурации

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

Как отмечают участники обсуждения, подъем режима совместимости до версии 8.2.13 или 8.2.16 полностью устраняет проблему с ir2. Однако это серьезный шаг, который требует предварительной подготовки. Разберем последствия:

  1. Изменение механизма хранения итогов: В версии 8.2 появилась поддержка разделения итогов. После изменения режима совместимости необходимо обязательно запустить «Тестирование и исправление» с установленными галочками «Пересчет итогов» и «Реиндексация таблиц информационной базы». Для контроля корректности данных после пересчета применяется автоматическая сверка проводок между базами 1С с использованием COM-соединения.
  2. Привилегированный режим: Обратите внимание, что в 8.1 работа в привилегированном режиме имела свои особенности. Проверьте ключевые процедуры проведения документов.
  3. Группировки в запросах: В редких случаях может измениться поведение конструкции ИТОГИ ПО. Рекомендуется провести выборочную проверку основных отчетов.

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

Решение 3: Управление версиями платформы

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

Рассмотрим следующие варианты:

Решение 4: Проблемы при тестировании и исправлении

Часто ошибка ir2 блокирует возможность проведения регламентного обслуживания базы, так как «Пересчет итогов» падает с тем же сообщением. Выясним, как поступить в этой ситуации:

  1. Попробуйте выполнить «Выгрузку информационной базы» (.dt) и её последующую загрузку в чистую базу на платформе версии 8.3.18.
  2. В новой базе выполните полное «Тестирование и исправление». При обслуживании нескольких систем автоматическое архивирование и тестирование баз 1С выполняется по расписанию в тихом режиме.
  3. После того как итоги будут приведены в порядок на стабильной платформе, базу можно будет снова открыть на более новой версии 8.3.20+, либо оставить на 8.3.18.

Подведем итоги

Мы проанализировали ситуацию, когда старая конфигурация начинает «капризничать» на новых движках 1С. Ошибка таблица или поле ir2 не содержится в разделе from — это сигнал о том, что Query Optimizer не может корректно обработать устаревший стиль написания запросов в режиме совместимости 8.1.

Наилучшая стратегия действий: Если конфигурация позволяет, поднимите режим совместимости до 8.2.16. Это «вылечит» проблему системно. Если же вы ограничены жесткими рамками поддержки 8.1 — используйте платформу 8.3.18 или переписывайте запросы, перенося фильтры из ГДЕ в параметры виртуальных таблиц. Помните, что после любых манипуляций с режимами совместимости критически важно выполнить полный пересчет итогов для обеспечения целостности данных.

← На главную