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