1С:Подсистема предопределенных значений
Подсистема для элегантного управления предопределенными настройками в конфигурациях 1С:Предприятие 8.3.
Оглавление
- Описание
- Возможности
- Архитектура
- Быстрый старт
- Установка
- Справочник по типам данных
- Справочник программного интерфейса
- Сценарии использования
- Best Practices
- Продвинутые техники
- Тестирование
- Лицензия
- Контакты
- Публикация
Описание
Подсистема для управления предопределенными настройками в конфигурациях 1С:Предприятие 8.3.
Версия: 1.0.0
Совместимость: 1С:Предприятие 8.3.19+
Язык: Русский
Введение
Данная подсистема создана в виде минималистичного набора объектов, предназначенная для очень простой интеграции в любые конфигурации на проектной работе.
Основной плюс это простота и наличие, помимо программного интерфейса еще и пользовательского.
Программное создание настроек реализовано для минимизации количества реструктуризаций.
- 7 типов данных: Строка, Булево, Дата, Ссылка, Массив, Ключ-Значение, Таблица значений
- Иерархическая структура: Группировка настроек через родительские элементы
- Автоматическое создание: Настройки создаются программно с уникальными идентификаторами
- Кеширование: Быстрый доступ благодаря повторно используемым значениям
- Типобезопасность: Автоматическое определение и валидация типов
- Права доступа: Система доступа через роли
Эта подсистема решает проблему хранения и управления конфигурационными настройками в 1С. Вместо создания множества констант или регистров, вы получаете единую систему для работы с настройками любого типа данных.
Простота использования - ключевая особенность подсистемы. Достаточно одного вызова:
ЗначениеНастройки = ПредопределенныеНастройки.Значение("ИмяНастройки");
Для добавления настройки можно использовать шаблон, который выводится в описании при создании нового элемента:

Возможности
Поддерживаемые типы данных
- Строка - текстовые значения
- Булево - логические флаги
- Дата - даты и время
- Ссылка - ссылки на объекты конфигурации
- Массив - массивы произвольных значений
- Ключ-Значение - соответствия (ключ: значение)
- Таблица значений - сложные структурированные данные
Иерархия настроек
Настройки могут иметь родительские элементы для создания логических групп:
Настройки интеграции
├── Токен подключения
├── URL сервиса
└── Таймаут
    ├── Таймаут подключения
    └── Таймаут чтения
Автоматическое кеширование
Подсистема использует механизм повторно используемых значений для быстрого доступа к настройкам без обращения к базе данных на каждом запросе.
Архитектура
Компоненты подсистемы
Подсистема состоит из следующих компонентов:
ПредопределенныеЗначенияПодсистема
│
├── 📁 Справочники
│   └── ПредопределенныеНастройки
│       ├── Реквизиты: ИмяНастройки, ТипЗначения, Значение, Хранилище
│       ├── Форма списка
│       └── Форма элемента
│
├── 📁 Общие модули
│   ├── ПредопределенныеНастройки (основной программный интерфейс)
│   ├── ПредопределенныеНастройкиПереопределяемый (точка расширения)
│   └── ПредопределенныеНастройкиПовтИсп (кеширование)
│
├── 📁 Перечисления
│   └── ТипыЗначенияПредопределенныхЗначений
│
├── 📁 Роли
│   ├── ЧтениеПредопределенныеЗначения
│   └── ДобавлениеИзменениеПредопределенныеЗначения
│
└── 📁 Обработки
    └── ПредопределенныеНастройкиТестирование
