Почему не сохраняются настройки формы в 1С 8.3 и как это исправить?

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

В практике разработки и сопровождения на платформе 1С:Предприятие 8.3 часто встречается ситуация: пользователь настраивает форму «под себя» (через меню «Изменить форму» или используя редактор форм в режиме предприятия), добавляет нужные колонки в динамический список или таблицу, нажимает «ОК», но после перезапуска сеанса все внесенные изменения бесследно исчезают. Это вызывает закономерное раздражение у пользователей и ставит в тупик начинающих разработчиков. Разберем подробно, почему так происходит, и какие механизмы платформы за это отвечают — для подобных задач есть инструментарий разработчика для анализа метаданных.

Анализ КлючаНазначенияИспользования

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

Рассмотрим ситуацию: в коде формы (обычно в процедуре ПриСозданииНаСервере) разработчик может по ошибке или намеренно прописать генерацию нового уникального идентификатора (поможет инструмент для отладки 1С в режиме Предприятие):


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // ОШИБКА: При каждом открытии создается новый ключ, настройки не сохранятся
    ЭтаФорма.КлючНазначенияИспользования = Новый УникальныйИдентификатор;
КонецПроцедуры

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

Программное управление видимостью

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

Посмотрим на пример кода, который может перекрывать настройки пользователя:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Код жестко управляет видимостью, игнорируя настройки пользователя
    Элементы.СписокСумма.Видимость = Ложь;
КонецПроцедуры

Важно различать свойства Видимость и ПользовательскаяВидимость. Если программно установлено Видимость = Ложь, элемент исчезнет из формы совсем, и пользователь даже не увидит его в окне «Изменить форму». Если же управление идет через роли и функциональные опции, стоит проверить настройки в конфигураторе на закладке «Использование» для конкретного элемента формы.

Настройка «Использовать всегда» в конфигураторе

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

  1. Если флаг «Использовать всегда» снят, платформа может оптимизировать запрос динамического списка и не выбирать данные для этой колонки, если она скрыта.
  2. В некоторых случаях это приводит к тому, что при попытке пользователя включить колонку интерактивно, данные в неё не подтягиваются или настройка сбрасывается, так как поле не включено в состав обязательных.
  3. Установка этого флага гарантирует, что поле будет присутствовать в выборке БД, что повышает стабильность сохранения пользовательских настроек.

Проверка прав доступа

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

Очистка поврежденного кэша настроек

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


// Пример программной очистки настроек формы
ПутьКФорме = "Документ.РеализацияТоваровУслуг.Форма.ФормаСписка";
ХранилищеСистемныхНастроек.Удалить(ПутьКФорме, , ИмяПользователя);

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

Влияние функциональных опций и расширений

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

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

Подводя итог, для решения проблемы сохранения настроек формы мы должны последовательно пройти по чек-листу:

← На главную