Добавил документ ИПР и сопутсвующие ему объекты + рефакторинг#45
Добавил документ ИПР и сопутсвующие ему объекты + рефакторинг#45Lore-leii wants to merge 8 commits into
Conversation
…се сопуствующие объекты по задаче #23
WalkthroughДобавлены новые сущности ИПР: каталог ЗадачиИПР (иерархический), документ ИндивидуальныйПланРазвития с ТЧ ПланГрафик, регистр сведений ВыполнениеЗаданийИПР, перечисления ТипыЗаданий и СтатусыЗадачИПР, формы (элемента, выборов, документа), шаблон табличного документа и роли/права. Реализованы модули форм и объекта документа. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor User as Пользователь
participant DocForm as Форма документа ИПР
participant SelForm as Форма подбора задач (с корзиной)
participant Catalog as Каталог ЗадачиИПР
User->>DocForm: Открыть документ
DocForm->>DocForm: ПриСозданииНаСервере/ПодготовитьФормуНаСервере
User->>DocForm: Нажать "Подбор задач"
DocForm->>SelForm: Открыть форму выбора (мультивыбор)
SelForm->>Catalog: Показ динамический список
User->>SelForm: Выбор/перетаскивание в корзину
SelForm-->>DocForm: ОповеститьОВыборе(массив ссылок)
DocForm->>DocForm: ПриВыбореЗадачИПР: добавить/обновить строки ТЧ
DocForm->>DocForm: Пересобрать табличный документ плана
sequenceDiagram
autonumber
actor User as Пользователь
participant ItemForm as Форма элемента задачи
participant OS as Внешнее приложение
User->>ItemForm: Нажать "Открыть ссылку"
ItemForm->>ItemForm: ОткрытьСсылкуВБраузере()
alt Ссылка пуста/некорректна
ItemForm-->>User: Сообщение об ошибке
else Валидная ссылка
ItemForm->>OS: ЗапуститьПриложение(HTTP/HTTPS URL)
end
sequenceDiagram
autonumber
actor User as Пользователь
participant DocForm as Форма документа ИПР
participant DocObj as Объект документа
participant Reg as Регистр сведений ВыполнениеЗаданийИПР
User->>DocForm: Провести
DocForm->>DocObj: Запись/Проведение
DocObj->>Reg: Очистить набор записей
DocObj->>Reg: Заполнить движения по ТЧ (фактическое время, сотрудник, задание)
Reg-->>DocObj: Записать движения
sequenceDiagram
autonumber
actor User as Пользователь
participant DocForm as Форма документа ИПР
participant Roles as Роли/Права
User->>DocForm: Открыть форму
DocForm->>Roles: Проверка ролей (ИзменениеДокументовИПР, ИзменениеДатыДокументовИПР)
Roles-->>DocForm: Разрешения
DocForm->>DocForm: Установить ТолькоПросмотр/доступность элементов
Estimated code review effort🎯 5 (Critical) | ⏱️ ~120 minutes Pre-merge checks (3 passed)✅ Passed checks (3 passed)
Tip 👮 Agentic pre-merge checks are now available in preview!Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.
Please see the documentation for more information. Example: reviews:
pre_merge_checks:
custom_checks:
- name: "Undocumented Breaking Changes"
mode: "warning"
instructions: |
Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).Please share your feedback with us on this Discord post. ✨ Finishing Touches🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 13
🧹 Nitpick comments (36)
src/cf/Roles/ИзменениеДатыДокументовИПР.xml (1)
3-14: Роль ок, но уточните границы прав: только изменение даты?Название роли подразумевает узкую операцию. Проверьте, что в Ext/Rights.xml для Document.ИндивидуальныйПланРазвития выданы только необходимые права (желательно точечно на атрибут Дата/ДатаДокумента через атрибуто‑уровневые права), без избыточных Posting/UndoPosting/InteractiveChangeOfPosted и т.п.
src/cf/Roles/ИзменениеЗадачиИПР/Ext/Rights.xml (1)
7-52: Права на Configuration. могут быть лишними*Блок с Configuration.УправлениеПроектнымОтделом включает клиентские режимы/Output/SaveUserData. Обычно это не требуется на уровне ролей, если не ограничиваете типы клиентов. Можно удалить ради минимизации матрицы прав.
src/cf/Roles/ЧтениеДокументовИПР.xml (1)
6-11: Добавьте локализацию синонима (en) для консистентностиРекомендуется указать элемент v8:item с v8:lang=en.
<Synonym> <v8:item> <v8:lang>ru</v8:lang> <v8:content>Чтение документов ИПР</v8:content> </v8:item> + <v8:item> + <v8:lang>en</v8:lang> + <v8:content>IPR documents: read</v8:content> + </v8:item> </Synonym>src/cf/Roles/ИзменениеДокументовИПР.xml (1)
6-11: Добавьте английскую локализацию синонимаДля единообразия локализаций.
<Synonym> <v8:item> <v8:lang>ru</v8:lang> <v8:content>Изменение документов ИПР</v8:content> </v8:item> + <v8:item> + <v8:lang>en</v8:lang> + <v8:content>IPR documents: modify</v8:content> + </v8:item> </Synonym>src/cf/Roles/ИзменениеДокументовИПР/Ext/Rights.xml (2)
7-51: Сузьте права на уровне Configuration до необходимых режимовВключены редкие режимы (Kiosk, EmbeddedWorkplace, AnalyticsSystemClient). Если не требуются — лучше отключить.
<right> <name>MainWindowModeEmbeddedWorkplace</name> - <value>true</value> + <value>false</value> </right> <right> <name>MainWindowModeKiosk</name> - <value>true</value> + <value>false</value> </right> <right> <name>AnalyticsSystemClient</name> - <value>true</value> + <value>false</value> </right>Проверьте сценарии использования и подтвердите, что отключение не повлияет на пользователей.
108-110: Избегайте изменения проведённых документов интерактивноInteractiveChangeOfPosted=true обычно повышает риски. Включайте только при строгой регламентации.
<right> <name>InteractiveChangeOfPosted</name> - <value>true</value> + <value>false</value> </right>src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбора/Ext/Form.xml (2)
28-29: Лишний AutoRefreshPeriod при AutoRefresh=falseПараметр не используется — можно удалить для чистоты.
- <AutoRefresh>false</AutoRefresh> - <AutoRefreshPeriod>60</AutoRefreshPeriod> + <AutoRefresh>false</AutoRefresh>
38-40: Скрыть корень при выборе только элементовПри ChoiceFoldersAndItems=Items показывать корневую строку не обязательно.
- <ShowRoot>true</ShowRoot> + <ShowRoot>false</ShowRoot> - <AllowRootChoice>false</AllowRootChoice>src/cf/Enums/ТипыЗаданий.xml (1)
41-136: Небольшое выравнивание наименований значенийСмешение однословных и составных «ИндивидуальноеЗадание/ЭкзаменационноеЗадание» vs «Курс/Книга». Если это влияет на сортировку/фильтры, стоит унифицировать стиль (либо все существительные, либо «…Задание» для обучающих активностей).
src/cf/Roles/ИзменениеДатыДокументовИПР/Ext/Rights.xml (1)
7-52: Дублирование клиентских прав КонфигурацииФлаги Thin/Web/MobileClient и режимы окна обычно выносятся в базовую роль доступа. Если такая уже есть, уберите дублирование.
src/cf/Roles/ЧтениеДокументовИПР/Ext/Rights.xml (1)
35-80: Клиентские права Конфигурации — избыточны для роли чтенияАналогично другой роли, лучше централизовать в общей роли.
src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной/Ext/Form/Module.bsl (3)
3-9: Guard: проверять пустой выборДобавьте ранний выход, если ВыбраннаяСтрока = Неопределено.
Правка:
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) - СтандартнаяОбработка = Ложь; - ДобавитьВКорзину(ВыбраннаяСтрока); + СтандартнаяОбработка = Ложь; + Если ВыбраннаяСтрока = Неопределено Тогда Возврат; КонецЕсли; + ДобавитьВКорзину(ВыбраннаяСтрока); КонецПроцедуры
12-23: UX: не переносить пустую корзинуПеред ОповеститьОВыборе проверьте, что МассивСсылок не пуст.
- ОповеститьОВыборе(МассивСсылок); - Закрыть(); + Если МассивСсылок.Количество() > 0 Тогда + ОповеститьОВыборе(МассивСсылок); + Закрыть(); + КонецЕсли;
35-55: DRY: упростить добавление в корзину (единый проход)Логику для массива и одиночного значения можно объединить для читаемости.
Процедура ДобавитьВКорзину(Знач Выбор) - Если ТипЗнч(Выбор) = Тип("Массив") Тогда - Для Каждого СтрДокумент Из Выбор Цикл - Если ЗначениеЗаполнено(СтрДокумент) - И ТипЗнч(СтрДокумент) = Тип("СправочникСсылка.ЗадачиИПР") - И Не СтрДокумент.ЭтоГруппа Тогда - Если Корзина.НайтиСтроки(Новый Структура("ЗаданиеИПР", СтрДокумент)).Количество() = 0 Тогда - НоваяСтрока = Корзина.Добавить(); - НоваяСтрока.ЗаданиеИПР = СтрДокумент; - КонецЕсли; - КонецЕсли; - КонецЦикла; - ИначеЕсли ЗначениеЗаполнено(Выбор) - И ТипЗнч(Выбор) = Тип("СправочникСсылка.ЗадачиИПР") - И Не Выбор.ЭтоГруппа Тогда - Если Корзина.НайтиСтроки(Новый Структура("ЗаданиеИПР", Выбор)).Количество() = 0 Тогда - НоваяСтрока = Корзина.Добавить(); - НоваяСтрока.ЗаданиеИПР = Выбор; - КонецЕсли; - КонецЕсли; + МассивКДобавлению = Новый Массив; + Если ТипЗнч(Выбор) = Тип("Массив") Тогда + МассивКДобавлению = Выбор; + Иначе + МассивКДобавлению.Добавить(Выбор); + КонецЕсли; + Для Каждого Элемент Из МассивКДобавлению Цикл + Если ЗначениеЗаполнено(Элемент) + И ТипЗнч(Элемент) = Тип("СправочникСсылка.ЗадачиИПР") + И Не Элемент.ЭтоГруппа + И Корзина.НайтиСтроки(Новый Структура("ЗаданиеИПР", Элемент)).Количество() = 0 Тогда + НоваяСтрока = Корзина.Добавить(); + НоваяСтрока.ЗаданиеИПР = Элемент; + КонецЕсли; + КонецЦикла; КонецПроцедурыsrc/cf/Roles/ЧтениеЗадачиИПР/Ext/Rights.xml (1)
7-12: Запрет редактирования атрибута — ок, но избыточно при отсутствии UpdateМожно оставить, как явную фиксацию политики. Без Update документ/элемент всё равно не изменится.
src/cf/Documents/ИндивидуальныйПланРазвития.xml (1)
83-121: Индексация ключевых реквизитовДля фильтрации по Сотруднику/Должности/Наставнику имеет смысл включить Indexing=Index (если планируются выборки по ним).
src/cf/Documents/ИндивидуальныйПланРазвития/Templates/МакетПланаГрафика/Ext/Template.xml (1)
17-73: Лишние технические колонки?В шаблоне size=9, но используются 7 колонок по данным. Если 2 колонки не нужны для верстки/полей, уберите их для компактности.
src/cf/Enums/СтатусыЗадачИПР.xml (1)
41-161: Семантика статусов: смешение «изучения» и «выполнения задания»Если статусы участвуют в маршрутизации, подумайте о разбиении на 2 перечисления (процесс изучения vs выполнение задания) или хотя бы упорядочьте значения в порядке прогрессии.
src/cf/Documents/ИндивидуальныйПланРазвития/Ext/ObjectModule.bsl (3)
2-7: Переименуйте функцию для лучшей читаемостиРекомендую использовать более ясное название функции, например
ПолучитьВыполненныеСтатусы()илиПолучитьИсключаемыеСтатусы(), чтобы было понятнее её назначение.
12-32: Избыточные поля в запросе при копированииВ запросе выбираются поля
Ссылка.ДатаиСсылка, которые не используются при заполнении свойств объекта. Рекомендую удалить неиспользуемые поля из запроса.Запрос.Текст = "ВЫБРАТЬ | ИндивидуальныйПланРазвитияПланГрафик.ЗаданиеИПР КАК ЗаданиеИПР, | ИндивидуальныйПланРазвитияПланГрафик.Статус КАК Статус, | ИндивидуальныйПланРазвитияПланГрафик.ДатаНачала КАК ДатаНачала, | ИндивидуальныйПланРазвитияПланГрафик.ПлановоеВремя КАК ПлановоеВремя, | ИндивидуальныйПланРазвитияПланГрафик.ФактическоеВремя КАК ФактическоеВремя, | ИндивидуальныйПланРазвитияПланГрафик.Комментарий КАК Комментарий, | ИндивидуальныйПланРазвитияПланГрафик.Ссылка.Сотрудник КАК Сотрудник, | ИндивидуальныйПланРазвитияПланГрафик.Ссылка.ДатаНачала КАК ДатаНачала1, | ИндивидуальныйПланРазвитияПланГрафик.Ссылка.ДатаОкончания КАК ДатаОкончания, | ИндивидуальныйПланРазвитияПланГрафик.Ссылка.Наставник КАК Наставник, - | ИндивидуальныйПланРазвитияПланГрафик.Ссылка.Должность КАК Должность, - | ИндивидуальныйПланРазвитияПланГрафик.Ссылка.Дата КАК Дата, - | ИндивидуальныйПланРазвитияПланГрафик.Ссылка КАК Ссылка + | ИндивидуальныйПланРазвитияПланГрафик.Ссылка.Должность КАК Должность |ИЗ | Документ.ИндивидуальныйПланРазвития.ПланГрафик КАК ИндивидуальныйПланРазвитияПланГрафик |ГДЕ | НЕ ИндивидуальныйПланРазвитияПланГрафик.Статус В (&Статус) | И ИндивидуальныйПланРазвитияПланГрафик.Ссылка = &Ссылка";
126-126: Использование устаревшего метода вывода сообщенийМетод
ОбщегоНазначения.СообщитьПользователю()может быть устаревшим. Рекомендую использовать стандартный метод платформы.- ОбщегоНазначения.СообщитьПользователю("Задания в документе не должны дублироваться"); + Сообщение = Новый СообщениеПользователю; + Сообщение.Текст = "Задания в документе не должны дублироваться"; + Сообщение.Поле = "ПланГрафик"; + Сообщение.УстановитьДанные(ЭтотОбъект); + Сообщение.Сообщить();src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной/Ext/Form.xml (1)
220-220: Потенциальная проблема производительностиУсловие
НЕ СправочникЗадачиИПР.Родитель = ЗНАЧЕНИЕ(Справочник.ЗадачиИПР.ПустаяСсылка)в запросе может быть неэффективным. Рекомендую использовать более оптимальный вариант.- НЕ СправочникЗадачиИПР.Родитель = ЗНАЧЕНИЕ(Справочник.ЗадачиИПР.ПустаяСсылка)</QueryText> + СправочникЗадачиИПР.Родитель <> ЗНАЧЕНИЕ(Справочник.ЗадачиИПР.ПустаяСсылка)</QueryText>src/cf/Catalogs/ЗадачиИПР/Forms/ФормаЭлемента/Ext/Form.xml (3)
44-55: Кнопку «Открыть ссылку» лучше блокировать при пустом URLЧтобы избежать ошибок открытия пустой/некорректной ссылки, стоит управлять доступностью кнопки на клиенте.
Пример (модуль формы элемента ЗадачиИПР):
&НаКлиенте Процедура ГиперссылкаПриИзменении(Элемент) Элементы.ОткрытьСсылку.Доступность = ЗначениеЗаполнено(Объект.Гиперссылка); КонецПроцедуры &НаКлиенте Процедура ПриОткрытии(Отказ) Элементы.ОткрытьСсылку.Доступность = ЗначениеЗаполнено(Объект.Гиперссылка); КонецПроцедуры
10-10: Убрать лишний ExtendedEditMultipleValues у одиночных полейДля обычных скалярных реквизитов эта опция не даёт пользы и засоряет метаданные.
Предлагаемый diff:
- <ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>Also applies to: 17-17, 24-24, 47-47, 61-61, 68-68, 75-75
28-41: Нейминг заголовка группыСейчас заголовок «Группа ссылка», но ShowTitle=false, плюс пробел в имени. Если заголовок не показывается, можно либо убрать Title, либо унифицировать на «Ссылка».
src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента/Ext/Form/Module.bsl (3)
105-107: Микронид: убрать лишнее создание ТЗДвойное присваивание избыточно.
- Тз = Новый ТаблицаЗначений; - Тз = Объект.ПланГрафик.Выгрузить();
218-221: Обработка пустого выбора задачЕсли пользователь закрыл форму без выбора, лучше проверять и на пустую коллекцию.
- Если ВыбранныеЭлементы = Неопределено Тогда + Если ВыбранныеЭлементы = Неопределено ИЛИ ВыбранныеЭлементы.Количество() = 0 Тогда Возврат КонецЕсли;
174-180: Синхронизация производных реквизитов при изменении периодаПосле смены периода даты объекта обновляются, но наставник/должность не пересчитываются.
Процедура ПериодПриИзменении(Элемент) Объект.ДатаНачала = Период.ДатаНачала; Объект.ДатаОкончания = Период.ДатаОкончания; + ЗаполнитьНаставника(); + ЗаполнитьДолжность(Объект.Сотрудник, Объект.ДатаНачала); КонецПроцедурыsrc/cf/InformationRegisters/ВыполнениеЗаданийИПР.xml (2)
67-110: Точность ресурса «Время»0 знаков после запятой ограничивает учёт только целыми часами. Для практики (минуты/0.25 ч) обычно нужны 1–2 знака.
- <v8:FractionDigits>0</v8:FractionDigits> + <v8:FractionDigits>2</v8:FractionDigits>
150-235: Индексация и отборыЕсть поотдельности индексы на измерениях, но для частых выборок/агрегаций по паре (Сотрудник, Задание) может пригодиться составной индекс на регистр.
Готов предложить патч с добавлением раздела с составным индексом, если подтвердите сценарии запросов.
src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента/Ext/Form.xml (6)
151-154: Drag без Drop бесполезен — включите EnableDropСейчас включён только перенос, но не «приземление», из‑за чего перетаскивание строк ТЧ может не работать.
<AutoInsertNewRow>true</AutoInsertNewRow> <EnableStartDrag>true</EnableStartDrag> <EnableDrag>true</EnableDrag> + <EnableDrop>true</EnableDrop>
12-18: Номер документа обычно не редактируется вручнуюЕсли нумерация автоматическая, лучше запретить ручное редактирование.
<InputField name="Номер" id="1"> <DataPath>Объект.Number</DataPath> <EditMode>EnterOnInput</EditMode> - <ExtendedEditMultipleValues>true</ExtendedEditMultipleValues> + <ReadOnly>true</ReadOnly>
14-16: Отключите «ExtendedEditMultipleValues» у скалярных полейДля Номер/Дата/Сотрудник/Наставник/Должность/Период множественное редактирование не требуется и только шумит в UI.
Пример для пары полей:
- <ExtendedEditMultipleValues>true</ExtendedEditMultipleValues> + <ExtendedEditMultipleValues>false</ExtendedEditMultipleValues>Аналогично для перечисленных контролов в указанных строках.
Also applies to: 21-23, 45-46, 54-56, 63-66, 89-91
27-38: Тексты заголовков/подсказок выглядят служебно («Группа …»)Пользователям понятнее «Сотрудники» и «Даты/Период».
- <v8:content>Группа сотрудники</v8:content> + <v8:content>Сотрудники</v8:content> ... - <v8:content>Группа даты</v8:content> + <v8:content>Даты</v8:content>Also applies to: 72-85
3-5: Переобработка при записи может быть тяжёлойRepostOnWrite=true при объёмной ТЧ вызовет лишние перепроведения. Убедитесь, что это действительно нужно (например, если данные регистров зависят от реквизитов, меняющихся до проведения), иначе отключите.
Опционально:
- <RepostOnWrite>true</RepostOnWrite> + <RepostOnWrite>false</RepostOnWrite>
239-246: Формат и вычисление «ПлановоеВремя»Поле read-only — ок. Убедитесь, что формат отображения задан (часы.мин) и значение пересчитывается при изменении «ЗаданиеИПР»/«ДатаНачала».
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (31)
src/cf/Catalogs/ЗадачиИПР.xml(1 hunks)src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбора.xml(1 hunks)src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбора/Ext/Form.xml(1 hunks)src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной.xml(1 hunks)src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной/Ext/Form.xml(1 hunks)src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной/Ext/Form/Module.bsl(1 hunks)src/cf/Catalogs/ЗадачиИПР/Forms/ФормаЭлемента.xml(1 hunks)src/cf/Catalogs/ЗадачиИПР/Forms/ФормаЭлемента/Ext/Form.xml(1 hunks)src/cf/Catalogs/ЗадачиИПР/Forms/ФормаЭлемента/Ext/Form/Module.bsl(1 hunks)src/cf/Configuration.xml(4 hunks)src/cf/Documents/ИндивидуальныйПланРазвития.xml(1 hunks)src/cf/Documents/ИндивидуальныйПланРазвития/Ext/ObjectModule.bsl(1 hunks)src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента.xml(1 hunks)src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента/Ext/Form.xml(1 hunks)src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента/Ext/Form/Module.bsl(1 hunks)src/cf/Documents/ИндивидуальныйПланРазвития/Templates/МакетПланаГрафика.xml(1 hunks)src/cf/Documents/ИндивидуальныйПланРазвития/Templates/МакетПланаГрафика/Ext/Template.xml(1 hunks)src/cf/Enums/СтатусыЗадачИПР.xml(1 hunks)src/cf/Enums/ТипыЗаданий.xml(1 hunks)src/cf/InformationRegisters/ВыполнениеЗаданийИПР.xml(1 hunks)src/cf/Roles/ИзменениеДатыДокументовИПР.xml(1 hunks)src/cf/Roles/ИзменениеДатыДокументовИПР/Ext/Rights.xml(1 hunks)src/cf/Roles/ИзменениеДокументовИПР.xml(1 hunks)src/cf/Roles/ИзменениеДокументовИПР/Ext/Rights.xml(1 hunks)src/cf/Roles/ИзменениеЗадачиИПР.xml(1 hunks)src/cf/Roles/ИзменениеЗадачиИПР/Ext/Rights.xml(1 hunks)src/cf/Roles/ЧтениеДокументовИПР.xml(1 hunks)src/cf/Roles/ЧтениеДокументовИПР/Ext/Rights.xml(1 hunks)src/cf/Roles/ЧтениеЗадачиИПР.xml(1 hunks)src/cf/Roles/ЧтениеЗадачиИПР/Ext/Rights.xml(1 hunks)src/cf/Subsystems/УчетРазвитияСотрудников.xml(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-08-27T08:04:55.898Z
Learnt from: Sidorovaa90
PR: firstBitSportivnaya/PDM#44
File: src/cf/Roles/ЧтениеЗадачиИПР.xml:3-14
Timestamp: 2025-08-27T08:04:55.898Z
Learning: В 1C права доступа предоставляются на объекты метаданных (справочники, документы, регистры и т.д.) и команды, а не на формы отдельно. Формы наследуют права доступа от соответствующих объектов метаданных, с которыми они работают. Не нужно добавлять отдельные права типа Form.* в файлы Rights.xml.
Applied to files:
src/cf/Roles/ИзменениеДокументовИПР/Ext/Rights.xmlsrc/cf/Roles/ИзменениеДатыДокументовИПР/Ext/Rights.xmlsrc/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента.xmlsrc/cf/Roles/ЧтениеДокументовИПР/Ext/Rights.xmlsrc/cf/Roles/ИзменениеЗадачиИПР/Ext/Rights.xml
🔇 Additional comments (33)
src/cf/Roles/ИзменениеЗадачиИПР/Ext/Rights.xml (3)
1-5: Настройка матрицы прав: OKБазовые флаги (setForNewObjects=false, setForAttributesByDefault=true) выставлены корректно для дальнейшего уточнения прав по атрибутам.
54-91: Каталог ЗадачиИПР: CRUD подобран щадящеЕсть Read/Insert/Update, без Delete (только пометка/снятие). Это безопасно. Убедитесь, что не требуются InteractiveDelete/Deletion (жёсткое удаление) по бизнес‑процессу.
1-91: Несоответствие с AI‑резюмеВ резюме упомянуты права на Document.ИндивидуальныйПланРазвития, но в файле их нет. Если документ редактировать из этой роли не требуется — всё ок; если требуется — добавьте соответствующий объект.
src/cf/Roles/ИзменениеЗадачиИПР.xml (1)
3-14: Метаданные роли оформлены корректноИменование и синоним соответствуют назначению. Не замечено проблем.
src/cf/Documents/ИндивидуальныйПланРазвития/Templates/МакетПланаГрафика.xml (1)
3-15: Шаблон табличного документа: OKТип SpreadsheetDocument указан, синоним задан. Дальнейшая логика/разметка — в Ext/Template.xml.
src/cf/Roles/ЧтениеЗадачиИПР.xml (1)
3-14: Роль чтения: проверьте соответствующий Rights.xmlУбедитесь, что для роли настроен Ext/Rights.xml строго с правами Read/View без Interactive* и Update/Insert для Catalog.ЗадачиИПР и сопутствующих объектов.
src/cf/Catalogs/ЗадачиИПР/Forms/ФормаЭлемента.xml (1)
3-19: Проверка формы элемента по умолчанию
Убедитесь, что в метаданных каталога ЗадачиИПР свойство DefaultObjectForm указывает на Form.ФормаЭлемента и отсутствуют дублирующие формы по умолчанию.src/cf/Subsystems/УчетРазвитияСотрудников.xml (1)
21-25: Дубликатов не обнаружено — оставьте как есть
Проверкой подтверждено, чтоDocument.ИндивидуальныйПланРазвития,Catalog.ЗадачиИПРиInformationRegister.ВыполнениеЗаданийИПРвстречаются только вsrc/cf/Subsystems/УчетРазвитияСотрудников.xmlи не дублируются в других подсистемах.src/cf/Roles/ЧтениеДокументовИПР.xml (1)
3-13: Роль описана корректноИмя, синоним и общая структура соответствуют стандарту MDClasses.
src/cf/Roles/ИзменениеДокументовИПР.xml (1)
3-13: Роль оформлена корректноСтруктура и атрибуты роли соответствуют требованиям конфигурации.
src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента.xml (1)
3-20: Добавление формы документа выглядит корректноИмя/синоним/типы использования заданы ожидаемо.
src/cf/Roles/ИзменениеДокументовИПР/Ext/Rights.xml (1)
2-5: Права на формы (Form.*) отсутствуют. grep не выявил упоминаний<name>Form.в каталоге src/cf/Roles.src/cf/Configuration.xml (3)
1653-1653: Добавленные объекты (каталог, документ, перечисления, РС) корректно подключены в конфигурациюНовые сущности видны в ChildObjects и соответствуют целям PR.
Also applies to: 1659-1659, 1728-1730, 1881-1881
920-924: Проверено: для всех новых рол ролей присутствуют файлы метаданных и права
1881-1881: Дубликатов регистрации «ВыполнениеЗаданийИПР» не найдено — командаrgвернула ровно одну строку.src/cf/Enums/ТипыЗаданий.xml (1)
19-39: OK: настройки перечисления выглядят корректноQuickChoice= true, ChoiceMode=BothWays, стандартные команды отключены — всё по делу.
src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной/Ext/Form/Module.bsl (1)
25-33: OK: обработка DnD отключает стандартную — всё верноСценарий перетаскивания реализован корректно.
src/cf/Documents/ИндивидуальныйПланРазвития.xml (2)
66-81: Привилегированный режим проведения — нужна ли эскалация?PostInPrivilegedMode/UnpostInPrivilegedMode=true повышают права. Если нет блокировок/регламентов, требующих этого, лучше отключить.
78-81: Несогласованность DataHistory на уровне объекта/атрибутовУ объекта DataHistory=DontUse, у атрибутов — Use. Уточните целевую политику и выровняйте (обычно управляющее — на уровне объекта).
Also applies to: 118-121, 160-162, 202-204, 242-243, 281-282, 343-346, 380-381, 420-421, 462-463, 505-506, 545-546
src/cf/Documents/ИндивидуальныйПланРазвития/Templates/МакетПланаГрафика/Ext/Template.xml (1)
74-155: Шапка и привязки параметров — выглядит консистентноРазметка заголовков/параметров корректна.
src/cf/Enums/СтатусыЗадачИПР.xml (1)
19-39: OK: настройки перечисления и режим выбораQuickChoice/ChoiceMode выставлены разумно.
src/cf/Documents/ИндивидуальныйПланРазвития/Ext/ObjectModule.bsl (2)
46-48: Возможный баг: потеря данных при неправильной инициализацииИспользование
Неопределенодля полей даты может привести к ошибкам при дальнейшей обработке. Рекомендую устанавливать пустую дату или текущую дату в зависимости от бизнес-логики.- ЭтотОбъект.Дата = Неопределено; - ЭтотОбъект.ДатаОкончания = Неопределено; + ЭтотОбъект.Дата = Дата(1,1,1); + ЭтотОбъект.ДатаОкончания = Дата(1,1,1);
93-93: Удалить комментарий: соответствие полей корректноРегистровое измерение действительно называется «Задание», а в запросе для удобства ему присвоен псевдоним «ЗаданиеИПР». В строке
Движение.Задание = ВыборкаДетальныеЗаписи.ЗаданиеИПР;правильно сопоставляются поле регистра и колонка выборки.
Likely an incorrect or invalid review comment.
src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной/Ext/Form.xml (1)
119-139: Избыточные исключения командДля таблицы "Корзина" исключено множество стандартных команд. Рекомендую проверить, действительно ли все эти исключения необходимы, особенно
DeleteиMoveUp/MoveDown, которые могут быть полезны для управления содержимым корзины.src/cf/Catalogs/ЗадачиИПР.xml (2)
1-264: Хорошо структурированный справочникСправочник ЗадачиИПР корректно настроен с иерархической структурой, автонумерацией и необходимыми атрибутами. Настройки поиска и представления объектов выглядят оптимальными.
140-140: Опечатка в синониме атрибутаВ синониме атрибута "ПлановыйТайминг" указано "(минуты)", но тип поля - число без дробной части. Убедитесь, что единица измерения соответствует бизнес-логике.
src/cf/Catalogs/ЗадачиИПР/Forms/ФормаЭлемента/Ext/Form.xml (1)
1-106: Структура формы и биндинги выглядят корректноБазовые реквизиты (Код, Наименование, Родитель) и атрибуты предметной области (Гиперссылка, ПлановыйТайминг, Тип, Компетенция) привязаны ожидаемо. Команда «Открыть ссылку» объявлена в секции Commands.
src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента/Ext/Form/Module.bsl (2)
91-94: Смена наставника очищает сотрудника — это точно нужно?Обычно наставник зависит от сотрудника, а не наоборот. Очищение Сотрудника при изменении Наставника может ломать сценарий ввода.
Нужна подтверждённая бизнес-правилами мотивация. Если это не требование, лучше убрать очистку.
30-33: Страхуемся от отсутствующих элементов формыИмена «Дата» и «ПланГрафикФактическоеВремя» могут отличаться от фактических. Использовать Элементы.Найти(...) безопаснее (см. правку выше).
src/cf/InformationRegisters/ВыполнениеЗаданийИПР.xml (2)
49-65: Единообразие истории данныхВерхнеуровневое DataHistory="DontUse", но у ресурса/атрибута — "Use". Это может путать сопровождение.
Уточните, нужна ли история изменений по отдельным полям. При отсутствии требований лучше унифицировать на DontUse для всего регистра.
Also applies to: 106-109, 146-148
1-65: В целом регистр задан корректноСтруктура (измерения: Сотрудник, Задание; ресурс: Время; атрибут интеграции: ПометкаОтправки) и режим записи RecorderSubordinate соответствуют назначению.
Also applies to: 150-235
src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента/Ext/Form.xml (2)
351-361: LGTM: типы ссылок на справочник/перечисление корректныПривязка «ЗаданиеИПР» к CatalogRef.ЗадачиИПР и «Статус» к EnumRef.СтатусыЗадачИПР выглядит корректно.
Also applies to: 362-372
8-10: Проверено: все указанные процедуры и команда «ПодборЗадач» присутствуют в Module.bsl
There was a problem hiding this comment.
Лишний пробел в пользовательском синониме
Видимый текст с пробелом на конце смотрится как опечатка.
<v8:item>
<v8:lang>ru</v8:lang>
- <v8:content>Форма выбора </v8:content>
+ <v8:content>Форма выбора</v8:content>
</v8:item>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <Synonym> | |
| <v8:item> | |
| <v8:lang>ru</v8:lang> | |
| <v8:content>Форма выбора </v8:content> | |
| </v8:item> | |
| </Synonym> | |
| <Synonym> | |
| <v8:item> | |
| <v8:lang>ru</v8:lang> | |
| <v8:content>Форма выбора</v8:content> | |
| </v8:item> | |
| </Synonym> |
🤖 Prompt for AI Agents
In src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбора.xml around lines 6 to 11 the
user-visible synonym value contains a trailing space ("Форма выбора "); remove
the trailing whitespace inside the <v8:content> element so it reads "Форма
выбора" to avoid the typo-like extra space; ensure no other locale entries have
similar trailing spaces.
There was a problem hiding this comment.
💡 Verification agent
🧩 Analysis chain
Форма помечена как «НЕ ИСПОЛЬЗУЕТСЯ» — убрать или исключить из поставки
Если форма реально не используется, лучше удалить, чтобы не раздувать конфигурацию и не путать пользователей; минимум — снять MobilePurpose и скрыть из интерфейса.
Для проверки используемости выполните поиск ссылок на форму:
🏁 Script executed:
#!/bin/bash
rg -nP -C2 'ФормаВыбораСКорзиной|Form\.ФормаВыбораСКорзиной|ФормаВыбораСКорзиной/Ext' --type-add 'xml:*.xml' --type xmlLength of output: 727
Удалить упоминание формы из каталога и сам файл или убрать пометку «НЕ ИСПОЛЬЗУЕТСЯ»
В файле src/cf/Catalogs/ЗадачиИПР.xml на строке 260 всё ещё есть <Form>ФормаВыбораСКорзиной</Form>. Если форма не используется, удалите этот элемент и файл src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной.xml. Если форма нужна — уберите <Comment>НЕ ИСПОЛЬЗУЕТСЯ</Comment> и соответствующий MobilePlatformApplication.
🤖 Prompt for AI Agents
In src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной.xml around lines 12-19
and in src/cf/Catalogs/ЗадачиИПР.xml at line 260, decide whether the form is
unused or required: if unused, remove the <Form>ФормаВыбораСКорзиной</Form>
entry from ЗадачиИПР.xml (line ~260) and delete the file
src/cf/Catalogs/ЗадачиИПР/Forms/ФормаВыбораСКорзиной.xml; if the form is needed,
edit the form file to remove the <Comment>НЕ ИСПОЛЬЗУЕТСЯ</Comment> node and
remove the MobilePlatformApplication value from the <UsePurposes> block so the
form remains registered correctly.
There was a problem hiding this comment.
🛠️ Refactor suggestion
Открытие ссылки выполняется на сервере — ссылка откроется на стороне сервера, а не у пользователя
Вызывайте открытие URL на клиенте и используйте профильную функцию вместо ЗапуститьПриложение.
-&НаСервере
-Процедура ОткрытьСсылкуВБраузере()
+&НаКлиенте
+Процедура ОткрытьСсылкуВБраузере()
- Гиперссылка = Объект.Гиперссылка;
+ Гиперссылка = Объект.Гиперссылка;
Если ПустаяСтрока(Объект.Гиперссылка) Тогда
ОбщегоНазначения.СообщитьПользователю("Ссылка не указана.");
Возврат;
КонецЕсли;
Лок = НРег(Гиперссылка);
Если НЕ СтрНачинаетсяС(Лок, "http://") И НЕ СтрНачинаетсяС(Лок, "https://") Тогда
Гиперссылка = "https://" + Гиперссылка;
КонецЕсли;
Попытка
- ЗапуститьПриложение(Гиперссылка);
- // Игнорирую замечания Rabbit тут, не существует процедуры ОткрытьВнешнююСсылку
+ ОткрытьURL(Гиперссылка);
Исключение
ОбщегоНазначения.СообщитьПользователю("Не удалось открыть ссылку: " + ОписаниеОшибки());
КонецПопытки;Дополнительно: при желании можно нормализовать пробелы (например, заменить пробелы/табуляции в начале/конце) и явно ограничить допустимые схемы (http/https).
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| &НаСервере | |
| Процедура ОткрытьСсылкуВБраузере() | |
| Гиперссылка = Объект.Гиперссылка; | |
| Если ПустаяСтрока(Объект.Гиперссылка) Тогда | |
| ОбщегоНазначения.СообщитьПользователю("Ссылка не указана."); | |
| Возврат; | |
| КонецЕсли; | |
| Лок = НРег(Гиперссылка); | |
| Если НЕ СтрНачинаетсяС(Лок, "http://") И НЕ СтрНачинаетсяС(Лок, "https://") Тогда | |
| Гиперссылка = "https://" + Гиперссылка; | |
| КонецЕсли; | |
| Попытка | |
| ЗапуститьПриложение(Гиперссылка); | |
| // Игнорирую замечания Rabbit тут, не существует процедуры ОткрытьВнешнююСсылку | |
| Исключение | |
| ОбщегоНазначения.СообщитьПользователю("Не удалось открыть ссылку: " + ОписаниеОшибки()); | |
| КонецПопытки; | |
| КонецПроцедуры | |
| &НаКлиенте | |
| Процедура ОткрытьСсылкуВБраузере() | |
| Гиперссылка = Объект.Гиперссылка; | |
| Если ПустаяСтрока(Гиперссылка) Тогда | |
| ОбщегоНазначения.СообщитьПользователю("Ссылка не указана."); | |
| Возврат; | |
| КонецЕсли; | |
| Лок = НРег(Гиперссылка); | |
| Если НЕ СтрНачинаетсяС(Лок, "http://") И НЕ СтрНачинаетсяС(Лок, "https://") Тогда | |
| Гиперссылка = "https://" + Гиперссылка; | |
| КонецЕсли; | |
| Попытка | |
| ОткрытьURL(Гиперссылка); | |
| Исключение | |
| ОбщегоНазначения.СообщитьПользователю( | |
| "Не удалось открыть ссылку: " + ОписаниеОшибки() | |
| ); | |
| КонецПопытки; | |
| КонецПроцедуры |
🤖 Prompt for AI Agents
In src/cf/Catalogs/ЗадачиИПР/Forms/ФормаЭлемента/Ext/Form/Module.bsl around
lines 7–31, the current routine opens the URL on the server
(ЗапуститьПриложение) which won't open it for the user; move the logic to the
client and replace ЗапуститьПриложение with the client/profile API for opening
external links. Implement a client-side procedure that trims the hyperlink,
validates it's not empty, restricts schemes to http/https, normalizes by
prepending "https://" if no allowed scheme present, and then calls the
profile/client function to open the external link; on failure show a
user-friendly message with the error. Ensure the server-side procedure (if still
present) only delegates to the client (client call) and does not attempt to open
the browser itself.
There was a problem hiding this comment.
🛠️ Refactor suggestion
Проверки дат: начало/окончание документа и строк ТЧ
Добавьте в модуле объекта валидацию: ДатаНачала ≤ ДатаОкончания документа; в ТЧ — дата строки внутри интервала документа.
В модуле объекта (Ext/ObjectModule.bsl):
Процедура ПередЗаписью(Отказ, РежимЗаписи)
Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания)
И ДатаНачала > ДатаОкончания Тогда
Сообщить("Дата начала больше даты окончания.", СтатусСообщения.Важно);
Отказ = Истина;
Возврат;
КонецЕсли;
Для Каждого Строка Из ПланГрафик Цикл
Если ЗначениеЗаполнено(Строка.ДатаНачала) Тогда
Если ЗначениеЗаполнено(ДатаНачала) И Строка.ДатаНачала < ДатаНачала Тогда
Сообщить("Дата начала задания выходит за границы ИПР.", СтатусСообщения.Важно);
Отказ = Истина; Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(ДатаОкончания) И Строка.ДатаНачала > ДатаОкончания Тогда
Сообщить("Дата начала задания выходит за границы ИПР.", СтатусСообщения.Важно);
Отказ = Истина; Возврат;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры🤖 Prompt for AI Agents
In src/cf/Documents/ИндивидуальныйПланРазвития.xml lines 123-205: add
server-side validation in the object module (Ext/ObjectModule.bsl) in
ПередЗаписью to ensure document-level ДатаНачала ≤ ДатаОкончания and to validate
each row of the ПланГрафик tabular section has its ДатаНачала inside the
document interval; when invalid, call Сообщить with the provided Russian
messages, set Отказ = Истина and return; implement checks only when
corresponding dates are filled (use ЗначениеЗаполнено) and compare using
standard date comparisons to reject saves that violate the constraints.
There was a problem hiding this comment.
🛠️ Refactor suggestion
Запрет отрицательных значений для длительностей
Для минут «Плановое/Фактическое время» отрицательные значения нелогичны. Ограничьте знак.
- <v8:AllowedSign>Any</v8:AllowedSign>
+ <v8:AllowedSign>Nonnegative</v8:AllowedSign>(при желании дополнительно задайте MinValue=0)
Also applies to: 475-482
🤖 Prompt for AI Agents
In src/cf/Documents/ИндивидуальныйПланРазвития.xml around lines 433-441 (and
also apply the same change to 475-482), the numeric type for minutes currently
allows negative values (v8:AllowedSign is "Any"); change v8:AllowedSign to a
non-negative option (e.g., "NonNegative" or the schema's equivalent) to forbid
negative durations, and optionally add an explicit MinValue="0" qualifier
element or attribute if supported by the schema so values cannot be less than
zero.
There was a problem hiding this comment.
UI-свойства нельзя менять на сервере — перевести логику на клиент
В УстановитьВидимостьДоступность() и ЗаполнитьНаставника() на сервере изменяются свойства формы/элементов (ЭтаФорма.ТолькоПросмотр, Элементы.*). Это приведёт к ошибкам в управляемом приложении.
Правка (ключевые части):
-&НаСервере
-Процедура УстановитьВидимостьДоступность();
+&НаКлиенте
+Процедура УстановитьВидимостьДоступность()
Если Пользователи.РолиДоступны("ИзменениеДокументовИПР") Тогда
ЭтаФорма.ТолькоПросмотр = Ложь;
ИначеЕсли Пользователи.РолиДоступны("ИзменениеДатыДокументовИПР") Тогда
ЭтаФорма.ТолькоПросмотр = Истина;
- Элементы.Период.ТолькоПросмотр = Ложь;
- Элементы.Дата.ТолькоПросмотр = Ложь;
- Элементы.ПланГрафикФактическоеВремя.ТолькоПросмотр = Ложь;
+ Если Элементы.Найти("Период") <> Неопределено Тогда Элементы.Период.ТолькоПросмотр = Ложь; КонецЕсли;
+ Если Элементы.Найти("Дата") <> Неопределено Тогда Элементы.Дата.ТолькоПросмотр = Ложь; КонецЕсли;
+ Если Элементы.Найти("ПланГрафикФактическоеВремя") <> Неопределено Тогда Элементы.ПланГрафикФактическоеВремя.ТолькоПросмотр = Ложь; КонецЕсли;
Иначе
ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедурыИ убрать серверный доступ к элементам из ЗаполнитьНаставника():
- Если ЗначениеЗаполнено(Объект.Наставник) Тогда
- Элементы.Наставник.Видимость = Истина;
- КонецЕсли;Вызывать УстановитьВидимостьДоступность() на клиенте (см. правку ПриОткрытии ниже).
Also applies to: 45-47
There was a problem hiding this comment.
@ coderabbitai Изменение свойств элементов формы на сервере не вызывает ошибок. Наоборот в некоторых версиях платформы изменение некоторых свойств элементов делает неявные вызовы сервера для перерисовки формы.
There was a problem hiding this comment.
@Sidorovaa90, спасибо за уточнение! Вы правы — в 1C:Enterprise изменение свойств элементов управляемой формы на сервере является допустимым и не вызывает ошибок. Принимаю вашу поправку о том, что платформа корректно обрабатывает такие изменения, и в некоторых версиях даже выполняет неявные серверные вызовы для перерисовки формы.
Моё первоначальное замечание было некорректным. Код в процедуре УстановитьВидимостьДоступность() реализован правильно.
✏️ Learnings added
Learnt from: Sidorovaa90
PR: firstBitSportivnaya/PDM#45
File: src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента/Ext/Form/Module.bsl:23-37
Timestamp: 2025-09-30T12:35:36.948Z
Learning: В 1C:Enterprise (BSL) изменение свойств элементов управляемой формы (например, ТолькоПросмотр, Видимость) на сервере через контекст &НаСервере является допустимым и не вызывает ошибок. В некоторых версиях платформы изменение определённых свойств элементов может вызывать неявные обращения к серверу для перерисовки формы.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
There was a problem hiding this comment.
🛠️ Refactor suggestion
Исправить заголовок блока и окраску строк: параметр заполняется не той областью, цвет задаётся после вывода
Сейчас БлокЗадания присваивается в область «Строка», а выводится «Шапка»; также цвет выставляется после вывода строки и не сработает.
Предлагаемый diff:
- Область = Макет.ПолучитьОбласть("ОбластьСтрока");
- Область.Параметры.БлокЗадания = Выборка.Блок;
- Выборка.Сбросить();
- ПланГрафикТабличныйДокумент.Вывести(ОбластьШапки);
+ Область = Макет.ПолучитьОбласть("ОбластьСтрока");
+ ОбластьШапки.Параметры.БлокЗадания = Выборка.Блок;
+ Выборка.Сбросить();
+ ПланГрафикТабличныйДокумент.Вывести(ОбластьШапки);
Пока Выборка.Следующий() Цикл
ЗаполнитьЗначенияСвойств(Область.Параметры, Выборка);
Область.Параметры.ДатаНачала = Формат(Выборка.ДатаНачала, "ДФ=dd.MM.yyyy");
- ПланГрафикТабличныйДокумент.Вывести(Область);
- Если Выборка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗадачИПР.ЗаданиеВыполненоНеудовлетворительно") ИЛИ
- Выборка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗадачИПР.ЗаданиеВыполненоУдовлетворительно") Тогда
- ПланГрафикТабличныйДокумент.Область("ОбластьСтрока").ЦветФона = WebЦвета.БледноЗеленый;
- Иначе
- ПланГрафикТабличныйДокумент.Область("ОбластьСтрока").ЦветФона = WebЦвета.Белый;
- КонецЕсли;
+ Если Выборка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗадачИПР.ЗаданиеВыполненоНеудовлетворительно")
+ ИЛИ Выборка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗадачИПР.ЗаданиеВыполненоУдовлетворительно") Тогда
+ Область.ЦветФона = WebЦвета.БледноЗеленый;
+ Иначе
+ Область.ЦветФона = WebЦвета.Белый;
+ КонецЕсли;
+ ПланГрафикТабличныйДокумент.Вывести(Область);
Область.Параметры.БлокЗадания = Неопределено;There was a problem hiding this comment.
Права шире, чем заявленная роль; сузить до редактирования даты
Для роли «Изменение даты…» не нужны Posting/InteractivePosting/… и общий Edit для документа. Дайте минимально: Read/View/Update по документу и Edit только для StandardAttribute.Date. При необходимости — InteractiveChangeOfPosted=true (точечно).
Пример правки:
- <object>
- <name>Document.ИндивидуальныйПланРазвития</name>
- <right><name>Read</name><value>true</value></right>
- <right><name>Update</name><value>true</value></right>
- <right><name>Posting</name><value>true</value></right>
- <right><name>View</name><value>true</value></right>
- <right><name>Edit</name><value>true</value></right>
- <right><name>InteractivePosting</name><value>true</value></right>
- <right><name>InteractivePostingRegular</name><value>true</value></right>
- <right><name>InteractiveChangeOfPosted</name><value>true</value></right>
- <right><name>InputByString</name><value>true</value></right>
- </object>
+ <object>
+ <name>Document.ИндивидуальныйПланРазвития</name>
+ <right><name>Read</name><value>true</value></right>
+ <right><name>View</name><value>true</value></right>
+ <right><name>Update</name><value>true</value></right>
+ <!-- включайте следующую строку только если нужно менять дату у проведённых -->
+ <!-- <right><name>InteractiveChangeOfPosted</name><value>true</value></right> -->
+ </object>
+ <object>
+ <name>Document.ИндивидуальныйПланРазвития.StandardAttribute.Date</name>
+ <right><name>Edit</name><value>true</value></right>
+ </object>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <name>Document.ИндивидуальныйПланРазвития</name> | |
| <right> | |
| <name>Read</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>Update</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>Posting</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>View</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>Edit</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>InteractivePosting</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>InteractivePostingRegular</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>InteractiveChangeOfPosted</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>InputByString</name> | |
| <value>true</value> | |
| </right> | |
| </object> | |
| <object> | |
| <name>Document.ИндивидуальныйПланРазвития</name> | |
| <right><name>Read</name><value>true</value></right> | |
| <right><name>View</name><value>true</value></right> | |
| <right><name>Update</name><value>true</value></right> | |
| <!-- включайте следующую строку только если нужно менять дату у проведённых --> | |
| <!-- <right><name>InteractiveChangeOfPosted</name><value>true</value></right> --> | |
| </object> | |
| <object> | |
| <name>Document.ИндивидуальныйПланРазвития.StandardAttribute.Date</name> | |
| <right><name>Edit</name><value>true</value></right> | |
| </object> |
🤖 Prompt for AI Agents
В файле src/cf/Roles/ИзменениеДатыДокументовИПР/Ext/Rights.xml около строк 54–91
права для Document.ИндивидуальныйПланРазвития заданы слишком широко; замените
набор прав так: оставить только Read, View и Update на сам документ; убрать
Posting, InteractivePosting, InteractivePostingRegular, Edit (глобальный для
документа) и InputByString если не нужен; добавить право Edit исключительно для
StandardAttribute.Date (точечное право на атрибут даты); при действительно
необходимой интерактивной правке оставить только InteractiveChangeOfPosted=true.
There was a problem hiding this comment.
Роль чтения даёт права на изменение истории данных — лишние привилегии
Для read-only не нужны Update*/Edit*/SwitchTo* по истории данных. Оставьте Read/View.
Правка:
<object>
<name>Document.ИндивидуальныйПланРазвития</name>
<right><name>Read</name><value>true</value></right>
<right><name>View</name><value>true</value></right>
<right><name>InputByString</name><value>true</value></right>
- <right><name>ReadDataHistory</name><value>true</value></right>
- <right><name>ReadDataHistoryOfMissingData</name><value>true</value></right>
- <right><name>UpdateDataHistory</name><value>true</value></right>
- <right><name>UpdateDataHistoryOfMissingData</name><value>true</value></right>
- <right><name>UpdateDataHistorySettings</name><value>true</value></right>
- <right><name>UpdateDataHistoryVersionComment</name><value>true</value></right>
- <right><name>ViewDataHistory</name><value>true</value></right>
- <right><name>EditDataHistoryVersionComment</name><value>true</value></right>
- <right><name>SwitchToDataHistoryVersion</name><value>true</value></right>
+ <right><name>ReadDataHistory</name><value>true</value></right>
+ <right><name>ViewDataHistory</name><value>true</value></right>
</object>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <name>Document.ИндивидуальныйПланРазвития</name> | |
| <right> | |
| <name>Read</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>View</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>InputByString</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>ReadDataHistory</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>ReadDataHistoryOfMissingData</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>UpdateDataHistory</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>UpdateDataHistoryOfMissingData</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>UpdateDataHistorySettings</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>UpdateDataHistoryVersionComment</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>ViewDataHistory</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>EditDataHistoryVersionComment</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>SwitchToDataHistoryVersion</name> | |
| <value>true</value> | |
| </right> | |
| </object> | |
| <object> | |
| <name>Document.ИндивидуальныйПланРазвития</name> | |
| <right><name>Read</name><value>true</value></right> | |
| <right><name>View</name><value>true</value></right> | |
| <right><name>InputByString</name><value>true</value></right> | |
| <right><name>ReadDataHistory</name><value>true</value></right> | |
| <right><name>ViewDataHistory</name><value>true</value></right> | |
| </object> |
There was a problem hiding this comment.
Роль «чтение» даёт Insert и права изменения истории — сузить
Для каталога чтения не нужен Insert и любые Update*/Edit*/SwitchTo* по истории.
Предложение:
<object>
<name>Catalog.ЗадачиИПР</name>
<right><name>Read</name><value>true</value></right>
- <right><name>Insert</name><value>true</value></right>
<right><name>View</name><value>true</value></right>
<right><name>InputByString</name><value>true</value></right>
- <right><name>ReadDataHistory</name><value>true</value></right>
- <right><name>ReadDataHistoryOfMissingData</name><value>true</value></right>
- <right><name>UpdateDataHistory</name><value>true</value></right>
- <right><name>UpdateDataHistoryOfMissingData</name><value>true</value></right>
- <right><name>UpdateDataHistorySettings</name><value>true</value></right>
- <right><name>UpdateDataHistoryVersionComment</name><value>true</value></right>
- <right><name>ViewDataHistory</name><value>true</value></right>
- <right><name>EditDataHistoryVersionComment</name><value>true</value></right>
- <right><name>SwitchToDataHistoryVersion</name><value>true</value></right>
+ <right><name>ReadDataHistory</name><value>true</value></right>
+ <right><name>ViewDataHistory</name><value>true</value></right>
</object>📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| <object> | |
| <name>Catalog.ЗадачиИПР</name> | |
| <right> | |
| <name>Read</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>Insert</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>View</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>InputByString</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>ReadDataHistory</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>ReadDataHistoryOfMissingData</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>UpdateDataHistory</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>UpdateDataHistoryOfMissingData</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>UpdateDataHistorySettings</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>UpdateDataHistoryVersionComment</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>ViewDataHistory</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>EditDataHistoryVersionComment</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>SwitchToDataHistoryVersion</name> | |
| <value>true</value> | |
| </right> | |
| </object> | |
| <object> | |
| <name>Catalog.ЗадачиИПР</name> | |
| <right> | |
| <name>Read</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>View</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>InputByString</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>ReadDataHistory</name> | |
| <value>true</value> | |
| </right> | |
| <right> | |
| <name>ViewDataHistory</name> | |
| <value>true</value> | |
| </right> | |
| </object> |
🤖 Prompt for AI Agents
In src/cf/Roles/ЧтениеЗадачиИПР/Ext/Rights.xml around lines 81 to 135, the
"чтение" role currently grants Insert and several history-modifying rights;
remove modification rights by setting <value>false</value> for the Insert right
and for all history Update/Edit/SwitchTo rights (UpdateDataHistory,
UpdateDataHistoryOfMissingData, UpdateDataHistorySettings,
UpdateDataHistoryVersionComment, EditDataHistoryVersionComment,
SwitchToDataHistoryVersion), leaving read/view/history-read rights unchanged.
Добавлены объекты для учета плана развития сотрудников.
В подсистему Развитие выведен соответствующий документ Индивидуальный план развития. Формат строк нормализован. Баги и замечания исправлены, рефакторинг выполнен
Summary by CodeRabbit