Структура справочника
Справочник ПредопределенныеНастройки содержит следующие реквизиты:
- ИмяНастройки (Строка, 100) - уникальное имя настройки для поиска
- ТипЗначения (Перечисление) - тип хранимого значения
- Значение (Любое) - значение настройки для простых типов
- Хранилище (ValueStorage) - для сложных типов (массив, таблица, соответствие)
- Описание (Строка, 1024) - описание назначения настройки
- ДатаСоздания (Дата) - дата создания настройки
- Наименование (стандартный) - наименование настройки
- Родитель - для создания иерархии
Архитектурные диаграммы
Схема ниже показывает взаимодействие компонентов:
graph TB
    A["Ваша конфигурация"] --> B["Программный интерфейс"]
    B --> C["Слой кеширования"]
    C --> D["Справочник"]
    D --> E["База данных"]
    
    B --> F["Точка расширения"]
    F --> D
    
    style A fill:#2c3e50,stroke:#34495e,stroke-width:2px,color:#fff
    style B fill:#3498db,stroke:#2980b9,stroke-width:2px,color:#fff
    style C fill:#1abc9c,stroke:#16a085,stroke-width:2px,color:#fff
    style D fill:#95a5a6,stroke:#7f8c8d,stroke-width:2px,color:#fff
    style E fill:#34495e,stroke:#2c3e50,stroke-width:2px,color:#fff
    style F fill:#e67e22,stroke:#d35400,stroke-width:2px,color:#fff
Поток работы с настройками:
sequenceDiagram
    participant Dev as Разработчик
    participant API as ПредопределенныеНастройки
    participant Cache as Кеш
    participant DB as База данных
    
    Dev->>API: Определение настроек
    Note right of API: Вызов ПриЗаполненииТаблицыПредопределенныхНастроек
    API->>DB: Создание настроек с UUID
    DB-->>API: Подтверждение
    
    Dev->>API: Получение значения
    API->>Cache: Поиск в кеше
    alt Найдено в кеше
        Cache-->>API: Возврат значения
    else Не найдено
        API->>DB: Запрос к базе
        DB-->>API: Значение
        API->>Cache: Сохранение в кеш
        Cache-->>API: Кешировано
    end
    API-->>Dev: Результат
Быстрый старт
Шаг 1: Определение настроек
Переопределите процедуру ПриЗаполненииТаблицыПредопределенныхНастроек в модуле ПредопределенныеНастройкиПереопределяемый:
Процедура ПриЗаполненииТаблицыПредопределенныхНастроек(ТаблицаНастроек) Экспорт
	
	// Строковая настройка
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("87548614-5423-299a-af9c-a08e5ca86056");
	НоваяНастройка.ИмяНастройки = "ВерсияПодсистемы";
	НоваяНастройка.Наименование = НСтр("ru ='Версия подсистемы'");
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Строка");
	НоваяНастройка.Описание = НСтр("ru ='Информация о версии текущей подсистемы.'");
	НоваяНастройка.Значение = "1.0.0";
	
	// Булева настройка
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("bfc480f2-023e-40d3-ab52-fecb853edf3c");
	НоваяНастройка.ИмяНастройки = "ВключеноРегистрирование";
	НоваяНастройка.Наименование = НСтр("ru ='Регистрация событий включена'");
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Булево");
	НоваяНастройка.Описание = НСтр("ru ='Разрешает регистрацию событий в системе.'");
	НоваяНастройка.Значение = Ложь;
	
	// Настройка с массивом
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("6f205348-2c73-46a8-98a6-851a40a12bbe");
	НоваяНастройка.ИмяНастройки = "РазрешенныеПользователи";
	НоваяНастройка.Наименование = НСтр("ru ='Разрешенные пользователи'");
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Массив");
	
	МассивПользователей = Новый Массив;
	МассивПользователей.Добавить("Администратор");
	МассивПользователей.Добавить("Аудит");
	
	НоваяНастройка.Значение = МассивПользователей;
	
КонецПроцедуры
Шаг 2: Инициализация
При первом запуске создайте отсутствующие настройки:
// В модуле приложения или при старте системы
ПредопределенныеНастройки.СоздатьОтсутствующиеПредопределенныеНастройки();
Шаг 3: Использование
Получение значений настроек:
// Получение строковой настройки
Версия = ПредопределенныеНастройки.Значение("ВерсияПодсистемы");
Сообщить(Версия); // "1.0.0"
// Получение булевой настройки
Если ПредопределенныеНастройки.Значение("ВключеноРегистрирование") Тогда
	ЗарегистрироватьСобытие();
