В процессе разработки и сопровождения конфигураций на обычных формах программисты часто сталкиваются с ситуацией, когда пользователь настолько сильно меняет состав, порядок и ширину колонок в списках, что работать с формой становится невозможно. Стандартный механизм «Настройка списка» не всегда интуитивно понятен рядовому сотруднику, а задача программного возврата к «заводским» настройкам (тем, что заданы в конфигураторе) требует понимания механизмов платформы 1С по хранению пользовательских данных.
В этой статье мы разберем, где именно 1С хранит эти данные, как ими управлять программно и какие существуют «хитрости» для принудительного обновления интерфейса у всех пользователей сразу.
Прежде чем что-то удалять или изменять, проанализируем, где система складирует информацию о положении колонок. В обычных формах настройки сохраняются автоматически. Место хранения зависит от режима работы базы:
1Cv8.1CD, а также дублируются в локальном кэше пользователя в папке %AppData%\1C\1cv8\.Config или SystemSettings).Важно понимать, что настройки привязаны к связке Пользователь + Объект Метаданных + Имя Формы. Если вы просто поменяете порядок колонок в конфигураторе, у пользователей, которые уже открывали эту форму, ничего не изменится, так как их индивидуальные настройки имеют приоритет над настройками по умолчанию.
Рассмотрим самый правильный и «цивилизованный» метод. В платформе 8.2 и 8.3 для управления такими данными предусмотрен объект ХранилищеСистемныхНастроек. Чтобы сбросить настройки формы (и, соответственно, табличного поля на ней), нам нужно удалить соответствующую запись из этого хранилища.
Разберем по шагам, как формируется ключ для удаления. Путь к настройке в обычном приложении обычно выглядит так: "ОбычноеПриложение/НастройкиФорм/ИмяМетаданного/ИмяФормы".
Посмотрим на пример кода, который выполняет очистку:
КлючОбъекта = "ОбычноеПриложение/НастройкиФорм/Документы/РеализацияТоваровУслуг/ФормаСписка";
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь().Имя;
// Удаляем настройки для текущего пользователя
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, , Пользователь);
После выполнения этого кода при следующем открытии формы система не обнаружит сохраненных настроек и отрисует табличное поле ровно так, как оно настроено в конфигураторе. Проанализируем ситуацию: если нам нужно сбросить настройки только одного конкретного табличного поля, а не всей формы, этот метод может быть избыточным, так как он сбросит и положение самого окна, и настройки других элементов. Однако в 90% случаев это именно то, что нужно разработчику.
Выясним причину, по которой 1С находит старые настройки. Она делает это по внутреннему идентификатору. У формы есть замечательное свойство КлючСохраненияПоложенияОкна. Если мы изменим этот ключ, платформа воспримет форму как абсолютно новую, для которой еще нет никаких сохраненных данных.
Этот способ идеально подходит, если вы выпустили обновление с критическими изменениями в структуре колонок и хотите, чтобы у всех пользователей настройки сбросились автоматически без написания сложных скриптов по очистке хранилища.
Рассмотрим пример установки ключа в модуле формы:
Процедура ПриОткрытии()
// Добавляем версию интерфейса к ключу сохранения
// При изменении версии на "v2", настройки "v1" будут проигнорированы
ЭтаФорма.КлючСохраненияПоложенияОкна = "Версия_2_ПорядокКолонокОбновлен";
КонецПроцедуры
Важный нюанс: этот метод не удаляет старые данные из базы, он просто заставляет систему их игнорировать и создавать новые записи под новым ключом.
Иногда требуется не просто «сбросить все», а программно установить строго определенный порядок колонок, независимо от того, что там накрутил пользователь. Для этого мы можем напрямую обращаться к коллекции Колонки табличного поля.
Рассмотрим, как сдвинуть колонку на нужную позицию и установить ее видимость:
// Получаем колонку по имени
КолонкаДата = ЭлементыФормы.Список.Колонки.Дата;
КолонкаНомер = ЭлементыФормы.Список.Колонки.Номер;
// Устанавливаем видимость
КолонкаДата.Видимость = Истина;
// Перемещаем колонку "Дата" на первое место (индекс 0)
ЭлементыФормы.Список.Колонки.Сдвинуть(КолонкаДата, -ЭлементыФормы.Список.Колонки.Индекс(КолонкаДата));
// Перемещаем "Номер" вслед за датой
ЭлементыФормы.Список.Колонки.Сдвинуть(КолонкаНомер, 1 - ЭлементыФормы.Список.Колонки.Индекс(КолонкаНомер));
Однако здесь есть «подводный камень». В обычных формах пользовательские настройки применяются после события ПриОткрытии. Это означает, что ваш программный код может быть перекрыт сохраненными настройками пользователя сразу после запуска. Чтобы победить это поведение, иногда используют обработчик ОбновлениеОтображения, но будьте осторожны: этот обработчик вызывается очень часто, и тяжелый код в нем может привести к существенным «тормозам» интерфейса.
В обсуждениях часто упоминается возможность использования Windows Script Host (WSH) для имитации нажатия клавиш. Это позволяет программно вызвать контекстное меню табличного поля, выбрать «Настройка списка» и нажать кнопку «Стандартная настройка».
Проанализируем этот метод: мы считаем его крайне нестабильным («костылем»). Любое изменение фокуса окна или задержка в сети (в случае терминального доступа) приведет к тому, что скрипт «промахнется». Мы рекомендуем использовать этот подход только в самых крайних случаях, когда другие методы недоступны.
Вместо этого лучше обратить внимание на профессиональные инструменты, такие как «Инструменты разработчика» (ИР). В них реализованы мощные механизмы управления пользовательскими настройками, которые позволяют администратору массово очищать или копировать настройки между пользователями.
Подводя итог, выделим основные рекомендации:
ХранилищеСистемныхНастроек.Удалить().КлючСохраненияПоложенияОкна.Колонки, но помните о приоритете пользовательских настроек.Понимая эти механизмы, вы сможете гибко управлять интерфейсом и обеспечивать комфортную работу пользователей в системе 1С:Предприятие.