Почему в отчете на СКД возникает ошибка «Поле не найдено» в управляемых формах и как ее решить?

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

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

В этой статье мы подробно разберем, почему управляемые формы ведут себя иначе, чем обычные, проанализируем внутренние механизмы платформы 1С:Предприятие 8.3, вызывающие это поведение, и рассмотрим несколько эффективных способов решения проблемы — от простых пользовательских действий до программного кода.

Главная причина: кэширование и хранилище системных настроек

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

Все эти сведения записываются в системную таблицу базы данных — Хранилище системных настроек (или Хранилище вариантов отчетов). При следующем открытии отчета платформа считывает сохраненную настройку и пытается применить ее поверх текущей схемы компоновки данных.

Если в процессе разработки или обновления отчета вы изменили схему СКД (например, удалили поле, переименовали путь к данным, изменили тип значения реквизита или структуру набора данных), сохраненная в базе пользовательская настройка всё равно попытается обратиться к старому пути данных. Не найдя его в обновленной схеме, платформа выдаст ту самую ошибку: «Поле не найдено [ИмяСтарогоПоля]».

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

Рассмотрим подробнее все возможные методы решения этой проблемы, начиная с самых простых.

Способ 1. Установка стандартных настроек (пользовательский метод)

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

  1. Откройте проблемный отчет в режиме «1С:Предприятие».
  2. В правом верхнем углу формы нажмите кнопку Еще.
  3. В выпадающем меню выберите пункт Установить стандартные настройки.

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

Способ 2. Изменение имени отчета (быстрый метод для разработчика)

Во время активной разработки и частой смены структуры СКД постоянно сбрасывать настройки вручную бывает неудобно. Чтобы мгновенно обойти механизм кэширования, достаточно изменить имя отчета:

  1. Если это внешний отчет, откройте его в конфигураторе и перейдите в свойства объекта. Измените поле Имя (например, вместо ПродажиПоРегионам укажите ПродажиПоРегионамНовый).
  2. Сохраните файл с расширением .erf.

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

Способ 3. Перезапись в справочнике дополнительных отчетов и обработок

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

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

  1. Перейдите в раздел Администрирование — Дополнительные отчеты и обработки.
  2. Найдите ваш отчет в списке и откройте его карточку.
  3. Нажмите кнопку Загрузить из файла и выберите обновленный файл отчета.
  4. Запишите элемент справочника. При перезаписи БСП автоматически обновляет связанные варианты отчетов.

Способ 4. Программная очистка настроек пользователей

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

Для удаления настроек конкретного объекта метаданных воспользуемся встроенным методом глобального контекста ХранилищеСистемныхНастроек. Разберем пример кода:


// Программный сброс текущих пользовательских настроек конкретного отчета
Процедура ОчиститьНастройкиОтчета(ИмяОтчета, ИмяПользователя = Неопределено) Экспорт
    
    // Ключ объекта состоит из пути к отчету и суффикса сохраненных настроек
    КлючОбъекта = "Отчет." + ИмяОтчета + "/ТекущиеПользовательскиеНастройки";
    
    Попытка
        ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, Неопределено, ИмяПользователя);
        ЗаписатьЛогСобытия("Настройки отчета " + ИмяОтчета + " успешно сброшены.");
    Исключение
        ВызватьИсключение "Не удалось очистить настройки: " + ОписаниеОшибки();
    КонецПопытки;
    
КонецПроцедуры

Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), для управления вариантами и настройками отчетов лучше использовать штатные механизмы БСП. Метод очистки выглядит следующим образом:


// Сброс пользовательских настроек вариантов отчетов средствами БСП
КлючОбъекта = "Отчет.МойУникальныйОтчет";
ВариантыОтчетов.СброситьПользовательскиеНастройки(КлючОбъекта);

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

Другие скрытые причины ошибки «Поле не найдено»

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

Проанализируем две такие ситуации:

  1. Ограничение прав на уровне записей (RLS). Если у пользователя нет прав на чтение определенного реквизита справочника или документа, используемого в виртуальной таблице запроса, СКД автоматически исключает это поле из выборки на этапе построения схемы. Платформа делает это молча, не выдавая предупреждений безопасности, из-за чего отчет падает с технической ошибкой «Поле не найдено».
    Решение: Всегда используйте ключевое слово РАЗРЕШЕННЫЕ в тексте запроса СКД. Это заставит систему проигнорировать недоступные записи и поля, не прерывая выполнение отчета.
  2. Функциональные опции. В управляемом приложении функциональные опции (ФО) работают очень строго. Если поле привязано к ФО, которая в данный момент выключена в режиме предприятия, СКД полностью исключает это поле из макета компоновки данных.
  3. Обращение к реквизитам составного типа через точку. Если в запросе вы обращаетесь к реквизиту составного типа (например, Регистратор.Дата), и у текущего пользователя нет прав хотя бы на один из типов документов, входящих в этот составной тип, платформа может заблокировать доступ ко всему полю.
    Решение: Используйте явное приведение типов с помощью функции ВЫРАЗИТЬ в тексте запроса.

Посмотрим на пример безопасного обращения к реквизитам составного типа:


// Небезопасный запрос, который может вызвать ошибку доступа к полю "Дата" у некоторых пользователей:
ВЫБРАТЬ
    Продажи.Регистратор.Дата КАК ДатаРегистратора
ИЗ
    РегистрНакопления.Продажи КАК Продажи

// Безопасный вариант с явным приведением типов:
ВЫБРАТЬ
    ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата КАК ДатаРегистратора
ИЗ
    РегистрНакопления.Продажи КАК Продажи

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

Мы выяснили, что в управляемых формах 1С ошибка «Поле не найдено» чаще всего связана с автоматическим сохранением вариантов и пользовательских настроек. Чтобы быстро решить проблему при разработке, достаточно воспользоваться командой «Установить стандартные настройки» или временно переименовать отчет. Для массового исправления ошибок у пользователей применяйте административную очистку настроек в пользовательском интерфейсе или программные методы очистки хранилища системных настроек.

← На главную