КонецЕсли;
// Получение массива
РазрешенныеПользователи = ПредопределенныеНастройки.Значение("РазрешенныеПользователи");
Для Каждого Пользователь Из РазрешенныеПользователи Цикл
	Сообщить(Пользователь);
КонецЦикла;
Установка
Требования
- 1С:Предприятие 8.3.19 или выше
- EDT 2023.1+ (для разработки в EDT) или Конфигуратор
- Права администратора конфигурации
Установка через EDT
Подготовка
- Создайте резервную копию вашей конфигурации
- Убедитесь, что используете EDT версии, совместимой версии
Импорт исходников подсистемы
- Скачайте исходники подсистемы из репозитория (папку ПредопределенныеЗначенияПодсистема)
- В EDT: File → Import → General → Existing Projects into Workspace
- Выберите папку с подсистемой ПредопределенныеЗначенияПодсистема
- Выберите "Import as separate project" (не объединять сразу)
Сравнение и объединение конфигураций
- Откройте вашу основную конфигурацию в EDT
- Правой кнопкой мыши на конфигурации → Сравнить/объединить
- Выберите проект подсистемы ПредопределенныеЗначенияПодсистема
- В окне сравнения:
- Просмотрите добавляемые объекты (справочник, модули, роли)
- Проверьте конфликты (если есть объекты с такими же именами)
 
- Нажмите "Merge" для объединения
- Выберите режим объединения:
- "Copy from source" для новых объектов
- "Three-way merge" если есть конфликты
 
- Подтвердите изменения
Проверка после объединения
- Проверьте структуру подсистем
- Убедитесь, что все модули на месте
- Проверьте роли в конфигурации
Установка через Конфигуратор
Установка через сравнение/объединение конфигураций
Подготовка
- Создайте резервную копию информационной базы
- Убедитесь, что находитесь в режиме "Конфигуратор"
Сравнение и объединение конфигураций
- Скачайте файл конфигурации подсистемы (.cf) из репозитория
- В вашей рабочей ИБ (режим Конфигуратор):
- Конфигурация → Сравнить, объединить с конфигурацией из файла...
 
- Выберите файл конфигурации подсистемы (.cf)
- В окне "Сравнение, объединение конфигураций" настройте объединение
Объединение конфигураций
- В окне сравнения нажмите кнопку "Выполнить"
- Режим обновления выберите: "Обновить конфигурацию базы данных"
- При наличии конфликтов:
- Выберите "Принять из файла" для всех объектов подсистемы
 
- Подтвердите объединение
- Дождитесь завершения процесса объединения
Постановка на поддержку
ВАЖНО! При объединении, конфигурацию рекомендуется ставить на поддержку:
- Конфигурация → Поддержка → Настройка поддержки
- Проверьте, что конфигурация находится на поддержке
Обновление конфигурации БД
- Конфигурация → Обновить конфигурацию базы данных
- Просмотрите список изменений в структуре БД
- Нажмите "Выполнить" для применения изменений
- Дождитесь завершения обновления
Интеграция с БСП
Для автоматического обновления настроек при обновлении информационной базы добавьте обработчики.
Добавление в обработчики обновления БСП
В модуле ОбщийМодуль.ОбновлениеИнформационнойБазы (серверный, без контекста):
// Процедура добавления обработчиков обновления
Процедура ДобавитьОбработчикиОбновления(Обработчики) Экспорт
	
	Обработчик = Обработчики.Добавить();
	Обработчик.Версия = "1.0.0.1";
	Обработчик.Процедура = "ОбновлениеИнформационнойБазы.ОбновитьПредопределенныеНастройки";
	Обработчик.РежимВыполнения = "Отложенно";
	Обработчик.Комментарий = НСтр("ru = 'Создание отсутствующих предопределенных настроек'");
	
КонецПроцедуры
// Процедура обновления предопределенных настроек
Процедура ОбновитьПредопределенныеНастройки() Экспорт
	
	ПредопределенныеНастройки.СоздатьОтсутствующиеПредопределенныеНастройки();
	
