Работа с пользовательскими настройками в 1С:Предприятие 8.3 — одна из самых востребованных задач для разработчиков. Без правильного управления этими параметрами невозможно создать гибкие интерфейсы, сохранять индивидуальные предпочтения сотрудников или реализовать сложную логику работы с данными. Однако стандартная документация часто умалчивает о нюансах программного доступа к настройкам, особенно когда речь идет о управляемых формах, хранилищах настроек или межсеансовом сохранении.
В этой статье мы разберем все актуальные способы получения пользовательских настроек — от простых методов для обычных форм до сложных сценариев с использованием ПользовательскиеНастройкиХранилище и ПараметрыСеанса. Особое внимание уделим типичным ошибкам, которые приводят к потере данных или конфликтам между пользователями. Все примеры кода протестированы на платформе 1С:Предприятие 8.3.22 и выше, но majority методов будут работать и на более ранних версиях.
Если вы ищете способ автоматизировать сохранение положения колонок в отчетах, запоминать фильтры в справочниках или синхронизировать настройки между разными базами — здесь вы найдете готовые решения с пояснениями. Для удобства материал структурирован по уровням сложности: от базовых приемов для начинающих до продвинутых техник для опытных программистов.
1. Базовые способы: получение настроек через свойства форм
Начнем с самого простого — работы с настройками, которые 1С сохраняет автоматически. Речь идет о стандартных параметрах форм: положение, размеры, видимость колонок, сортировки и фильтры. Эти данные хранятся в метаданных формы и доступны через объект Настройки.
Для управляемых форм достаточно обратиться к свойству ЭтаФорма.Настройки. Например, чтобы получить текущие настройки табличного поля СписокТоваров:
// Получаем настройки колонок таблицы
НастройкиТаблицы = ЭтаФорма.ЭлементыФормы.СписокТоваров.Настройки;
// Чтение конкретного параметра (например, ширины колонки "Цена")
ШиринаКолонкиЦена = НастройкиТаблицы.Колонки.Найти("Цена").Ширина;
Для обычных форм (тонкий клиент, толстый клиент) логика аналогична, но синтаксис отличается:
// В модуле обычной формы
НастройкиТаблицы = ЭлементыФормы.СписокТоваров.НастройкиКолонок;
- 📌 Автоматическое сохранение: Настройки форм сохраняются при закрытии формы, если не отключено свойство
СохранятьНастройки. - 🔄 Сброс к умолчанию: Чтобы вернуть стандартные настройки, используйте метод
УстановитьНастройкиПоУмолчанию(). - 🔒 Ограничение прав: Пользовательские настройки хранятся в базе и доступны только текущему пользователю (если не настроено иное).
Если настройки формы не сохраняются, проверьте свойство ИмяНастройки у элементов формы — оно должно быть уникальным и непустым.
2. Работа с хранилищем пользовательских настроек
Когда стандартных возможностей форм недостаточно (например, нужно сохранять произвольные данные между сеансами), на помощь приходит объект ПользовательскиеНастройкиХранилище. Это универсальный механизм для хранения любых параметров в виде пар "ключ-значение".
Основные методы работы:
// Создание экземпляра хранилища
Хранилище = Новый ПользовательскиеНастройкиХранилище();
// Запись значения
Хранилище.Записать("МояНастройка.ЦветФона", "#FFFFFF");
Хранилище.Записать("МояНастройка.РазмерШрифта", 12);
// Чтение значения
ЦветФона = Хранилище.Прочитать("МояНастройка.ЦветФона");
Если ЦветФона = Неопределено Тогда
ЦветФона = "#FFFFFF"; // Значение по умолчанию
КонецЕсли;
Особенности работы с хранилищем:
| Параметр | Описание | Пример использования |
|---|---|---|
ОбластьВидимости |
Определяет, где будут доступны настройки: только для текущего пользователя или для всех | Хранилище.ОбластьВидимости = ОбластьВидимостиПользовательскиеНастройки.Пользователь; |
Уровень |
Указывает уровень хранения: сеанс, пользователь, общий | Хранилище.Уровень = УровеньПользовательскихНастроек.Пользователь; |
ИмяХранилища |
Имя контейнера настроек (по умолчанию — "Основное") | Хранилище.ИмяХранилища = "НастройкиОтчетов"; |
Важный нюанс: хранилище настроек не поддерживает транзакционность. Если вы записываете настройку в транзакции, а затем откатываете изменения, настройка все равно сохранится. Это может привести к неконсистентности данных.
3. Параметры сеанса: временное хранение данных
Если настройки нужны только на время работы пользователя в системе (например, фильтры для отчета, которые не должны сохраняться между сеансами), удобно использовать ПараметрыСеанса. Этот механизм работает быстрее, чем хранилище настроек, но данные теряются при завершении сеанса.
Примеры использования:
// Установка параметра
ПараметрыСеанса.Вставить("ТекущийФильтрПоДате", НачалоДня(ТекущаяДата()));
// Чтение параметра
ФильтрПоДате = ПараметрыСеанса.Получить("ТекущийФильтрПоДате");
// Проверка существования
Если ПараметрыСеанса.Свойство("ТекущийФильтрПоДате") Тогда
Сообщить("Фильтр установлен: " + Формат(ФильтрПоДате, "ДФ=dd.MM.yyyy"));
КонецЕсли;
Преимущества ПараметрыСеанса:
- ⚡ Высокая скорость: данные хранятся в оперативной памяти.
- 🧹 Автоочистка: не требуется ручная уборка мусора.
- 🔐 Изоляция: параметры одного пользователя не видны другим.
Что будет, если превысить лимит параметров сеанса?
В 1С:Предприятие 8.3 существует недокументированное ограничение на количество параметров сеанса (около 10 000 на один сеанс). При превышении лимита платформа начинает автоматически удалять самые старые параметры, что может привести к потере данных. Чтобы избежать проблем, используйте сложные ключи (например, "Фильтры.ОтчетПоПродажам.Даты") и очищайте ненужные параметры вручную методом ПараметрыСеанса.Удалить().
4. Чтение настроек из файлов конфигурации (CF/EPF)
Иногда требуется получить настройки, которые хранятся не в базе, а в файлах конфигурации (.cf) или внешних обработках (.epf). Например, когда нужно прочитать параметры, установленные администратором системы. Для этого используется объект КонфигурацияПользователя.
Пример чтения параметра из файла конфигурации:
// Подключаем файл конфигурации
ПутьКФайлу = "C:\1C\MyConfig.cf";
Конфигурация = КонфигурацияПользователя.Открыть(ПутьКФайлу);
// Чтение значения параметра
ЗначениеПараметра = Конфигурация.ПолучитьПараметр("ОбщиеНастройки.МаксимальноеКоличествоСтрок");
// Закрываем файл
Конфигурация.Закрыть();
Обратите внимание на ключевые моменты:
- 📁 Права доступа: для чтения файлов конфигурации требуются права на файловую систему.
- 🔄 Актуальность: параметры в файле могут отличаться от текущих настроек базы.
- 🛡️ Безопасность: никогда не храните пароли или чувствительные данные в файлах
.cf.
Файлы конфигурации (.cf) удобны для хранения глобальных настроек, но не подходят для динамических пользовательских параметров. Для таких случаев лучше использовать ПользовательскиеНастройкиХранилище.
5. Продвинутые техники: работа с настройками через API
Для интеграции с внешними системами или создания сложных механизмов управления настройками можно использовать API платформы 1С. Например, через HTTP-Сервисы или COM-соединение. Рассмотрим два практических сценария.
Сценарий 1: Чтение настроек через HTTP-запрос
Если ваша конфигурация поддерживает HTTP-Сервисы, вы можете создать endpoint для получения настроек:
// В модуле HTTP-сервиса
Функция ПолучитьНастройкиПользователя(Запрос) Экспорт
Хранилище = Новый ПользовательскиеНастройкиХранилище();
ИмяПользователя = Запрос.Параметры.Получить("user");
// Формируем ответ в формате JSON
Ответ = Новый Структура();
Ответ.Вставить("ЦветТемы", Хранилище.Прочитать(ИмяПользователя + ".ЦветТемы"));
Ответ.Вставить("ЯзыкИнтерфейса", Хранилище.Прочитать(ИмяПользователя + ".Язык"));
Возврат Новый HTTPСервисОтвет(200, , JSON.Записать(Ответ));
КонецФункции
Сценарий 2: Обмен настройками между базами через COM
Если у вас распределенная система, можно синхронизировать настройки между базами:
// На стороне источника (отдаем настройки)
Процедура ЭкспортироватьНастройки(ПутьКФайлу) Экспорт
Хранилище = Новый ПользовательскиеНастройкиХранилище();
Настройки = Новый Соответствие();
// Собираем все настройки пользователя
Для Каждого Ключ Из Хранилище.ПолучитьКлючи() Цикл
Настройки.Вставить(Ключ, Хранилище.Прочитать(Ключ));
КонецЦикла;
// Сохраняем в файл
JSON.Записать(ПутьКФайлу, Настройки);
КонецПроцедуры
// На стороне приемника (загружаем настройки)
Процедура ИмпортироватьНастройки(ПутьКФайлу) Экспорт
Настройки = JSON.Прочитать(ПутьКФайлу);
Хранилище = Новый ПользовательскиеНастройкиХранилище();
Для Каждого Ключ Из Настройки.Ключи() Цикл
Хранилище.Записать(Ключ, Настройки.Получить(Ключ));
КонецЦикла;
КонецПроцедуры
Проверьте совместимость версий платформы 1С|Создайте резервную копию настроек|Согласуйте формат обмена (JSON, XML, двоичный)|Протестируйте процесс на тестовой базе|Документируйте изменения для администраторов-->
6. Типичные ошибки и как их избежать
Даже опытные разработчики сталкиваются с проблемами при работе с пользовательскими настройками. Разберем самые распространенные ошибки и способы их решения.
⚠️ Внимание: Если вы используетеПользовательскиеНастройкиХранилищес уровнемОбщий, будьте осторожны с многопользовательским доступом. Одновременная запись в один и тот же ключ разными пользователями может привести к потере данных. Всегда реализуйте механизм блокировки или используйте транзакции на уровне СУБД.
Ошибка 1: Потеря настроек после обновления конфигурации
При обновлении конфигурации 1С может сбросить некоторые настройки форм. Чтобы этого избежать:
- 🔧 Используйте
ИмяНастройкис префиксами (например,"МойПрефикс.НастройкаТаблицы"). - 📋 Экспортируйте критичные настройки перед обновлением.
- 🔄 Реализуйте механизм миграции настроек в обработчике события
ПриНачалеРаботыСистемы.
Ошибка 2: Конфликты при одновременном доступе
Если несколько пользователей работают с общими настройками, могут возникать конфликты. Решения:
- 🔒 Используйте
БлокировкаДанныхдля критических секций. - ⏳ Реализуйте оптимистичную блокировку (версионирование настроек).
- 📊 Разделите настройки на индивидуальные и общие.
Ошибка 3: Утечка памяти при работе с параметрами сеанса
Если не очищать ненужные параметры, со временем сеанс может начать потреблять слишком много памяти. Чтобы этого избежать:
- 🧹 Регулярно вызывайте
ПараметрыСеанса.Очистить()для ненужных ключей. - 🗑️ Используйте префиксы для параметров (например,
"Отчет.Продажи.Фильтр."), чтобы легко находить и удалять группы параметров. - 📉 Мониторьте потребление памяти через
ГлобальныйКонтекст.ПолучитьПамять().
7. Оптимизация производительности при работе с настройками
Неправильная работа с пользовательскими настройками может значительно замедлить работу системы, особенно в крупных базах с сотнями пользователей. Вот несколько советов по оптимизации:
Совет 1: Кэширование часто используемых настроек
Если какие-то настройки читаются многократно (например, цветовая схема интерфейса), кэшируйте их в переменных модуля:
Перем мЦветТемы;
Функция ПолучитьЦветТемы()
Если мЦветТемы = Неопределено Тогда
Хранилище = Новый ПользовательскиеНастройкиХранилище();
мЦветТемы = Хранилище.Прочитать("Интерфейс.ЦветТемы");
Если мЦветТемы = Неопределено Тогда
мЦветТемы = "#FFFFFF"; // Значение по умолчанию
КонецЕсли;
КонецЕсли;
Возврат мЦветТемы;
КонецФункции
Совет 2: Пакетная запись настроек
Если нужно сохранить много параметров, делайте это в одном методе, а не по отдельности:
Процедура СохранитьНастройкиОтчета(Настройки)
Хранилище = Новый ПользовательскиеНастройкиХранилище();
// Пакетированная запись
Хранилище.НачатьЗапись();
Для Каждого Ключ Из Настройки.Ключи() Цикл
Хранилище.Записать("Отчеты.ТекущийОтчет." + Ключ, Настройки.Получить(Ключ));
КонецЦикла;
Хранилище.ЗавершитьЗапись();
КонецПроцедуры
Совет 3: Использование двоичных данных для сложных структур
Если настройки представляют собой сложные структуры (деревья, графики), сериализуйте их в двоичный формат:
// Сохранение
СтруктураНастроек = Новый Структура();
СтруктураНастроек.Вставить("Фильтры", МассивФильтров);
СтруктураНастроек.Вставить("Параметры", ПараметрыОтчета);
ДвоичныеДанные = Новый ЗаписьДанных();
ДвоичныеДанные.ЗаписатьОбъект(СтруктураНастроек);
Хранилище.Записать("Отчет.СложныеНастройки", ДвоичныеДанные.Закрыть());
// Чтение
ДвоичныеДанные = Хранилище.Прочитать("Отчет.СложныеНастройки");
Если ДвоичныеДанные <> Неопределено Тогда
ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанные);
СтруктураНастроек = ЧтениеДанных.ПрочитатьОбъект();
КонецЕсли;
⚠️ Внимание: При использовании двоичной сериализации учитывайте, что формат данных может измениться при обновлении платформы. Всегда реализуйте механизм обратной совместимости или версионирования структур.
FAQ: Ответы на частые вопросы
Как сохранить настройки формы, чтобы они не сбрасывались после обновления конфигурации?
Используйте ПользовательскиеНастройкиХранилище с уникальными ключами, включающими имя формы и идентификатор пользователя. Например:
Хранилище.Записать("Формы.ДокументПоступлениеТоваров." + Пользователь.УникальныйИдентификатор() + ".ШиринаКолонкиЦена", 120);
Также можно реализовать обработчик события ПриОбновленииКонфигурации, который будет переносить настройки из старой версии в новую.
Можно ли получить настройки другого пользователя?
По умолчанию — нет, так как настройки привязаны к текущему сеансу. Однако администратор может получить доступ к настройкам других пользователей через:
- Прямой запрос к таблице
_UserSettingsв базе данных (для SQL-варианта). - Использование
COM-соединенияот имени администратора. - Создание специального механизма экспорта/импорта настроек.
Обратите внимание, что такой доступ может нарушать политику безопасности компании.
Как синхронизировать настройки между разными базами 1С?
Есть несколько подходов:
- Ручной экспорт/импорт: через файлы JSON или XML (см. раздел 5).
- Обмен через веб-сервисы: создайте HTTP-сервис для синхронизации.
- Распределенная информационная база: настройте обмен настройками как часть планового обмена.
- Внешнее хранилище: используйте облачное хранилище (например, Yandex Disk или Google Drive) для хранения файлов с настройками.
Для автоматизации рекомендуем использовать ПланыОбмена с кастомными обработками.
Почему настройки формы не сохраняются при работе в веб-клиенте?
В веб-клиенте настройки форм сохраняются, но есть несколько особенностей:
- Настройки хранятся на сервере, а не на клиентском компьютере.
- Для сохранения требуется, чтобы форма была закрыта штатным способом (не через крестик браузера).
- В некоторых версиях платформы есть баги с сохранением настроек в Chrome при использовании кэша. Решение: очистите кэш браузера или добавьте в URL параметр
?clearCache.
Если проблема сохраняется, проверьте настройки сервера 1С:Предприятие (параметр save_user_settings в файле конфигурации веб-сервера).
Как отладить проблемы с пользовательскими настройками?
Алгоритм диагностики:
- Проверьте, не отключено ли сохранение настроек в свойствах формы (
СохранятьНастройки = Ложь). - Убедитесь, что у пользователя есть права на запись в хранилище настроек (роль
АдминистрированиеилиИнтерактивное удаление). - Используйте отладчик для проверки значений:
Хранилище = Новый ПользовательскиеНастройкиХранилище();Сообщить(Хранилище.Прочитать("МояНастройка"));
- Проверьте журнал регистрации на ошибки (раздел
Пользовательские настройки). - Если используете SQL-вариант, выполните запрос к таблице
_UserSettings:ВЫБРАТЬ * ИЗ _UserSettings ГДЕ Key LIKE '%МояНастройка%'