Каждый разработчик 1С рано или поздно сталкивается с ситуацией, когда отлаженный и прекрасно работающий в обычных формах (или в консоли запросов) отчет на схеме компоновки данных (СКД) при запуске в управляемом приложении внезапно выдает ошибку «Поле не найдено». При этом структура схемы кажется абсолютно верной, а само поле физически присутствует в наборе данных.
В этой статье мы подробно разберем, почему управляемые формы ведут себя иначе, чем обычные, проанализируем внутренние механизмы платформы 1С:Предприятие 8.3, вызывающие это поведение, и рассмотрим несколько эффективных способов решения проблемы — от простых пользовательских действий до программного кода.
Основное отличие управляемого приложения в контексте работы с отчетами СКД заключается в автоматизации процессов. Платформа стремится сделать работу пользователя максимально комфортной, поэтому при каждом закрытии отчета она автоматически сохраняет его текущее состояние. Сюда относятся:
Все эти сведения записываются в системную таблицу базы данных — Хранилище системных настроек (или Хранилище вариантов отчетов). При следующем открытии отчета платформа считывает сохраненную настройку и пытается применить ее поверх текущей схемы компоновки данных.
Если в процессе разработки или обновления отчета вы изменили схему СКД (например, удалили поле, переименовали путь к данным, изменили тип значения реквизита или структуру набора данных), сохраненная в базе пользовательская настройка всё равно попытается обратиться к старому пути данных. Не найдя его в обновленной схеме, платформа выдаст ту самую ошибку: «Поле не найдено [ИмяСтарогоПоля]».
В обычных формах сохранение настроек чаще всего реализовывалось разработчиком вручную или работало по другим механизмам, поэтому там эта проблема возникала значительно реже.
Рассмотрим подробнее все возможные методы решения этой проблемы, начиная с самых простых.
Это самый быстрый способ вернуть отчет в рабочее состояние без изменения метаданных и написания кода. Разберем по шагам, как заставить платформу забыть старый кэш настроек:
Этот шаг принудительно сбросит текущие пользовательские настройки и применит настройки по умолчанию, заложенные разработчиком непосредственно в схему компоновки данных. В большинстве случаев ошибка сразу исчезает.
Во время активной разработки и частой смены структуры СКД постоянно сбрасывать настройки вручную бывает неудобно. Чтобы мгновенно обойти механизм кэширования, достаточно изменить имя отчета:
Имя (например, вместо ПродажиПоРегионам укажите ПродажиПоРегионамНовый)..erf.Поскольку имя объекта изменилось, платформа идентифицирует его как совершенно новый отчет. Для него еще нет записей в Хранилище системных настроек, поэтому он откроется с актуальной структурой СКД без каких-либо ошибок.
Если ваш отчет зарегистрирован в базе как дополнительный (внешний) отчет через подсистему БСП (Библиотека стандартных подсистем), обычного открытия файла через меню «Файл — Открыть» может быть недостаточно. Платформа привязывает сохраненные варианты к уникальному идентификатору версии файла.
Выполните следующие действия:
Если отчет встроен в конфигурацию и им пользуются десятки сотрудников, ручной сброс настроек у каждого из них превратится в рутину. В таких случаях эффективнее использовать программные инструменты администратора или написать обработку для очистки кэша настроек.
Для удаления настроек конкретного объекта метаданных воспользуемся встроенным методом глобального контекста ХранилищеСистемныхНастроек. Разберем пример кода:
// Программный сброс текущих пользовательских настроек конкретного отчета
Процедура ОчиститьНастройкиОтчета(ИмяОтчета, ИмяПользователя = Неопределено) Экспорт
// Ключ объекта состоит из пути к отчету и суффикса сохраненных настроек
КлючОбъекта = "Отчет." + ИмяОтчета + "/ТекущиеПользовательскиеНастройки";
Попытка
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, Неопределено, ИмяПользователя);
ЗаписатьЛогСобытия("Настройки отчета " + ИмяОтчета + " успешно сброшены.");
Исключение
ВызватьИсключение "Не удалось очистить настройки: " + ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Если в вашей конфигурации используется Библиотека стандартных подсистем (БСП), для управления вариантами и настройками отчетов лучше использовать штатные механизмы БСП. Метод очистки выглядит следующим образом:
// Сброс пользовательских настроек вариантов отчетов средствами БСП
КлючОбъекта = "Отчет.МойУникальныйОтчет";
ВариантыОтчетов.СброситьПользовательскиеНастройки(КлючОбъекта);
Этот метод корректно очистит сохраненные настройки для всех пользователей информационной базы, предотвращая появление ошибки при следующем открытии отчета.
Если вы очистили кэш, сбросили настройки до стандартных, но отчет все равно выдает ошибку отсутствия поля под обычным пользователем (в то время как под полными правами всё формируется корректно), дело может быть в платформенных механизмах ограничения доступа.
Проанализируем две такие ситуации:
РАЗРЕШЕННЫЕ в тексте запроса СКД. Это заставит систему проигнорировать недоступные записи и поля, не прерывая выполнение отчета.
Регистратор.Дата), и у текущего пользователя нет прав хотя бы на один из типов документов, входящих в этот составной тип, платформа может заблокировать доступ ко всему полю.
ВЫРАЗИТЬ в тексте запроса.
Посмотрим на пример безопасного обращения к реквизитам составного типа:
// Небезопасный запрос, который может вызвать ошибку доступа к полю "Дата" у некоторых пользователей:
ВЫБРАТЬ
Продажи.Регистратор.Дата КАК ДатаРегистратора
ИЗ
РегистрНакопления.Продажи КАК Продажи
// Безопасный вариант с явным приведением типов:
ВЫБРАТЬ
ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата КАК ДатаРегистратора
ИЗ
РегистрНакопления.Продажи КАК Продажи
Мы выяснили, что в управляемых формах 1С ошибка «Поле не найдено» чаще всего связана с автоматическим сохранением вариантов и пользовательских настроек. Чтобы быстро решить проблему при разработке, достаточно воспользоваться командой «Установить стандартные настройки» или временно переименовать отчет. Для массового исправления ошибок у пользователей применяйте административную очистку настроек в пользовательском интерфейсе или программные методы очистки хранилища системных настроек.