КонецПроцедуры
Добавление в начальное заполнение
В модуле ОбщийМодуль.НачальноеЗаполнениеПереопределяемый:
// При начальном заполнении информационной базы
Процедура ПриНачальномЗаполненииЭлементов(Настройки) Экспорт
	
	Настройки.ПриДобавлении = "НачальноеЗаполнение.СоздатьПредопределенныеНастройки";
	
КонецПроцедуры
В модуле ОбщийМодуль.НачальноеЗаполнение (серверный):
Процедура СоздатьПредопределенныеНастройки() Экспорт
	
	ПредопределенныеНастройки.СоздатьОтсутствующиеПредопределенныеНастройки();
	
КонецПроцедуры
Настройка прав доступа через профили БСП
- Роль "ЧтениеПредопределенныеЗначения" должна включаться в базовые роли.
Проверка установки
Контрольный список после установки
- Подсистема "ПредопределенныеЗначения" видна в дереве конфигурации
- Справочник "ПредопределенныеНастройки" доступен
- 3 общих модуля присутствуют
- Перечисление "ТипыЗначенияПредопределенныхЗначений" содержит 8 значений
- Обработка тестирования открывается
- Роли добавлены в систему
Функциональная проверка
Выполните код в консоли запросов для проверки:
// Создание отсутствующих настроек
ПредопределенныеНастройки.СоздатьОтсутствующиеПредопределенныеНастройки();
// Проверка создания тестовой настройки
ТаблицаНастроек = ПредопределенныеНастройки.НоваяТаблицаПредопределенныхНастроек();
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор();
НоваяНастройка.ИмяНастройки = "ТестоваяНастройка";
НоваяНастройка.Наименование = НСтр("ru ='Настройка для тестирования'");
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Строка");
НоваяНастройка.Значение = "Тест";
ПредопределенныеНастройки.ОбновитьНастройкиВБазе(ТаблицаНастроек);
// Проверить получение
Сообщить(ПредопределенныеНастройки.Значение("ТестоваяНастройка")); // Должно вывести "Тест"
Справочник по типам данных
1. Строка (String)
Назначение: Текстовые значения, конфигурационные параметры
Пример создания:
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
НоваяНастройка.Наименование = НСтр("ru ='Адрес API системы'");
НоваяНастройка.ИмяНастройки = "URL_API";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Строка");
НоваяНастройка.Значение = "https://api.example.com";
Получение значения:
URLAPI = ПредопределенныеНастройки.Значение("URL_API");
// URLAPI = "https://api.example.com"
2. Булево (Boolean)
Назначение: Флаги включения/выключения функций
Пример создания:
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
НоваяНастройка.Наименование = НСтр("ru ='Отладка включена'");
НоваяНастройка.ИмяНастройки = "РазрешенаОтладка";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Булево");
НоваяНастройка.Значение = Ложь;
Получение значения:
РазрешенаОтладка = ПредопределенныеНастройки.Значение("РазрешенаОтладка");
Если РазрешенаОтладка Тогда
	// Логика отладки
КонецЕсли;
3. Дата (Date)
Назначение: Хранение дат и времени
Пример создания:
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
НоваяНастройка.Наименование = НСтр("ru ='Дата обновления'");
НоваяНастройка.ИмяНастройки = "ДатаОбновления";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Дата");
НоваяНастройка.Значение = ТекущаяДата();
Получение значения:
ДатаОбновления = ПредопределенныеНастройки.Значение("ДатаОбновления");
4. Ссылка (Reference)
Назначение: Ссылки на объекты конфигурации
Пример создания:
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
НоваяНастройка.Наименование = НСтр("ru ='Подразделение центральное'");
НоваяНастройка.ИмяНастройки = "УмолчательноеПодразделение";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Ссылка");
НоваяНастройка.Значение = Справочники.Подразделения.НайтиПоНаименованию("Главный офис");
Получение значения:
УмолчательноеПодразделение = ПредопределенныеНастройки.Значение("УмолчательноеПодразделение");
5. Массив (Array)
Назначение: Списки значений произвольного типа
Важно: Используйте Хранилище вместо Значение для массивов!
Пример создания:
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
НоваяНастройка.Наименование = НСтр("ru ='Приоритетные статусы'");
НоваяНастройка.ИмяНастройки = "ПриоритетныеСтатусы";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Массив");
МассивСтатусов = Новый Массив;
МассивСтатусов.Добавить(Перечисления.СтатусыДокументов.ВРаботе);
МассивСтатусов.Добавить(Перечисления.СтатусыДокументов.НаСогласовании);
НоваяНастройка.Значение = МассивСтатусов;
Получение значения:
ПриоритетныеСтатусы = ПредопределенныеНастройки.Значение("ПриоритетныеСтатусы");
Для Каждого Статус Из ПриоритетныеСтатусы Цикл
	Сообщить(Строка(Статус));
