При переходе на новые версии платформы 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.
Если у вас нет возможности менять режим совместимости всей конфигурации (например, из-за опасений нарушить работу других механизмов), мы можем применить метод прямой корректировки кода. Рассмотрим, как правильно переписать запрос, чтобы «успокоить» платформу.
Основное правило: переносите условия фильтрации из секции ГДЕ непосредственно в параметры виртуальной таблицы. Это заставляет платформу строить SQL-запрос по иному алгоритму, который в большинстве случаев не подвержен описанному багу.
Переделаем наш пример выше:
Запрос.Текст = "ВЫБРАТЬ
| ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних.НематериальныйАктив
|ИЗ
| РегистрСведений.ПервоначальныеСведенияНМАБухгалтерскийУчет.СрезПоследних(&Период, Организация = &Организация) КАК ПервоначальныеСведенияНМАБухгалтерскийУчетСрезПоследних";
В данном случае мы убрали конструкцию ГДЕ и поместили условие Организация = &Организация во второй параметр метода СрезПоследних. Это наиболее безопасный и правильный с точки зрения производительности способ работы с виртуальными таблицами.
Также стоит попробовать добавить ключевое слово РАЗРЕШЕННЫЕ в текст запроса. Практика показывает, что это иногда меняет логику построения внутреннего дерева запроса и помогает обойти ошибку:
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ ...";
Если ошибок слишком много и они возникают в типовых механизмах (например, при расчете себестоимости или пересчете итогов), править каждый запрос вручную будет крайне трудоемко. В этом случае рассмотрим вариант повышения режима совместимости.
Как отмечают участники обсуждения, подъем режима совместимости до версии 8.2.13 или 8.2.16 полностью устраняет проблему с ir2. Однако это серьезный шаг, который требует предварительной подготовки. Разберем последствия:
ИТОГИ ПО. Рекомендуется провести выборочную проверку основных отчетов.Для изменения режима откройте свойства корневого объекта конфигурации, найдите пункт «Режим совместимости» и установите значение «Версия 8.2.13» или выше. После этого обязательно выполните полную компиляцию (проверку конфигурации).
Если ваша задача — сохранить конфигурацию в максимально первозданном виде (режим совместимости 8.1), проанализируем ситуацию с версиями платформы. Данная ошибка является «плавающей» и была исправлена в некоторых сервисных релизах.
Рассмотрим следующие варианты:
Часто ошибка ir2 блокирует возможность проведения регламентного обслуживания базы, так как «Пересчет итогов» падает с тем же сообщением. Выясним, как поступить в этой ситуации:
Мы проанализировали ситуацию, когда старая конфигурация начинает «капризничать» на новых движках 1С. Ошибка таблица или поле ir2 не содержится в разделе from — это сигнал о том, что Query Optimizer не может корректно обработать устаревший стиль написания запросов в режиме совместимости 8.1.
Наилучшая стратегия действий:
Если конфигурация позволяет, поднимите режим совместимости до 8.2.16. Это «вылечит» проблему системно. Если же вы ограничены жесткими рамками поддержки 8.1 — используйте платформу 8.3.18 или переписывайте запросы, перенося фильтры из ГДЕ в параметры виртуальных таблиц. Помните, что после любых манипуляций с режимами совместимости критически важно выполнить полный пересчет итогов для обеспечения целостности данных.