v3.0.0.1: Универсальное хранение настроек - первая сборка расширения

- Регистр ПС_Настройки с составным типом (10 корневых узлов ссылочных типов)
- ПВХ ПС_ВидыНастроек
- 3 роли: Чтение, Просмотр, Полный доступ
- Модуль ПС_РаботаСНастройками
- 3 формы
- Совместимость: Version8_3_27
- Логотип: LogoPS.png
- Автор: 1С:Франчайзи ООО Профи-Софт (42575-13)
- Соавтор: AI-ассистент MiMoCode
This commit is contained in:
Профи-Софт
2026-07-16 05:51:01 +00:00
commit 3dc3db2058
24 changed files with 2035 additions and 0 deletions
@@ -0,0 +1,314 @@
# План выноса контекста «Настройки» в отдельное расширение
**Дата:** 15 июля 2026 г.
**Версия документа:** 2.0
**Конфигурация:** БухгалтерияПредприятияКОРП 3.0.199.13
**Целевая совместимость:** Version8_5_1
**Фокус:** контекст «Настройки» (ПС_Настройки + ПС_ВидыНастроек)
---
## 1. Резюме
Доработанная конфигурация БП КОРП содержит систему «ПС_Настройки» — механизм хранения пользовательских настроек через регистр сведений `ПС_Настройки` и план видов характеристик `ПС_ВидыНастроек`.
**Цель пилотной задачи:** вынести контекст «Настройки» в отдельное расширение (CFE), решить проблему типа `AnyIBRef` в ресурсе `ЗначениеНастройки` заменой на составной тип с корневыми узлами ссылочных типов дерева метаданных.
---
## 2. Инвентаризация кастомных объектов
### 2.1. Полный перечень объектов метаданных с префиксом ПС_
| Тип объекта | Количество | Объекты |
|---|---|---|
| **Регистры сведений** | 1 | ПС_Настройки |
| **Планы видов характеристик** | 1 | ПС_ВидыНастроек |
| **Справочники** | 19 | ПС_ВидыИзмененияПланируемыхДействий, ПС_ВидыКартриджей, ПС_ВидыОбъектовQRКодирования, ПС_ВидыОтменыПланируемыхДействий, ПС_ВидыПланирумыхДействий, ПС_ВидыРабот, ПС_ВидыРасходныхМатериаловДляВидовРабот, ПС_ВидыТехники, ПС_ВидыТехническихЗаданий, ПС_Картриджи, ПС_МоделиКартриджей, ПС_МоделиТехники, ПС_ПланируемыеДействия, ПС_РасходныеМатериалы, ПС_РолиПользователей, ПС_Техника, ПС_ТехническиеЗадания, ПС_ФирмыПроизводителиТехники, ТарифныеПланы* |
| **Документы** | 22 | ПС_ВозвратКартриджей, ПС_ВходящийДокумент, ПС_ГрупповоеЗакрытиеМесяца, ПС_ДоговорОбслуживания, ПС_ЗагрузкаДанныхИз1СКоннект, ПС_ЗакрытиеМесяцаОбслуживанияПоКонтрагенту, ПС_ЗакрытиеМесяцаОбслуживанияПоСотруднику, ПС_ИзменениеПланируемыхДействий, ПС_ИнвентаризацияРасходныхМатериалов, ПС_ИсходящийДокумент, ПС_НарядНаЗаправкуКартриджа, ПС_НарядНаОбслуживаниеЗаказчика, ПС_НарядНаРаботыПоТехнике, ПС_НачальнаяЗадолженностьКонтрагентовПоОбслуживанию, ПС_ОтменаПланируемыхДействий, ПС_ОтчетОбУдаленнойРаботеСЗаказчиком, ПС_ПоступлениеКартриджей, ПС_ПрекращениеДействияДоговораОбслуживания, ПС_ПриказНаУтверждениеСтавокСотрудникам, ПС_ПриказНаУтверждениеТарифногоПлана, ПС_ПриказОНазначенииОтветственных, ПС_РегистрацияПланируемыхДействий |
| **Общие модули** | 11 | ПС_РаботаСQRКодами, ПС_РаботаСДаннымиНарядовКлиент, ПС_РаботаСДаннымиНарядовСервер, ПС_РаботаСНастройками, ПС_РаботаСРолямиПользователей, ПС_РаботаСоСканеромШККлиент, ПС_РаботаСоСканеромШКСервер, ПС_РегламентПоДокументам, ПС_РегламентПоДокументамКлиент, ПС_ЦенообразованиеКлиент, ПС_ЦенообразованиеСервер |
| **Общие формы** | 5 | ПС_Планировщик, ПС_СозданиеНовогоФизическогоЛица, ПС_ФормаВыбораДляПриказаНаУстановкуЦенРаботПоКартриджу, ПС_ФормаНачисленийИОплатПоДоговору, ПС_ФормаОплатПоСчету |
| **Обработки** | 2 | ПС_ГрупповоеПланированиеДействий, ПС_НаполнениеСведенийОбОбъектахQRКодирования |
| **Итого объектов** | **61** | |
*ТарифныеПланы — справочник без префикса ПС_, но относится к бизнес-домену «Обслуживание».
### 2.2. Модифицированные типовые объекты (ссылки на ПС_ из типового кода)
| Тип объекта | Объекты с изменениями | Суть изменений |
|---|---|---|
| **Общие модули** | ЗаполнениеБухгалтерскойОтчетностиИтоги, ЗаполнениеБухгалтерскойОтчетностиПереопределяемый, УчетРасходовУменьшающихОтдельныеНалоги, УчетУСН, УчетСтраховыхВзносов, МобильнаяБухгалтерия, УчетДоходовИРасходовПредпринимателя, РасчетыСБюджетом, ПлатежиВБюджетКлиентСерверПереопределяемый, УчетСтраховыхВзносовИП | Добавлены вызовы ПС_-модулей или обращения к ПС_-объектам |
| **Общие формы** | ВыборФайловСведенийФизическихЛиц, ЗагрузкаФайловОтчета | Модуль формы содержит обращения к ПС_-объектам |
| **Справочники** | КонтрагентыПрисоединенныеФайлы | Добавлен в доработанной конфигурации (не ПС_-префикс) |
---
## 3. Архитектурный анализ (DDD)
### 3.1. Выделение bounded context
Система «ПС_Настройки» — это **service-domain** (домен обслуживания техники и картриджей), изолированный от типовой бухгалтерской логики. Ядро домена:
- **Контекст «Настройки»:** ПС_Настройки (регистр) + ПС_ВидыНастроек (ПВХ) — универсальное хранилище пар ключ-значение
- **Контекст «Обслуживание»:** ДоговорыОбслуживания, Наряды, Техника, Картриджи, РасходныеМатериалы
- **Контекст «Планирование»:** ПланируемыеДействия, ТехническиеЗадания
- **Контекст «Ценообразование»:** ТарифныеПланы, Ставки, Приказы
### 3.2. Модель ролей доступа к настройкам
**Текущее состояние:** одна роль `ПС_ЧтениеНастроек` — программный Read+View на все объекты настроек.
**Целевое состояние:** три роли в расширении:
| Роль | Назначение | Права на `ПС_Настройки` | Права на `ПС_ВидыНастроек` | Пример использования |
|------|-----------|------------------------|---------------------------|---------------------|
| `ПС_ЧтениеНастроек` | Программные вызовы (модули, обработки) | `Read` (без View) | `Read` (без View) | Модуль `ПС_РаботаСНастройками` читает значение настройки |
| `ПС_ПросмотрНастроек` | Интерактивный просмотр (список, форма) | `Read` + `View` | `Read` + `View` | Пользователь открывает форму списка настроек |
| `ПС_ПолныйДоступКНастройкам` | Полный доступ (создание, изменение, удаление) | `Read` + `View` + `Insert` + `Update` + `Delete` | `Read` + `View` + `Insert` + `Update` + `Delete` | Администратор управляет настройками через форму |
**Иерархия:** `ПС_ПолныйДоступКНастройкам` ⊃ `ПС_ПросмотрНастроек` ⊃ `ПС_ЧтениеНастроек`
**Реализация:**
- В XML расширения создаются три объекта `<Role>` с уникальными UUID
- Каждая роль содержит `<Rights>` для `InformationRegister.ПС_Настройки` и `ChartOfCharacteristicTypes.ПС_ВидыНастроек`
- Дополнительно каждая роль наследует базовые права конфигурации (ThinClient, WebClient, DataAdministration и т.д.)
### 3.3. Зависимости от типовой конфигурации
ПС_-объекты ссылаются на типовые объекты:
- `CatalogRef.Контрагенты`, `CatalogRef.ДоговорыКонтрагентов`
- `CatalogRef.Сотрудники`, `CatalogRef.ФизическиеЛица`
- `CatalogRef.Организации`, `CatalogRef.Пользователи`
- `CatalogRef.Номенклатура`, `CatalogRef.Склады`
- `CatalogRef.СтатьиЗатрат`, `CatalogRef.НоменклатурныеГруппы`
Эти ссылки **допустимы** в расширениях через заимствование (borrow).
### 3.3. Типы данных в ресурсе ПС_Настройки.ЗначениеНастройки
**Текущий состав типа ресурса:**
- `xs:boolean`
- `xs:string` (длина 250, переменная)
- `xs:dateTime`
- `xs:decimal` (10 знаков, 0 десятичных)
- `cfg:AnyIBRef` ← **проблемный для расширений**
**Решение:** заменить `cfg:AnyIBRef` на составной тип, содержащий все корневые узлы ссылочных типов дерева метаданных 1С:
```xml
<!-- Простые типы (оставляем как есть) -->
<v8:Type>xs:boolean</v8:Type>
<v8:Type>xs:string</v8:Type>
<v8:Type>xs:dateTime</v8:Type>
<v8:Type>xs:decimal</v8:Type>
<!-- Ссылочные типы — корневые узлы (вместо AnyIBRef) -->
<v8:Type>cfg:CatalogRef.Ссылка</v8:Type>
<v8:Type>cfg:DocumentRef.Ссылка</v8:Type>
<v8:Type>cfg:ChartOfCharacteristicTypesRef.Ссылка</v8:Type>
<v8:Type>cfg:ChartOfAccountsRef.Ссылка</v8:Type>
<v8:Type>cfg:ChartOfCalculationTypesRef.Ссылка</v8:Type>
<v8:Type>cfg:EnumRef.Ссылка</v8:Type>
<v8:Type>cfg:ExchangePlanRef.Ссылка</v8:Type>
<v8:Type>cfg:BusinessProcessRef.Ссылка</v8:Type>
<v8:Type>cfg:TaskRef.Ссылка</v8:Type>
```
> **Примечание:** Точный список корневых узлов определяется платформой. В XML-выгрузке они представляются как `СправочникСсылка`, `ДокументСсылка` и т.д. Конкретные имена могут отличаться в зависимости от версии платформы и формата выгрузки.
---
## 4. План реализации (контекст «Настройки»)
### Фаза 1: Подготовка и анализ (1-2 дня)
| # | Задача | Результат |
|---|--------|-----------|
| 1.1 | Определить список корневых узлов ссылочных типов в XML-выгрузке (СправочникСсылка, ДокументСсылка и т.д.) | Список типов для составного типа |
| 1.2 | Согласовать формулу расчёта `ЗначениеНастройки` в расширении (составной тип vs маппинг) | Решение по архитектуре типа |
| 1.3 | Проверить, что `ПС_ВидыНастроек` не содержит ссылок на `ПС_Настройки` (односторонняя зависимость) | Подтверждение изоляции |
### Фаза 2: Создание расширения (1-2 дня)
| # | Задача | Результат |
|---|--------|-----------|
| 2.1 | Создать пустое расширение через `ibcmd` | CFE骨架 |
| 2.2 | Завести `ПС_ВидыНастроек` (ПВХ) в расширение с заимствованием типовых справочников из `Type` | ПВХ в расширении |
| 2.3 | Завести `ПС_Настройки` (регистр сведений) в расширение | Регистр в расширении |
| 2.4 | **Заменить тип ресурса `ЗначениеНастройки`:** убрать `cfg:AnyIBRef`, добавить составной тип с корневыми узлами ссылочных типов | Обновлённый XML ресурса |
| 2.5 | Создать роль `ПС_ЧтениеНастроек` (Read на ПС_Настройки + ПС_ВидыНастроек) | Роль для программных вызовов |
| 2.6 | Создать роль `ПС_ПросмотрНастроек` (Read+View на ПС_Настройки + ПС_ВидыНастроек) | Роль для интерактивного просмотра |
| 2.7 | Создать роль `ПС_ПолныйДоступКНастройкам` (Read+View+Insert+Update+Delete) | Роль для администратора |
| 2.8 | Перенести общий модуль `ПС_РаботаСНастройками` | Модуль в расширении |
| 2.9 | Перенести форму `ФормаСписка` ПС_Настройки | Форма в расширении |
| 2.10 | Перенести формы `ФормаРедактированияНастроек` и `ФормаСписка` ПС_ВидыНастроек | Формы в расширении |
### Фаза 3: Сборка и первичное тестирование (1 день)
| # | Задача | Результат |
|---|--------|-----------|
| 3.1 | Собрать .cfe через `ibcmd` | Файл расширения |
| 3.2 | Загрузить расширение в тестовую ИБ (поверх основной конфигурации, ДО удаления старых объектов) | Расширение загружено |
| 3.3 | Проверить: сохранение настройки с простым типом (boolean, string, decimal, dateTime) | Простые типы работают |
| 3.4 | Проверить: сохранение настройки со ссылочным типом (CatalogRef, DocumentRef и др.) | Ссылочные типы работают |
### Фаза 4: Миграция данных и удаление инфраструктуры из основной конфигурации (1-2 дня)
> **Порядок критичен:** сначала подключаем расширение к базе с данными, убеждаемся что оно работает, затем чистим основную конфигурацию.
| # | Задача | Результат |
|---|--------|-----------|
| 4.1 | **Создать резервную копию ИБ** (выгрузка .dt или файловой копии) | Бэкап перед миграцией |
| 4.2 | **Подключить расширение** к рабочей ИБ (не к тестовой!) | Расширение активно в рабочей базе |
| 4.3 | **Проверить чтение данных:** убедиться, что расширение корректно читает данные из регистра `ПС_Настройки`, который пока ещё находится в основной конфигурации | Чтение работает |
| 4.4 | **Экспорт данных настроек** — выгрузить все записи регистра `ПС_Настройки` и предопределённые элементы `ПС_ВидыНастроек` во временное хранилище (XML/JSON/temp-таблица) | Бэкап данных настроек |
| 4.5 | **Удалить инфраструктуру настроек из основной конфигурации** (пошагово): | |
| 4.5.1 | Удалить регистр сведений `ПС_Настройки` из основной CF | Регистр удалён |
| 4.5.2 | Удалить план видов характеристик `ПС_ВидыНастроек` из основной CF | ПВХ удалён |
| 4.5.3 | Удалить роль `ПС_ЧтениеНастроек` из основной CF | Роль удалена |
| 4.5.4 | Удалить общий модуль `ПС_РаботаСНастройками` из основной CF | Модуль удалён |
| 4.5.5 | Удалить формы `ФормаСписка` (ПС_Настройки) и `ФормаРедактированияНастроек`, `ФормаСписка` (ПС_ВидыНастроек) из основной CF | Формы удалены |
| 4.5.6 | Проверить, что нет ссылок на удалённые объекты из других ПС_-объектов (если остаются в CF) | Нет сломанных ссылок |
| 4.6 | **Перезаписать данные в новый регистр** (теперь уже из расширения) — импортировать данные, сохранённые на шаге 4.4 | Данные мигрированы |
| 4.7 | **Проверить целостность данных:** убедиться, что все настройки доступны через расширение | Данные на месте |
| 4.8 | **Проверить чтение/запись** настроек через расширение (не через основную CF) | Расширение работает автономно |
### Фаза 5: Финальное тестирование (0.5 дня)
| # | Задача | Результат |
|---|--------|-----------|
| 5.1 | Проверить: основная конфигурация без расширения работает штатно (нет ссылок на удалённые объекты) | Типовая не сломана |
| 5.2 | Проверить: расширение загружается на чистую тестовую ИБ (без предварительных данных) | Чистая установка работает |
| 5.3 | Проверить: миграция данных на чистой ИБ (шаг 4.6 на другой базе) | Процедура миграции воспроизводима |
### Фаза 6: Документирование (0.5 дня)
| # | Задача | Результат |
|---|--------|-----------|
| 6.1 | Описать структуру расширения и состав типа `ЗначениеНастройки` | README.md расширения |
| 6.2 | Описать процедуру миграции данных (шаги 4.1–4.8) | Руководство по миграции |
| 6.3 | Зафиксировать версии: конфигурация 3.0.199.13, расширение v1.0 | Метаданные |
---
## 5. Оценка трудозатрат
| Фаза | Дни | Примечание |
|------|-----|------------|
| Фаза 1: Подготовка | 1-2 | Определение типа + анализ зависимостей |
| Фаза 2: Расширение | 1-2 | 3 объекта + модуль + формы |
| Фаза 3: Сборка + первичное тестирование | 1 | Проверка на ИБ без удаления |
| Фаза 4: Миграция данных + удаление из CF | 1-2 | Критичная — порядок шагов |
| Фаза 5: Финальное тестирование | 0.5 | Чистая установка + миграция |
| Фаза 6: Документация | 0.5 | README + руководство по миграции |
| **Итого** | **4-7** | |
---
## 6. Риски и митигация
| Риск | Вероятность | Влияние | Меры |
|------|-------------|---------|------|
| Составной тип `ЗначениеНастройки` не покрывает все нужные ссылочные типы | Средняя | Среднее | Аудит всех обращений к ресурсу из ПС_-модулей |
| Потеря данных настроек при миграции | Низкая | Высокое | Бэкап (шаг 4.1) + верификация после импорта (шаг 4.7) |
| Сломанные ссылки после удаления объектов из CF | Средняя | Среднее | Проверка ссылок перед удалением (шаг 4.5.5), пошаговое удаление |
| Расширение не видит данные, записанные через основную CF | Средняя | Среднее | Порядок: сначала подключение расширения → проверка чтения → удаление из CF |
| Невоспроизводимость процедуры миграции | Низкая | Среднее | Документирование (шаг 6.2) + тест на чистой ИБ (шаг 5.3) |
---
## 7. Детали замены типа ресурса
### 7.1. Текущее состояние (XML-выгрузка)
```xml
<!-- InformationRegisters/ПС_Настройки.xml → Resource.ЗначениеНастройки -->
<Type>
<v8:Type>xs:boolean</v8:Type>
<v8:Type>xs:string</v8:Type>
<v8:Type>xs:dateTime</v8:Type>
<v8:Type>xs:decimal</v8:Type>
<v8:TypeSet>cfg:AnyIBRef</v8:TypeSet> <!-- ← проблемный -->
...
</Type>
```
### 7.2. Целевое состояние (расширение)
Заменяем `cfg:AnyIBRef` на перечисление корневых узлов ссылочных типов дерева метаданных:
```xml
<Type>
<!-- Простые типы (без изменений) -->
<v8:Type>xs:boolean</v8:Type>
<v8:Type>xs:string</v8:Type>
<v8:Type>xs:dateTime</v8:Type>
<v8:Type>xs:decimal</v8:Type>
<!-- Ссылочные типы — корневые узлы (вместо AnyIBRef) -->
<v8:Type>cfg:CatalogRef.Ссылка</v8:Type> <!-- СправочникСсылка -->
<v8:Type>cfg:DocumentRef.Ссылка</v8:Type> <!-- ДокументСсылка -->
<v8:Type>cfg:ChartOfCharacteristicTypesRef.Ссылка</v8:Type> <!-- ПланВидовХарактеристикСсылка -->
<v8:Type>cfg:ChartOfAccountsRef.Ссылка</v8:Type> <!-- ПланСчетовСсылка -->
<v8:Type>cfg:ChartOfCalculationTypesRef.Ссылка</v8:Type> <!-- ПланВидовРасчетаСсылка -->
<v8:Type>cfg:EnumRef.Ссылка</v8:Type> <!-- ПеречислениеСсылка -->
<v8:Type>cfg:ExchangePlanRef.Ссылка</v8:Type> <!-- ПланОбменаСсылка -->
<v8:Type>cfg:BusinessProcessRef.Ссылка</v8:Type> <!-- БизнесПроцессСсылка -->
<v8:Type>cfg:TaskRef.Ссылка</v8:Type> <!-- ЗадачаСсылка -->
<v8:Type>cfg:AccumulationRegisterRecordKey.Ссылка</v8:Type> <!-- (опционально) -->
<v8:Type>cfg:InformationRegisterRecordKey.Ссылка</v8:Type> <!-- (опционально) -->
...
</Type>
```
### 7.3. Маппинг корневых узлов
| Корневой узел дерева метаданных | XML-тип в расширении | Пример использования |
|---|---|---|
| СправочникСсылка | `CatalogRef.Ссылка` | Ссылки на Контрагентов, Договоры, Сотрудников |
| ДокументСсылка | `DocumentRef.Ссылка` | Ссылки на документы учёта |
| ПланВидовХарактеристикСсылка | `ChartOfCharacteristicTypesRef.Ссылка` | Ссылки на ПВХ (в т.ч. ПС_ВидыНастроек) |
| ПланСчетовСсылка | `ChartOfAccountsRef.Ссылка` | Ссылки на план счетов |
| ПланВидовРасчетаСсылка | `ChartOfCalculationTypesRef.Ссылка` | Ссылки на планы видов расчёта |
| ПеречислениеСсылка | `EnumRef.Ссылка` | Ссылки на перечисления |
| ПланОбменаСсылка | `ExchangePlanRef.Ссылка` | Ссылки на планы обмена |
| БизнесПроцессСсылка | `BusinessProcessRef.Ссылка` | Ссылки на бизнес-процессы |
| ЗадачаСсылка | `TaskRef.Ссылка` | Ссылки на задачи |
---
## 8. Чек-лист готовности
### Расширение
- [ ] Определён полный список корневых узлов ссылочных типов для составного типа
- [ ] Тип `AnyIBRef` заменён на составной тип в `ПС_Настройки.ЗначениеНастройки`
- [ ] Создана роль `ПС_ЧтениеНастроек` (Read на регистр + ПВХ)
- [ ] Создана роль `ПС_ПросмотрНастроек` (Read+View на регистр + ПВХ)
- [ ] Создана роль `ПС_ПолныйДоступКНастройкам` (полные права)
- [ ] Расширение содержит: ПС_ВидыНастроек (ПВХ) + ПС_Настройки (регистр) + 3 роли + ПС_РаботаСНастройками (модуль) + 3 формы
- [ ] Расширение собирается в .cfe без ошибок
- [ ] Расширение загружается на тестовую ИБ
- [ ] Сохранение/чтение настроек работает для простых типов
- [ ] Сохранение/чтение настроек работает для ссылочных типов
- [ ] Роли корректно ограничивают доступ (тест через разные профили)
### Миграция данных
- [ ] Бэкап ИБ создан перед миграцией
- [ ] Расширение подключено к рабочей ИБ (поверх основной CF)
- [ ] Расширение корректно читает данные из старого регистра (в основной CF)
- [ ] Экспорт данных настроек выполнен (XML/JSON)
- [ ] Инфраструктура настроек удалена из основной CF (ПС_Настройки, ПС_ВидыНастроек, ПС_РаботаСНастройками, 3 формы)
- [ ] Данные импортированы в регистр расширения
- [ ] Целостность данных проверена (все настройки на месте)
- [ ] Чтение/запись через расширение работает автономно
### Валидация
- [ ] Основная CF без расширения работает штатно
- [ ] Расширение загружается на чистую ИБ (чистая установка)
- [ ] Процедура миграции воспроизводима на другой ИБ
---
*Документ подготовлен на основе анализа XML-выгрузок конфигураций:*
- *Доработанная: /netfolder-43/БП_КОРП-ПС/CF-XML/*
- *Типовая: /netfolder-43/БП_КОРП-ПС/PS-CF-XML/*