КонецЦикла;
6. Ключ-Значение (Key-Value / Соответствие)
Назначение: Для пары ключ-значение используется Хранилище!
Важно: Используйте Хранилище для соответствий!
Пример создания:
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
НоваяНастройка.Наименование = НСтр("ru ='Настройки интеграции'");
НоваяНастройка.ИмяНастройки = "НастройкиИнтеграции";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.КлючЗначение");
СоответствиеНастроек = Новый Соответствие;
СоответствиеНастроек.Вставить("URL", "https://api.example.com");
СоответствиеНастроек.Вставить("Token", "secret123");
СоответствиеНастроек.Вставить("Timeout", 30);
НоваяНастройка.Значение = СоответствиеНастроек;
Получение значения:
НастройкиИнтеграции = ПредопределенныеНастройки.Значение("НастройкиИнтеграции");
URLAPI = НастройкиИнтеграции.Получить("URL");
ВремяОжидания = НастройкиИнтеграции.Получить("Timeout");
7. Таблица значений
Назначение: Сложные структурированные данные
Важно: Для таблиц значений используется Хранилище!
Пример создания:
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
НоваяНастройка.Наименование = НСтр("ru ='Правила обработки'");
НоваяНастройка.ИмяНастройки = "ПравилаОбработки";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.ТаблицаЗначений");
ТаблицаПравил = Новый ТаблицаЗначений;
ТаблицаПравил.Колонки.Добавить("ТипДокумента", Новый ОписаниеТипов("Строка", , Новый КвалификаторыСтроки(100)));
ТаблицаПравил.Колонки.Добавить("АвтоматическиПровести", Новый ОписаниеТипов("Булево"));
ТаблицаПравил.Колонки.Добавить("ТребуетсяСогласование", Новый ОписаниеТипов("Булево"));
СтрокаПравила = ТаблицаПравил.Добавить();
СтрокаПравила.ТипДокумента = "ЗаказКлиента";
СтрокаПравила.АвтоматическиПровести = Ложь;
СтрокаПравила.ТребуетсяСогласование = Истина;
НоваяНастройка.Значение = ТаблицаПравил;
Получение значения:
ПравилаОбработки = ПредопределенныеНастройки.Значение("ПравилаОбработки");
Для Каждого Правило Из ПравилаОбработки Цикл
	Если Правило.ТребуетсяСогласование Тогда
		ОтправитьНаСогласование(Правило.ТипДокумента);
	КонецЕсли;
КонецЦикла;
8. Группа настроек (Каталог)
Назначение: Организация иерархии настроек
Пример создания группы:
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
НоваяНастройка.Наименование = НСтр("ru ='Настройки интеграции'");
НоваяНастройка.ИмяНастройки = "НастройкиИнтеграции";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.КаталогПредопределенныхНастроек");
// Группы не имеют значения
Настройки внутри группы:
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.ИмяНастройкиРодителя = "НастройкиИнтеграции"; // Указание родителя
НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
НоваяНастройка.Наименование = НСтр("ru ='Адрес API system'");
НоваяНастройка.ИмяНастройки = "URL_API";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Строка");
НоваяНастройка.Значение = "https://api.example.com";
Справочник программного интерфейса
Модуль ПредопределенныеНастройки
Основной модуль для работы с настройками.
Функция Значение(ИмяНастройки, ВызыватьИсключение = Ложь)
Возвращает значение предопределенной настройки по ее имени.
Параметры:
- ИмяНастройки(Строка) - имя настройки
- ВызыватьИсключение(Булево) - вызывать ли исключение, если настройка не найдена
Возвращаемое значение:
- Произвольный- значение настройки
Примеры:
// Без исключения (вернет пустую ссылку, если не найдено)
URL = ПредопределенныеНастройки.Значение("URL_API");
// С исключением
Попытка
	Token = ПредопределенныеНастройки.Значение("API_Token", Истина);
