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