From 3dc3db205848e01b3e9d4bc04340c97b40602376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=80=D0=BE=D1=84=D0=B8-=D0=A1=D0=BE=D1=84=D1=82?= Date: Thu, 16 Jul 2026 05:51:01 +0000 Subject: [PATCH] =?UTF-8?q?v3.0.0.1:=20=D0=A3=D0=BD=D0=B8=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D0=B5=20=D1=85=D1=80?= =?UTF-8?q?=D0=B0=D0=BD=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B5=D0=BA=20-=20=D0=BF=D0=B5=D1=80=D0=B2=D0=B0?= =?UTF-8?q?=D1=8F=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20=D1=80=D0=B0?= =?UTF-8?q?=D1=81=D1=88=D0=B8=D1=80=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Регистр ПС_Настройки с составным типом (10 корневых узлов ссылочных типов) - ПВХ ПС_ВидыНастроек - 3 роли: Чтение, Просмотр, Полный доступ - Модуль ПС_РаботаСНастройками - 3 формы - Совместимость: Version8_3_27 - Логотип: LogoPS.png - Автор: 1С:Франчайзи ООО Профи-Софт (42575-13) - Соавтор: AI-ассистент MiMoCode --- PS_Nastrojki.cfe | Bin 0 -> 4024 bytes .../План_выноса_ПС_настроек_в_расширение.md | 314 ++++++++++ ...½ие на вынос настроек в отдельное расширение.md | 22 + .../Ext/Form/ФормаРедактированияНастроек/Form.xml | 93 +++ .../Ext/Form/ФормаРедактированияНастроек/Module.bsl | 5 + .../Ext/Form/ФормаСписка/Form.xml | 186 ++++++ .../Ext/Form/ФормаСписка/Module.bsl | 15 + .../ПС_ВидыНастроек/ПС_ВидыНастроек.xml | 187 ++++++ .../ПС_РаботаСНастройками/Ext/Module.bsl | 551 ++++++++++++++++++ .../ПС_РаботаСНастройками.xml | 23 + extension/src/Ext/Logo.xml | 8 + extension/src/Ext/Logo/LogoPS.png | Bin 0 -> 37168 bytes extension/src/Extension.xml | 77 +++ .../Ext/Form/ФормаСписка/Form.xml | 128 ++++ .../Ext/Form/ФормаСписка/Module.bsl | 5 + .../ПС_Настройки/ПС_Настройки.xml | 186 ++++++ extension/src/Languages/Русский.xml | 12 + .../src/Roles/ПС_ПолныйДоступКНастройкам.xml | 13 + .../ПС_ПолныйДоступКНастройкам/Ext/Rights.xml | 80 +++ extension/src/Roles/ПС_ПросмотрНастроек.xml | 13 + .../Roles/ПС_ПросмотрНастроек/Ext/Rights.xml | 56 ++ extension/src/Roles/ПС_ЧтениеНастроек.xml | 13 + .../Roles/ПС_ЧтениеНастроек/Ext/Rights.xml | 48 ++ Настройки.cfe | Bin 0 -> 4024 bytes 24 files changed, 2035 insertions(+) create mode 100755 PS_Nastrojki.cfe create mode 100644 docs/plans/План_выноса_ПС_настроек_в_расширение.md create mode 100644 docs/tasks/Задание на вынос настроек в отдельное расширение.md create mode 100755 extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаРедактированияНастроек/Form.xml create mode 100755 extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаРедактированияНастроек/Module.bsl create mode 100755 extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаСписка/Form.xml create mode 100755 extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаСписка/Module.bsl create mode 100755 extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/ПС_ВидыНастроек.xml create mode 100755 extension/src/CommonModules/ПС_РаботаСНастройками/Ext/Module.bsl create mode 100755 extension/src/CommonModules/ПС_РаботаСНастройками/ПС_РаботаСНастройками.xml create mode 100644 extension/src/Ext/Logo.xml create mode 100644 extension/src/Ext/Logo/LogoPS.png create mode 100755 extension/src/Extension.xml create mode 100755 extension/src/InformationRegisters/ПС_Настройки/Ext/Form/ФормаСписка/Form.xml create mode 100755 extension/src/InformationRegisters/ПС_Настройки/Ext/Form/ФормаСписка/Module.bsl create mode 100755 extension/src/InformationRegisters/ПС_Настройки/ПС_Настройки.xml create mode 100644 extension/src/Languages/Русский.xml create mode 100755 extension/src/Roles/ПС_ПолныйДоступКНастройкам.xml create mode 100755 extension/src/Roles/ПС_ПолныйДоступКНастройкам/Ext/Rights.xml create mode 100755 extension/src/Roles/ПС_ПросмотрНастроек.xml create mode 100755 extension/src/Roles/ПС_ПросмотрНастроек/Ext/Rights.xml create mode 100755 extension/src/Roles/ПС_ЧтениеНастроек.xml create mode 100755 extension/src/Roles/ПС_ЧтениеНастроек/Ext/Rights.xml create mode 100644 Настройки.cfe diff --git a/PS_Nastrojki.cfe b/PS_Nastrojki.cfe new file mode 100755 index 0000000000000000000000000000000000000000..a64595e296f4e28bf5221f16ee2bbcff3660cd6b GIT binary patch literal 4024 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 с уникальными UUID +- Каждая роль содержит `` для `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 + +xs:boolean +xs:string +xs:dateTime +xs:decimal + + +cfg:CatalogRef.Ссылка +cfg:DocumentRef.Ссылка +cfg:ChartOfCharacteristicTypesRef.Ссылка +cfg:ChartOfAccountsRef.Ссылка +cfg:ChartOfCalculationTypesRef.Ссылка +cfg:EnumRef.Ссылка +cfg:ExchangePlanRef.Ссылка +cfg:BusinessProcessRef.Ссылка +cfg:TaskRef.Ссылка +``` + +> **Примечание:** Точный список корневых узлов определяется платформой. В 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 + + + xs:boolean + xs:string + xs:dateTime + xs:decimal + cfg:AnyIBRef + ... + +``` + +### 7.2. Целевое состояние (расширение) + +Заменяем `cfg:AnyIBRef` на перечисление корневых узлов ссылочных типов дерева метаданных: + +```xml + + + xs:boolean + xs:string + xs:dateTime + xs:decimal + + + cfg:CatalogRef.Ссылка + cfg:DocumentRef.Ссылка + cfg:ChartOfCharacteristicTypesRef.Ссылка + cfg:ChartOfAccountsRef.Ссылка + cfg:ChartOfCalculationTypesRef.Ссылка + cfg:EnumRef.Ссылка + cfg:ExchangePlanRef.Ссылка + cfg:BusinessProcessRef.Ссылка + cfg:TaskRef.Ссылка + cfg:AccumulationRegisterRecordKey.Ссылка + cfg:InformationRegisterRecordKey.Ссылка + ... + +``` + +### 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/* diff --git a/docs/tasks/Задание на вынос настроек в отдельное расширение.md b/docs/tasks/Задание на вынос настроек в отдельное расширение.md new file mode 100644 index 0000000..4004cff --- /dev/null +++ b/docs/tasks/Задание на вынос настроек в отдельное расширение.md @@ -0,0 +1,22 @@ +# Задание на планирование выноса доработки по настройкам в отдельное расширение + +**Дата:** 15 июля 2026 г. +**Версия документа:** 1.0 + +--- + +## 1. Краткое описание задания + В организации используется доработанная конфигурация 1С БП КОРП. + В том числе разработана система хранения настроек в регистре сведений "ПС_Настройки". + Необходимо спланировать перенос места хранения (регистры, Планы видов характеристик, специальные) и всю логику по работе с настройками вынести в отдельное расширение. + Из основной конфигурации всё, что перенесено необходимо убрать. + При проектировании руководствоваться идеологией DDD. + +## 2. Файлы для изучения + + - Выгрузка доработанной конфигурации (путь: \netfolder-43\БП_КОРП-ПС\PS-CF-XML) + - Выгрузка типовой конфигурации (путь: \netfolder-43\БП_КОРП-ПС\CF-XML) + +## 3. Ожидаемый результат + + Документ с детальным планом по решению задачи. (путь: \netfolder-43\БП_КОРП-ПС\ПС_Настройки\docs\plans) diff --git a/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаРедактированияНастроек/Form.xml b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаРедактированияНастроек/Form.xml new file mode 100755 index 0000000..606c6df --- /dev/null +++ b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаРедактированияНастроек/Form.xml @@ -0,0 +1,93 @@ + +
+ LockOwnerWindow + None + Items + + + ПриСозданииНаСервере + + + + Объект.Code + false + EnterOnInput + + + + + Объект.Parent + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа настроек</v8:content> + </v8:item> + + EnterOnInput + + + + + Объект.Description + EnterOnInput + style:FieldSelectionBackColor + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Для разработчиков</v8:content> + </v8:item> + + + + ru + Группа для разработчиков + + + Vertical + Collapsible + true + StrongSeparation + + + + Объект.Имя + + + + + Объект.ValueType + + + + + + + ТекущееЗначение + style:SpecialTextColor + + + + + + + + cfg:ChartOfCharacteristicTypesObject.ПС_ВидыНастроек + + true + true + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Текущее значение</v8:content> + </v8:item> + + + + + \ No newline at end of file diff --git a/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаРедактированияНастроек/Module.bsl b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаРедактированияНастроек/Module.bsl new file mode 100755 index 0000000..7c7ead4 --- /dev/null +++ b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаРедактированияНастроек/Module.bsl @@ -0,0 +1,5 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ТекущееЗначение = РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(КонецДня(ТекущаяДата()),Новый Структура("ВидНастройки",Объект.Ссылка)).ЗначениеНастройки; +КонецПроцедуры diff --git a/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаСписка/Form.xml b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаСписка/Form.xml new file mode 100755 index 0000000..24dc8a0 --- /dev/null +++ b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаСписка/Form.xml @@ -0,0 +1,186 @@ + +
+ + + ПриСозданииНаСервере + + + + ПоказыватьНеиспользуемыеНастройки + Right + Auto + + + + ПоказыватьНеиспользуемыеНастройкиПриИзменении + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа пользовательских настроек</v8:content> + </v8:item> + + false + Vertical + Usual + false + + + + None + true + ExpandTopLevel + true + true + Список + Список.DefaultPicture + false + 60 + + Custom + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + Items + false + + true + false + Auto + СписокКомпоновщикНастроекПользовательскиеНастройки + true + + + false + + + + + Список + SearchStringRepresentation + + + + + + + Список + ViewStatusRepresentation + + + + + + + Список + SearchControl + + + + + + + Список.Код + false + + + + + Список.Наименование + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Настройка</v8:content> + </v8:item> + + + + + + Список.ЗначениеНастройки + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Значение</v8:content> + </v8:item> + + + + + + Список.ТипЗначения + true + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Тип</v8:content> + </v8:item> + + + + + +
+
+ + + + cfg:DynamicList + + true + + true + true + ВЫБРАТЬ + ПланВидовХарактеристикПС_ВидыНастроек.Ссылка КАК Ссылка, + ПланВидовХарактеристикПС_ВидыНастроек.ПометкаУдаления КАК ПометкаУдаления, + ПланВидовХарактеристикПС_ВидыНастроек.Родитель КАК Родитель, + ПланВидовХарактеристикПС_ВидыНастроек.ЭтоГруппа КАК ЭтоГруппа, + ПланВидовХарактеристикПС_ВидыНастроек.Код КАК Код, + ПланВидовХарактеристикПС_ВидыНастроек.Наименование КАК Наименование, + ПланВидовХарактеристикПС_ВидыНастроек.ТипЗначения КАК ТипЗначения, + ПланВидовХарактеристикПС_ВидыНастроек.Предопределенный КАК Предопределенный, + ПланВидовХарактеристикПС_ВидыНастроек.ИмяПредопределенныхДанных КАК ИмяПредопределенныхДанных, + ПС_НастройкиСрезПоследних.ЗначениеНастройки КАК ЗначениеНастройки +ИЗ + ПланВидовХарактеристик.ПС_ВидыНастроек КАК ПланВидовХарактеристикПС_ВидыНастроек + ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПС_Настройки.СрезПоследних КАК ПС_НастройкиСрезПоследних + ПО ПС_НастройкиСрезПоследних.ВидНастройки = ПланВидовХарактеристикПС_ВидыНастроек.Ссылка +ГДЕ + (НЕ ПланВидовХарактеристикПС_ВидыНастроек.ПометкаУдаления + ИЛИ ПланВидовХарактеристикПС_ВидыНастроек.ПометкаУдаления + И &ПоказыватьНеиспользуемыеНастройки) + ChartOfCharacteristicTypes.ПС_ВидыНастроек + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Показывать неиспользуемые настройки</v8:content> + </v8:item> + + + xs:boolean + + + + \ No newline at end of file diff --git a/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаСписка/Module.bsl b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаСписка/Module.bsl new file mode 100755 index 0000000..bde5864 --- /dev/null +++ b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/Ext/Form/ФормаСписка/Module.bsl @@ -0,0 +1,15 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + ОбновитьПараметрыСписка(); +КонецПроцедуры + +&НаСервере +Процедура ОбновитьПараметрыСписка() + Список.Параметры.УстановитьЗначениеПараметра("ПоказыватьНеиспользуемыеНастройки",ПоказыватьНеиспользуемыеНастройки); +КонецПроцедуры + +&НаКлиенте +Процедура ПоказыватьНеиспользуемыеНастройкиПриИзменении(Элемент) + ОбновитьПараметрыСписка(); +КонецПроцедуры diff --git a/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/ПС_ВидыНастроек.xml b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/ПС_ВидыНастроек.xml new file mode 100755 index 0000000..2c331a2 --- /dev/null +++ b/extension/src/ChartsOfCharacteristicTypes/ПС_ВидыНастроек/ПС_ВидыНастроек.xml @@ -0,0 +1,187 @@ + + + + + + 8d5a99cd-d7ca-445d-a8e9-e7fd2ee4eda9 + 5b6c191f-635e-47bf-988d-6b89e02c21df + + + 67eaa487-1ab2-4c5d-9b69-307a0c5807e2 + c0478010-5618-402d-bcc5-3efdf575661d + + + 51e77e14-cd35-4b1c-96f5-2f423fe9205b + af42f2bb-5094-4fb3-a086-8572e9c4c357 + + + a513673c-c4bf-4fc1-9600-7b2b0b721003 + 23416a9b-3280-49f3-a37d-8d656406377f + + + 6856a5fc-5441-43d7-b052-1b37118f639e + 3ee47073-477d-4353-a355-740914fa9603 + + + c8e5c8c4-f917-488b-a662-fd90197bcbda + 0b101c09-1ca3-4f6c-bda0-c14f60f2b0c7 + + + + ПС_ВидыНастроек + + + ru + Виды настроек + + + + true + false + + + cfg:CatalogRef.Склады + cfg:CatalogRef.ПС_ВидыТехники + cfg:CatalogRef.ПС_ТиповыеКонфигурации1СПредприятие + cfg:CatalogRef.ПС_ВидыРасходныхМатериаловДляВидовРабот + cfg:CatalogRef.ТарифныеПланы + cfg:CatalogRef.Сотрудники + cfg:CatalogRef.ПС_Конфигурации1СПредприятиеКонтрагентов + cfg:CatalogRef.ДоговорыКонтрагентов + cfg:CatalogRef.ПС_Техника + cfg:CatalogRef.ПС_РасходныеМатериалы + xs:boolean + cfg:CatalogRef.ПС_ВидыКартриджей + cfg:CatalogRef.КонтактныеЛица + cfg:CatalogRef.НоменклатурныеГруппы + cfg:CatalogRef.ПС_ВидыРабот + xs:string + cfg:CatalogRef.Контрагенты + cfg:CatalogRef.ПС_Картриджи + xs:dateTime + cfg:CatalogRef.ПС_ФирмыПроизводителиПрограммногоОбеспечения + cfg:CatalogRef.ПС_РолиПользователей + xs:decimal + cfg:CatalogRef.ПС_Конфигурации1СПредприятиеОрганизации + cfg:CatalogRef.Пользователи + cfg:CatalogRef.СтатьиЗатрат + cfg:CatalogRef.Организации + cfg:CatalogRef.ПС_МоделиТехники + cfg:CatalogRef.Номенклатура + cfg:CatalogRef.ПС_ФирмыПроизводителиТехники + cfg:CatalogRef.ПС_МоделиКартриджей + cfg:CatalogRef.ФизическиеЛица + + 10 + 0 + Any + + + 250 + Variable + + + Date + + + true + true + 9 + Variable + 100 + WholeCharacteristicKind + true + true + AsDescription + + Auto + InDialog + false + BothWays + + ChartOfCharacteristicTypes.ПС_ВидыНастроек.StandardAttribute.Description + ChartOfCharacteristicTypes.ПС_ВидыНастроек.StandardAttribute.Code + + DontUse + Begin + Directly + DontUse + Auto + ChartOfCharacteristicTypes.ПС_ВидыНастроек.Form.ФормаРедактированияНастроек + + ChartOfCharacteristicTypes.ПС_ВидыНастроек.Form.ФормаСписка + + + + + + + + + + Managed + Use + + + + + ru + Редактирование настроек + + + + + DontUse + false + false + + + + + Имя + + + ru + Наименование для разработчиков + + + + + xs:string + + 50 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + Index + ForItem + Use + Use + + +
ФормаРедактированияНастроек
+
ФормаСписка
+
+
+
\ No newline at end of file diff --git a/extension/src/CommonModules/ПС_РаботаСНастройками/Ext/Module.bsl b/extension/src/CommonModules/ПС_РаботаСНастройками/Ext/Module.bsl new file mode 100755 index 0000000..a0809b3 --- /dev/null +++ b/extension/src/CommonModules/ПС_РаботаСНастройками/Ext/Module.bsl @@ -0,0 +1,551 @@ +Функция ТекущееЗначениеНастройки(Настройка) Экспорт + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ТекущаяДата(), Новый Структура("ВидНастройки",Настройка)).ЗначениеНастройки; +КонецФункции // ЗначениеНастройки(Настройка) + +Функция ТекущееЗначениеНастройкиПоИмени(Имя) Экспорт + Настройка = ПланыВидовХарактеристик.ПС_ВидыНастроек.НайтиПоРеквизиту("Имя",Имя); + Если Настройка.Пустая() Тогда + Возврат Неопределено + Иначе + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ТекущаяДата(), Новый Структура("ВидНастройки",Настройка)).ЗначениеНастройки; + КонецЕсли; +КонецФункции // ЗначениеНастройки(Настройка) + +Функция ЗаписатьТекущееЗначениеНастройкиПоИмени(Имя,Значение) Экспорт + РезультатЗаписи = Истина; + Настройка = ПланыВидовХарактеристик.ПС_ВидыНастроек.НайтиПоРеквизиту("Имя",Имя); + Если Настройка.Пустая() Тогда + РезультатЗаписи = Ложь; + Иначе + Попытка + ДанныеНастроек = РегистрыСведений.ПС_Настройки.СоздатьМенеджерЗаписи(); + ДанныеНастроек.ВидНастройки = Настройка; + ДанныеНастроек.Период = ТекущаяДата(); + ДанныеНастроек.ЗначениеНастройки = Значение; + ДанныеНастроек.Записать(); + Исключение + РезультатЗаписи = Ложь; + КонецПопытки; + КонецЕсли; + Возврат РезультатЗаписи; +КонецФункции // ЗначениеНастройки(Настройка) + +Функция ЗначениеНастройкиНаДату(Настройка, Дата) Экспорт + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(Дата, Новый Структура("ВидНастройки",Настройка)).ЗначениеНастройки; +КонецФункции // ЗначениеНастройкиНаДату(Настройка) + +Функция ЗначениеНастройкиПоИмениНаДату(Имя, Дата) Экспорт + Настройка = ПланыВидовХарактеристик.ПС_ВидыНастроек.НайтиПоРеквизиту("Имя",Имя); + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(Дата, Новый Структура("ВидНастройки",Настройка)).ЗначениеНастройки; +КонецФункции // ЗначениеНастройкиНаДату(Настройка) + +Функция ЗаписатьТекущееЗначениеНастройкиПоИмениНаДату(Имя,Значение,Дата) Экспорт + РезультатЗаписи = Истина; + Настройка = ПланыВидовХарактеристик.ПС_ВидыНастроек.НайтиПоРеквизиту("Имя",Имя); + Если Настройка.Пустая() Тогда + РезультатЗаписи = Ложь; + Иначе + Попытка + ДанныеНастроек = РегистрыСведений.ПС_Настройки.СоздатьМенеджерЗаписи(); + ДанныеНастроек.ВидНастройки = Настройка; + ДанныеНастроек.Период = Дата; + ДанныеНастроек.ЗначениеНастройки = Значение; + ДанныеНастроек.Записать(); + Исключение + РезультатЗаписи = Ложь; + КонецПопытки; + КонецЕсли; + Возврат РезультатЗаписи; +КонецФункции // ЗначениеНастройки(Настройка) + +Функция ДатаЗапретаРедактированияДанныхСервиса(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ДатаЗапретаРедактированияДанныхСервиса); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ОрганизацияПоУмолчанию(Дата = Неопределено) + +Функция ДатаВРазрешенномПериодеРедактирования(ПроверяемаяДата) Экспорт + Возврат НачалоДня(ПроверяемаяДата) > НачалоДня(ДатаЗапретаРедактированияДанныхСервиса(ТекущаяДата())); +КонецФункции // ДатаВЗапрещенномПериодеРедактирования() + + +Функция ОсновнаяОрганизация(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ОсновнаяОрганизация); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ОрганизацияПоУмолчанию(Дата = Неопределено) + +Функция ОсновнойСкладРасходныхМатериалов(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.СкладРасходныхМатериалов); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ОрганизацияПоУмолчанию(Дата = Неопределено) + +Функция НоменклатурнаяГруппаДляОбслуживанияПКИОргтехники(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляОбслуживанияПКИОргтехники); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияПКИОргтехники(Дата = Неопределено) + +Функция ВидРаботПоЗаправкеКартриджа(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ВидРаботПоЗаправкеКартриджа); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + +#Область НоменклатурныеГруппыОбслуживанияФизическихЛиц +Функция НоменклатурнаяГруппаДляРаботПоКартриджуФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоКартриджуФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоТехникеФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоТехникеФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоМонтажуЛВСФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоМонтажуЛВСФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоМонтажуСистемыВидеонаблюденияФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоМонтажуСистемыВидеонаблюденияФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоКурсамФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоКурсамФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляВыездныхРаботПо1СФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляВыездныхРаботПо1СФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляВыездныхРаботПоПКиОргтехникеФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляВыездныхРаботПоПКиОргтехникеФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоРазработкеСайтаФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоРазработкеСайтаФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоПрочимРаботамФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоПрочимРаботамФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + +#КонецОбласти + +#Область НоменклатурныеГруппыОбслуживания +Функция НоменклатурнаяГруппаДляРаботПоКартриджу(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоКартриджу); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоТехнике(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоТехнике); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоМонтажуЛВС(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоМонтажуЛВС); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоМонтажуСистемыВидеонаблюдения(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоМонтажуСистемыВидеонаблюдения); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоКурсам(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоКурсам); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляВыездныхРаботПо1С(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляВыездныхРаботПо1С); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляВыездныхРаботПоПКиОргтехнике(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляВыездныхРаботПоПКиОргтехнике); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоРазработкеСайта(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоРазработкеСайта); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция НоменклатурнаяГруппаДляРаботПоПрочимРаботам(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.НоменклатурнаяГруппаДляРаботПоПрочимРаботам); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //НоменклатурнаяГруппаДляОбслуживанияФизическихЛиц(Дата = Неопределено) + +#КонецОбласти + +#Область ТарифныеПланыОбслуживанияФизическихЛиц +Функция ТарифныйПланДляРаботПоКартриджуФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ТарифныйПланДляРаботПоКартриджуФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ТарифныйПланДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция ТарифныйПланДляРаботПоТехникеФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ТарифныйПланДляРаботПоТехникеФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ТарифныйПланДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция ТарифныйПланДляРаботПоМонтажуЛВСФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ТарифныйПланДляРаботПоМонтажуЛВСФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ТарифныйПланДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция ТарифныйПланДляРаботПоМонтажуСистемыВидеонаблюденияФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ТарифныйПланДляРаботПоМонтажуСистемыВидеонаблюденияФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ТарифныйПланДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция ТарифныйПланДляРаботПоКурсамФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ТарифныйПланДляРаботПоКурсамФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ТарифныйПланДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция ТарифныйПланДляВыездныхРаботПо1СФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ТарифныйПланДляВыездныхРаботПо1СФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ТарифныйПланДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция ТарифныйПланДляВыездныхРаботПоПКиОргтехникеФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ТарифныйПланДляВыездныхРаботПоПКиОргтехникеФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ТарифныйПланДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция ТарифныйПланДляРаботПоРазработкеСайтаФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ТарифныйПланДляРаботПоРазработкеСайтаФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ТарифныйПланДляОбслуживанияФизическихЛиц(Дата = Неопределено) + + +Функция ТарифныйПланДляРаботПоПрочимРаботамФизическихЛиц(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ТарифныйПланДляРаботПоПрочимРаботамФизическихЛиц); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ТарифныйПланДляОбслуживанияФизическихЛиц(Дата = Неопределено) + +#КонецОбласти + +Функция НачалоРабочегоДня(ДатаПолученияНастройки = Неопределено) Экспорт + НастройкаПолученияЧаса = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ЧасНачалаРабочегоДня); + НастройкаПолученияМинуты = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.МинутаНачалаРабочегоДня); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Час = РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,НастройкаПолученияЧаса).ЗначениеНастройки; + Если Час = Неопределено Тогда + Час = 0; + КонецЕсли; + Минута = РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,НастройкаПолученияМинуты).ЗначениеНастройки; + Если Минута = Неопределено Тогда + Минута = 0; + КонецЕсли; + Возврат Дата(1,1,1,Час,Минута,0); +КонецФункции //НачалоРабочегоДня(ДатаПолученияНастройки = Неопределено) + +Функция ОкончаниеРабочегоДня(ДатаПолученияНастройки = Неопределено) Экспорт + НастройкаПолученияЧаса = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ЧасОкончанияРабочегоДня); + НастройкаПолученияМинуты = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.МинутаОкончанияРабочегоДня); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Час = РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,НастройкаПолученияЧаса).ЗначениеНастройки; + Если Час = Неопределено Тогда + Час = 23; + КонецЕсли; + Минута = РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,НастройкаПолученияМинуты).ЗначениеНастройки; + Если Минута = Неопределено Тогда + Минута = 59; + КонецЕсли; + Возврат Дата(1,1,1,Час,Минута,0); +КонецФункции //ОкончаниеРабочегоДня(ДатаПолученияНастройки = Неопределено) + +Функция ПрефиксQRКодирования(ДатаПолученияНастройки = Неопределено) Экспорт + НастройкаПолученияПрефикса = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ПрефиксQRКодирования); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Префикс = РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,НастройкаПолученияПрефикса).ЗначениеНастройки; + Если Префикс = Неопределено Тогда + Префикс = ""; + КонецЕсли; + Возврат Префикс; +КонецФункции //ПрефиксQRКодирования(ДатаПолученияНастройки = Неопределено) + +Функция КомментироватьСобытия(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.КомментироватьСобытия); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Результат = РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; + Если Результат = Неопределено Тогда + Результат = Ложь; + КонецЕсли; + Возврат Результат; +КонецФункции //КомментироватьСобытия(ДатаПолученияНастройки = Неопределено) + +Процедура СообщитьОСобытии(СообщениеОСобытии,Ссылка = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.КомментироватьСобытия); + ДатаПолученияНастройки = ТекущаяДата(); + КомментироватьСобытия = РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; + Если КомментироватьСобытия = Неопределено Тогда + КомментироватьСобытия = Ложь; + КонецЕсли; + Если КомментироватьСобытия Тогда + Сообщение = Новый СообщениеПользователю; + Сообщение.Текст = Строка(СообщениеОСобытии); + Если Ссылка <> Неопределено Тогда + Если ЗначениеЗаполнено(Ссылка) Тогда + Сообщение.КлючДанных = Ссылка; + КонецЕсли; + КонецЕсли; + Сообщение.Сообщить(); + КонецЕсли; + Попытка + ЗаголовокСообщения = "ПС. " + ПараметрыСеанса.ПС_ВерсияРасширения + ". Диагностическое сообщение."; + Исключение + ЗаголовокСообщения = "ПС. Диагностическое сообщение."; + КонецПопытки; + ЗаписьЖурналаРегистрации(ЗаголовокСообщения,,,Ссылка,СообщениеОСобытии); +КонецПроцедуры //СообщитьОСобытии(СообщениеОСобытии) + +Функция НомерМесяца(ПереданныйМесяц) + ВозвращаемыйНомер = 0; + Если ТипЗнч(ПереданныйМесяц) = ТипЗнч(Перечисления.ПС_Месяцы.Январь) Тогда + Если ПереданныйМесяц = Перечисления.ПС_Месяцы.Январь Тогда + ВозвращаемыйНомер = 1; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Февраль Тогда + ВозвращаемыйНомер = 2; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Март Тогда + ВозвращаемыйНомер = 3; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Апрель Тогда + ВозвращаемыйНомер = 4; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Май Тогда + ВозвращаемыйНомер = 5; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Июнь Тогда + ВозвращаемыйНомер = 6; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Июль Тогда + ВозвращаемыйНомер = 7; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Август Тогда + ВозвращаемыйНомер = 8; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Сентябрь Тогда + ВозвращаемыйНомер = 9; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Октябрь Тогда + ВозвращаемыйНомер = 10; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Ноябрь Тогда + ВозвращаемыйНомер = 11; + ИначеЕсли ПереданныйМесяц = Перечисления.ПС_Месяцы.Декабрь Тогда + ВозвращаемыйНомер = 12; + КонецЕсли; + КонецЕсли; + Возврат ВозвращаемыйНомер; +КонецФункции // НомерМесяца() + +Функция ПериодОбслуживаняВСтандартныйПериод(МесяцОбслуживания,ГодОбслуживания) Экспорт + ВозвращаемыйСтандартныйПериод = Новый СтандартныйПериод; + ВозвращаемыйСтандартныйПериод.ДатаНачала = Дата(1,1,1,0,0,0); + ВозвращаемыйСтандартныйПериод.ДатаОкончания = Дата(1,1,1,0,0,0); + НомерМесяцаОбслуживания = НомерМесяца(МесяцОбслуживания); + Если НомерМесяцаОбслуживания > 0 Тогда + Попытка + ВозвращаемыйСтандартныйПериод.ДатаНачала = Дата(ГодОбслуживания,НомерМесяцаОбслуживания,1,0,0,0); + ВозвращаемыйСтандартныйПериод.ДатаОкончания = КонецМесяца(ВозвращаемыйСтандартныйПериод.ДатаНачала); + Исключение + КонецПопытки; + КонецЕсли; + Возврат ВозвращаемыйСтандартныйПериод; +КонецФункции + + +Функция МесяцПоНомеру(ПереданныйНомер) + ВозвращаемыйМесяц = 0; + Если ТипЗнч(ПереданныйНомер) = ТипЗнч(1) Тогда + Если ПереданныйНомер = 1 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Январь; + ИначеЕсли ПереданныйНомер = 2 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Февраль; + ИначеЕсли ПереданныйНомер = 3 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Март; + ИначеЕсли ПереданныйНомер = 4 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Апрель; + ИначеЕсли ПереданныйНомер = 5 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Май; + ИначеЕсли ПереданныйНомер = 6 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Июнь; + ИначеЕсли ПереданныйНомер = 7 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Июль; + ИначеЕсли ПереданныйНомер = 8 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Август; + ИначеЕсли ПереданныйНомер = 9 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Сентябрь; + ИначеЕсли ПереданныйНомер = 10 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Октябрь; + ИначеЕсли ПереданныйНомер = 11 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Ноябрь; + ИначеЕсли ПереданныйНомер = 12 Тогда + ВозвращаемыйМесяц = Перечисления.ПС_Месяцы.Декабрь; + КонецЕсли; + КонецЕсли; + Возврат ВозвращаемыйМесяц; +КонецФункции // НомерМесяца() + + +Функция ДатаОбслуживанияВПериодОбслуживаня(ДатаОбслуживания) Экспорт + ВозвращаемыйПериодОбслуживания = Новый Структура("МесяцОбслуживания,ГодОбслуживания"); + Попытка + ВозвращаемыйПериодОбслуживания.МесяцОбслуживания = МесяцПоНомеру(Месяц(ДатаОбслуживания)); + ВозвращаемыйПериодОбслуживания.ГодОбслуживания = Год(ДатаОбслуживания); + Исключение + КонецПопытки; + Возврат ВозвращаемыйПериодОбслуживания; +КонецФункции + +Функция МаксимальноеКоличествоЧасовНепрерывнойДистанционнойРаботы(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.МаксимальноеКоличествоЧасовНепрерывнойДистанционнойРаботы); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //МаксимальноеКоличествоЧасовНепрерывнойДистанционнойРаботы(Дата = Неопределено) + +Функция ПутьКПапкеСФайломСтатистикиОбращенийУдаленногоОбслуживания(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ПутьКПапкеСФайломСтатистикиОбращенийУдаленногоОбслуживания); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ПутьКПапкеСФайломСтатистикиОбращенийУдаленногоОбслуживания(Дата = Неопределено) + +Функция ПутьКПапкеСФайломСтатистикиСеансовУдаленногоДоступа(ДатаПолученияНастройки = Неопределено) Экспорт + Настройка = Новый Структура("ВидНастройки",ПланыВидовХарактеристик.ПС_ВидыНастроек.ПутьКПапкеСФайломСтатистикиСеансовУдаленногоДоступа); + Если ДатаПолученияНастройки = Неопределено Тогда + ДатаПолученияНастройки = ТекущаяДата() + КонецЕсли; + Возврат РегистрыСведений.ПС_Настройки.ПолучитьПоследнее(ДатаПолученияНастройки,Настройка).ЗначениеНастройки; +КонецФункции //ПутьКПапкеСФайломСтатистикиСеансовУдаленногоДоступа(Дата = Неопределено) diff --git a/extension/src/CommonModules/ПС_РаботаСНастройками/ПС_РаботаСНастройками.xml b/extension/src/CommonModules/ПС_РаботаСНастройками/ПС_РаботаСНастройками.xml new file mode 100755 index 0000000..76f8883 --- /dev/null +++ b/extension/src/CommonModules/ПС_РаботаСНастройками/ПС_РаботаСНастройками.xml @@ -0,0 +1,23 @@ + + + + + ПС_РаботаСНастройками + + + ru + Работа с настройками + + + + false + false + true + false + false + false + false + DontUse + + + \ No newline at end of file diff --git a/extension/src/Ext/Logo.xml b/extension/src/Ext/Logo.xml new file mode 100644 index 0000000..9b8e604 --- /dev/null +++ b/extension/src/Ext/Logo.xml @@ -0,0 +1,8 @@ + + + + + PNG + + + diff --git a/extension/src/Ext/Logo/LogoPS.png b/extension/src/Ext/Logo/LogoPS.png new file mode 100644 index 0000000000000000000000000000000000000000..f415bc43990be986079780f332907d829afeb1c9 GIT binary patch literal 37168 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 Z{6E${dPC!w2`~Tv002ovPDHLkV1n$LaKZop literal 0 HcmV?d00001 diff --git a/extension/src/Extension.xml b/extension/src/Extension.xml new file mode 100755 index 0000000..d2581a2 --- /dev/null +++ b/extension/src/Extension.xml @@ -0,0 +1,77 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + b1c2d3e4-f5a6-7890-abcd-ef1234567890 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + c2d3e4f5-a6b7-8901-bcde-f12345678901 + + + e3687481-0a87-462c-a166-9f34594f9bba + d3e4f5a6-b7c8-9012-cdef-123456789012 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + e4f5a6b7-c8d9-0123-defa-234567890123 + + + 51f2d5d8-ea4d-4064-8892-82951750031e + f5a6b7c8-d9e0-1234-efab-345678901234 + + + e68182ea-4237-4383-967f-90c1e3370bc7 + a6b7c8d9-e0f1-2345-fabc-456789012345 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + b7c8d9e0-f1a2-3456-abcd-567890123456 + + + + Adopted + Настройки + + + ru + Настройки + + + + + ru + Организация хранения настроек, привязанных к произвольным свойствам и с сохранением истории изменения + + + + + ru + Расширение реализует универсальное хранилище настроек через регистр сведений ПС_Настройки с ключом-ПВХ ПС_ВидыНастроек. Поддерживает все простые типы данных (булево, строка, дата, число) и ссылочные типы дерева метаданных. История изменений настроек сохраняется через периодичность регистра. Иерархия ролей: Чтение (программные вызовы), Просмотр (интерактивный доступ), Полный доступ (управление). Разработано совместно с AI-ассистентом MiMoCode (Xiaomi MiMo Team). + + + + + ru + 1С:Франчайзи ООО "Профи-Софт", код партнера 42575-13 + + + 1С:Франчайзи ООО "Профи-Софт", код партнера 42575-13 + 3.0.0.1 + 2 + ПС_ + ПС_ + Version8_3_27 + + + ПС_ЧтениеНастроек + ПС_ПросмотрНастроек + ПС_ПолныйДоступКНастройкам + ПС_ВидыНастроек + ПС_Настройки + ПС_РаботаСНастройками + + + diff --git a/extension/src/InformationRegisters/ПС_Настройки/Ext/Form/ФормаСписка/Form.xml b/extension/src/InformationRegisters/ПС_Настройки/Ext/Form/ФормаСписка/Form.xml new file mode 100755 index 0000000..da777b4 --- /dev/null +++ b/extension/src/InformationRegisters/ПС_Настройки/Ext/Form/ФормаСписка/Form.xml @@ -0,0 +1,128 @@ + +
+ + + ПриСозданииНаСервере + + + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>Группа пользовательских настроек</v8:content> + </v8:item> + + false + Vertical + Usual + false + + + + List + None + true + ExpandTopLevel + true + ПС_СписокНастроек + ПС_СписокНастроек.DefaultPicture + false + 60 + + Custom + 0001-01-01T00:00:00 + 0001-01-01T00:00:00 + + Items + false + + true + false + Auto + СписокКомпоновщикНастроекПользовательскиеНастройки + true + + + false + + + + + ПС_СписокНастроек + SearchStringRepresentation + + + + + + + ПС_СписокНастроек + ViewStatusRepresentation + + + + + + + ПС_СписокНастроек + SearchControl + + + + + + + ПС_СписокНастроек.Period + true + + + + + ПС_СписокНастроек.ВидНастройки + + + + + ПС_СписокНастроек.ЗначениеНастройки + + + + +
+
+ + + + <v8:item> + <v8:lang>ru</v8:lang> + <v8:content>П с список настроек</v8:content> + </v8:item> + + + cfg:DynamicList + + true + + false + true + InformationRegister.ПС_Настройки + + + Normal + dfcece9d-5077-440b-b6b3-45a5cb4538eb + + + Normal + 88619765-ccb3-46c6-ac52-38e9c992ebd4 + + + Normal + b75fecce-942b-4aed-abc9-e6a02e460fb3 + + Normal + 911b6018-f537-43e8-a417-da56b22f9aec + + + + + \ No newline at end of file diff --git a/extension/src/InformationRegisters/ПС_Настройки/Ext/Form/ФормаСписка/Module.bsl b/extension/src/InformationRegisters/ПС_Настройки/Ext/Form/ФормаСписка/Module.bsl new file mode 100755 index 0000000..a06f693 --- /dev/null +++ b/extension/src/InformationRegisters/ПС_Настройки/Ext/Form/ФормаСписка/Module.bsl @@ -0,0 +1,5 @@ + +&НаСервере +Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) + //ПС_СписокНастроек.УстановитьОбязательноеИспользование("ВидНастройки",Истина); +КонецПроцедуры diff --git a/extension/src/InformationRegisters/ПС_Настройки/ПС_Настройки.xml b/extension/src/InformationRegisters/ПС_Настройки/ПС_Настройки.xml new file mode 100755 index 0000000..1a2246d --- /dev/null +++ b/extension/src/InformationRegisters/ПС_Настройки/ПС_Настройки.xml @@ -0,0 +1,186 @@ + + + + + + a28d33ef-edaa-4a04-8bfd-d6669f69eeff + 18e64e7a-1c4c-4e9d-ba0e-3622fb97df81 + + + 6ad5a84c-c880-45d3-a54a-55fa66e8aea9 + 2b55dc8d-fb80-4527-97c3-68b39c9f1306 + + + b2d90406-f611-46b2-8f9b-a24a0cfa0174 + de962d72-0133-482e-a8be-d80e24e22a94 + + + 72874cfa-497a-4f59-b202-718d0e558abf + 760fa967-3b5e-4803-8f07-a240daa799a5 + + + 5241194a-31ee-4bb7-adf6-d679ea1495a8 + 179f08e9-1dfc-481a-861f-d61a12b157bb + + + bae90479-5039-46ca-993b-573db33e5716 + 793c69d5-eccd-40ca-9e43-86b3e0fb635e + + + c5a441dd-475a-40bd-9cb6-bffb38bf9f8e + b06c1782-8a61-4513-b340-993d458e1b06 + + + + ПС_Настройки + + + ru + Настройки + + + + true + InDialog + + InformationRegister.ПС_Настройки.Form.ФормаСписка + + + Day + Independent + true + false + Managed + DontUse + false + false + + + + + ru + Значения настроек + + + + + DontUse + false + false + + + + + ЗначениеНастройки + + + ru + Значение настройки + + + + + xs:boolean + xs:string + xs:dateTime + xs:decimal + + cfg:CatalogRef.Ссылка + cfg:DocumentRef.Ссылка + cfg:ChartOfCharacteristicTypesRef.Ссылка + cfg:ChartOfAccountsRef.Ссылка + cfg:ChartOfCalculationTypesRef.Ссылка + cfg:EnumRef.Ссылка + cfg:ExchangePlanRef.Ссылка + cfg:BusinessProcessRef.Ссылка + cfg:BusinessProcessRoutePointRef.Ссылка + cfg:TaskRef.Ссылка + + 10 + 0 + Any + + + 250 + Variable + + + DateTime + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + InformationRegister.ПС_Настройки.Dimension.ВидНастройки + 0 + + Auto + DontIndex + Use + Use + + + + + ВидНастройки + + + ru + Вид настройки + + + + + cfg:ChartOfCharacteristicTypesRef.ПС_ВидыНастроек + + false + + + + false + + false + false + + + true + + DontCheck + Items + + + Auto + Auto + + + Auto + true + true + true + DontIndex + Use + Use + TransformValues + + +
ФормаСписка
+
+
+
\ No newline at end of file diff --git a/extension/src/Languages/Русский.xml b/extension/src/Languages/Русский.xml new file mode 100644 index 0000000..797e5f3 --- /dev/null +++ b/extension/src/Languages/Русский.xml @@ -0,0 +1,12 @@ + + + + + + + Русский + + ru + + + diff --git a/extension/src/Roles/ПС_ПолныйДоступКНастройкам.xml b/extension/src/Roles/ПС_ПолныйДоступКНастройкам.xml new file mode 100755 index 0000000..d982642 --- /dev/null +++ b/extension/src/Roles/ПС_ПолныйДоступКНастройкам.xml @@ -0,0 +1,13 @@ + + + + ПС_ПолныйДоступКНастройкам + + + ru + ПС: Полный доступ к настройкам + + + + + diff --git a/extension/src/Roles/ПС_ПолныйДоступКНастройкам/Ext/Rights.xml b/extension/src/Roles/ПС_ПолныйДоступКНастройкам/Ext/Rights.xml new file mode 100755 index 0000000..6555829 --- /dev/null +++ b/extension/src/Roles/ПС_ПолныйДоступКНастройкам/Ext/Rights.xml @@ -0,0 +1,80 @@ + + + + Configuration.БухгалтерияПредприятияКОРП + + DataAdministration + true + + + ExclusiveMode + false + + + ThinClient + true + + + WebClient + true + + + MobileClient + true + + + ThickClient + true + + + ExternalConnection + true + + + + InformationRegister.ПС_Настройки + + Read + true + + + View + true + + + Insert + true + + + Update + true + + + Delete + true + + + + ChartOfCharacteristicTypes.ПС_ВидыНастроек + + Read + true + + + View + true + + + Insert + true + + + Update + true + + + Delete + true + + + diff --git a/extension/src/Roles/ПС_ПросмотрНастроек.xml b/extension/src/Roles/ПС_ПросмотрНастроек.xml new file mode 100755 index 0000000..a87ef28 --- /dev/null +++ b/extension/src/Roles/ПС_ПросмотрНастроек.xml @@ -0,0 +1,13 @@ + + + + ПС_ПросмотрНастроек + + + ru + ПС: Просмотр настроек + + + + + diff --git a/extension/src/Roles/ПС_ПросмотрНастроек/Ext/Rights.xml b/extension/src/Roles/ПС_ПросмотрНастроек/Ext/Rights.xml new file mode 100755 index 0000000..9cc6113 --- /dev/null +++ b/extension/src/Roles/ПС_ПросмотрНастроек/Ext/Rights.xml @@ -0,0 +1,56 @@ + + + + Configuration.БухгалтерияПредприятияКОРП + + DataAdministration + false + + + ExclusiveMode + false + + + ThinClient + true + + + WebClient + true + + + MobileClient + true + + + ThickClient + true + + + ExternalConnection + true + + + + InformationRegister.ПС_Настройки + + Read + true + + + View + true + + + + ChartOfCharacteristicTypes.ПС_ВидыНастроек + + Read + true + + + View + true + + + diff --git a/extension/src/Roles/ПС_ЧтениеНастроек.xml b/extension/src/Roles/ПС_ЧтениеНастроек.xml new file mode 100755 index 0000000..248ccaf --- /dev/null +++ b/extension/src/Roles/ПС_ЧтениеНастроек.xml @@ -0,0 +1,13 @@ + + + + ПС_ЧтениеНастроек + + + ru + ПС: Чтение настроек + + + + + diff --git a/extension/src/Roles/ПС_ЧтениеНастроек/Ext/Rights.xml b/extension/src/Roles/ПС_ЧтениеНастроек/Ext/Rights.xml new file mode 100755 index 0000000..fa4387c --- /dev/null +++ b/extension/src/Roles/ПС_ЧтениеНастроек/Ext/Rights.xml @@ -0,0 +1,48 @@ + + + + Configuration.БухгалтерияПредприятияКОРП + + DataAdministration + false + + + ExclusiveMode + false + + + ThinClient + true + + + WebClient + true + + + MobileClient + true + + + ThickClient + true + + + ExternalConnection + true + + + + InformationRegister.ПС_Настройки + + Read + true + + + + ChartOfCharacteristicTypes.ПС_ВидыНастроек + + Read + true + + + diff --git a/Настройки.cfe b/Настройки.cfe new file mode 100644 index 0000000000000000000000000000000000000000..a64595e296f4e28bf5221f16ee2bbcff3660cd6b GIT binary patch literal 4024 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