Исключение
	Сообщить("Токен API не настроен!");
КонецПопытки;
Функция НастройкаПоИмени(ИмяНастройки)
Возвращает ссылку на предопределенную настройку по имени.
Параметры:
- ИмяНастройки(Строка) - имя настройки
Возвращаемое значение:
- СправочникСсылка.ПредопределенныеНастройки- ссылка на настройку
Пример:
Настройка = ПредопределенныеНастройки.НастройкаПоИмени("URL_API");
Если Не ЗначениеЗаполнено(Настройка) Тогда
	СоздатьНастройку();
КонецЕсли;
Функция НоваяТаблицаПредопределенныхНастроек()
Возвращает новую таблицу значений с колонками для описания настроек.
Возвращаемое значение:
- ТаблицаЗначений- таблица с колонками:- ИмяНастройкиРодителя
- Идентификатор
- ИмяНастройки
- Хранилище
- Наименование
- Описание
- ТипЗначения
- Значение
- Удалена
 
Пример:
ТаблицаНастроек = ПредопределенныеНастройки.НоваяТаблицаПредопределенныхНастроек();
НоваяНастройка = ТаблицаНастроек.Добавить();
// Заполнение настройки...
Процедура СоздатьОтсутствующиеПредопределенныеНастройки(ТаблицаОписанияПредопределенныхНастроек = Неопределено)
Создает отсутствующие предопределенные настройки в базе данных.
Параметры:
- ТаблицаОписанияПредопределенныхНастроек- таблица описаний настроек (опционально)
Пример:
// При первом запуске
ПредопределенныеНастройки.СоздатьОтсутствующиеПредопределенныеНастройки();
Процедура ОбновитьНастройкиВБазе(ТаблицаНастроекВБазе)
Обновляет настройки в базе данных согласно переданной таблице.
Параметры:
- ТаблицаНастроекВБазе- таблица с данными для обновления
Пример:
ТаблицаНастроек = ПредопределенныеНастройки.НоваяТаблицаПредопределенныхНастроек();
// Заполнение таблицы...
ПредопределенныеНастройки.ОбновитьНастройкиВБазе(ТаблицаНастроек);
Процедура ИнициализироватьТаблицуПредопределенныхНастроек(ТаблицаОписанияПредопределенныхНастроек)
Инициализирует таблицу предопределенных настроек.
Параметры:
- ТаблицаОписанияПредопределенныхНастроек- таблица для заполнения
Пример:
ТаблицаНастроек = ПредопределенныеНастройки.НоваяТаблицаПредопределенныхНастроек();
ПредопределенныеНастройки.ИнициализироватьТаблицуПредопределенныхНастроек(ТаблицаНастроек);
Модуль ПредопределенныеНастройкиПереопределяемый
Модуль для определения настроек вашей конфигурации.
Процедура ПриЗаполненииТаблицыПредопределенныхНастроек(ТаблицаНастроек)
Процедура для определения пользовательских настроек.
Параметры:
- ТаблицаНастроек- таблица для добавления описаний настроек
Пример:
Процедура ПриЗаполненииТаблицыПредопределенныхНастроек(ТаблицаНастроек) Экспорт
	
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("87548614-5423-299a-af9c-a08e5ca86056");
	НоваяНастройка.Наименование = НСтр("ru ='Моя настройка'");
	НоваяНастройка.ИмяНастройки = "МояНастройка";
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Строка");
	НоваяНастройка.Значение = "Значение";
	
КонецПроцедуры
Сценарии использования
Сценарий 1: Хранение настроек интеграции
Задача: Хранение параметров подключения к внешним сервисам
// Определение настроек
Процедура ПриЗаполненииТаблицыПредопределенныхНастроек(ТаблицаНастроек) Экспорт
	
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("a1b2c3d4-e5f6-...");
	НоваяНастройка.ИмяНастройки = "API_URL";
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Строка");
	НоваяНастройка.Значение = "https://api.service.com";
	
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("b2c3d4e5-f6g7-...");
	НоваяНастройка.ИмяНастройки = "API_Timeout";
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Число");
	НоваяНастройка.Значение = 30;
	
КонецПроцедуры
// Использование
Процедура ВыполнитьЗапросКAPI()
	
	URLAPI = ПредопределенныеНастройки.Значение("API_URL");
	TimeoutAPI = ПредопределенныеНастройки.Значение("API_Timeout");
	
	HTTPСоединение = Новый HTTPСоединение(URLAPI, , , , TimeoutAPI);
	// Выполнение запроса...
	
КонецПроцедуры
Сценарий 2: Конфигурационные справочники выбора
Задача: Хранение списка разрешенных типов документов для выбора
// Определение настроек
Процедура ПриЗаполненииТаблицыПредопределенныхНастроек(ТаблицаНастроек) Экспорт
	
	ТаблицаЗначений = Новый ТаблицаЗначений;
	ТаблицаЗначений.Колонки.Добавить("ТипДокумента");
	ТаблицаЗначений.Колонки.Добавить("Наименование");
	
	Строка = ТаблицаЗначений.Добавить();
	Строка.ТипДокумента = "ЗаказКлиента";
	Строка.Наименование = "Заказ клиента";
	
	Строка = ТаблицаЗначений.Добавить();
	Строка.ТипДокумента = "СчетНаОплату";
	Строка.Наименование = "Счет на оплату";
	
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
	НоваяНастройка.ИмяНастройки = "РазрешенныеДокументы";
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.ТаблицаЗначений");
	НоваяНастройка.Значение = ТаблицаЗначений;
	
КонецПроцедуры
// Использование
Функция ПроверитьРазрешенныйДокумент(ТипДокумента)
	
	РазрешенныеДокументы = ПредопределенныеНастройки.Значение("РазрешенныеДокументы");
	
	Для Каждого Строка Из РазрешенныеДокументы Цикл
		Если Строка.ТипДокумента = ТипДокумента Тогда
			Возврат Истина;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Ложь;
	
КонецФункции
</details>
<details>
<summary><strong>Сценарий 3: Настройки ролей и разрешений</strong></summary>
**Задача:** Хранение прав доступа для различных ролей
```bsl
// Определение настроек
Процедура ПриЗаполненииТаблицыПредопределенныхНастроек(ТаблицаНастроек) Экспорт
	
	СоответствиеПрав = Новый Соответствие;
	СоответствиеПрав.Вставить("Администратор", Новый Массив); // Все права
	СоответствиеПрав.Вставить("Пользователь", Массив(["Чтение", "Создание"]));
	СоответствиеПрав.Вставить("Гость", Массив(["Чтение"]));
	
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
	НоваяНастройка.Наименование = НСтр("ru ='Права доступа'");
	НоваяНастройка.ИмяНастройки = "ПраваДоступа";
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.КлючЗначение");
	НоваяНастройка.Хранилище = СоответствиеПрав;
	
КонецПроцедуры
// Использование
Функция ПроверитьПраво(Роль, Право)
	
	ПраваДоступа = ПредопределенныеНастройки.Значение("ПраваДоступа");
	ПраваРоли = ПраваДоступа.Получить(Роль);
	
	Если ПраваРоли <> Неопределено Тогда
		Возврат ПраваРоли.Найти(Право) <> Неопределено;
	КонецЕсли;
	
	Возврат Ложь;
	
КонецФункции
</details>
<details>
<summary><strong>Сценарий 4: Настройки печатных форм</strong></summary>
**Задача:** Хранение параметров печатных форм (отступы, размеры, шрифты)
```bsl
// Определение настроек
Процедура ПриЗаполненииТаблицыПредопределенныхНастроек(ТаблицаНастроек) Экспорт
	
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
	НоваяНастройка.Наименование = НСтр("ru ='Отступ слева'");
	НоваяНастройка.ИмяНастройки = "ОтступЛево";
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Число");
	НоваяНастройка.Значение = 20; // мм
	
	НоваяНастройка = ТаблицаНастроек.Добавить();
	НоваяНастройка.Идентификатор = Новый УникальныйИдентификатор("...");
	НоваяНастройка.Наименование = НСтр("ru ='Размер шрифта печатной формы'");
	НоваяНастройка.ИмяНастройки = "РазмерШрифта";
	НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Число");
	НоваяНастройка.Значение = 10;
	
КонецПроцедуры
// Использование
Процедура СформироватьПечатнуюФорму()
	
	ОтступЛевый = ПредопределенныеНастройки.Значение("ОтступЛево");
	РазмерШрифта = ПредопределенныеНастройки.Значение("РазмерШрифта");
	
	// Применение настроек к форме...
	
КонецПроцедуры
</details>
## Best Practices
<details>
<summary><strong>Именование настроек</strong></summary>
- ✅ Используйте понятные имена: `API_URL`, `ВключенаОтладка`, `МаксимальноеКоличествоПопыток`
- ❌ Избегайте: `setting1`, `Настройка123`, `param`
```bsl
// ✅ Хорошо
НоваяНастройка.ИмяНастройки = "EmailАдминистратора";
НоваяНастройка.ИмяНастройки = "ВключеноПротоколирование";
// ❌ Плохо
НоваяНастройка.ИмяНастройки = "Настройка1";
НоваяНастройка.ИмяНастройки = "param";
Структурирование через группы
Используйте родительские элементы для логической группировки:
// Создание группы
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.ИмяНастройки = "НастройкиИнтеграции";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.КаталогПредопределенныхНастроек");
// Элементы группы
НоваяНастройка = ТаблицаНастроек.Добавить();
НоваяНастройка.ИмяНастройкиРодителя = "НастройкиИнтеграции";
НоваяНастройка.Наименование = НСтр("ru ='Адрес сайта'");
НоваяНастройка.ИмяНастройки = "URL_API";
НоваяНастройка.ТипЗначения = ПредопределенноеЗначение("Перечисление.ТипыЗначенияПредопределенныхЗначений.Строка");
НоваяНастройка.Значение = "https://api.example.com";
</details>
## Продвинутые техники
<details>
<summary><strong>Обновление настроек при изменении конфигурации</strong></summary>
При обновлении конфигурации настройки могут требовать миграции:
```bsl
Процедура ОбновитьНастройкиПослеОбновленияКонфигурации()
	
	ТаблицаНастроек = ПредопределенныеНастройки.НоваяТаблицаПредопределенныхНастроек();
	
	// Изменение существующей настройки
	СуществующаяНастройка = ТаблицаНастроек.Добавить();
	СуществующаяНастройка.ИмяНастройки = "СтароеИмя";
	СуществующаяНастройка.НовоеЗначение = "Новое значение";
	
	// Удаление устаревших настроек
	УстаревшаяНастройка = ТаблицаНастроек.Добавить();
	УстаревшаяНастройка.ИмяНастройки = "УстаревшаяНастройка";
	УстаревшаяНастройка.Удалена = Истина;
	
	ПредопределенныеНастройки.ОбновитьНастройкиВБазе(ТаблицаНастроек);
	
КонецПроцедуры
Тестирование
Запуск тестов
Подсистема включает обработку ПредопределенныеНастройкиТестирование для проверки работоспособности.
- Откройте обработку в запущенном приложении
- Нажмите "Создать тестовые настройки"
- Проверьте, что все настройки созданы (должен появиться зеленый индикатор)
- Нажмите "Установить тестовые значения"
- Проверьте корректность значений
- Нажмите "Удалить тестовые настройки"
- Убедитесь, что настройки удалены
Лицензия
MIT License - Copyright (c) 2025 Fedor Timokhov
Контакты
Автор: Fedor Timokhov
