Skip to content

Добавил документ ИПР и сопутсвующие ему объекты + рефакторинг#45

Open
Lore-leii wants to merge 8 commits into
developfrom
develop_Shadrin
Open

Добавил документ ИПР и сопутсвующие ему объекты + рефакторинг#45
Lore-leii wants to merge 8 commits into
developfrom
develop_Shadrin

Conversation

@Lore-leii

@Lore-leii Lore-leii commented Sep 10, 2025

Copy link
Copy Markdown

Добавлены объекты для учета плана развития сотрудников.
В подсистему Развитие выведен соответствующий документ Индивидуальный план развития. Формат строк нормализован. Баги и замечания исправлены, рефакторинг выполнен

Summary by CodeRabbit

  • Новые возможности
    • Добавлен каталог «Задачи ИПР» с иерархией и формами (элемент, выбор, выбор с корзиной).
    • Добавлен документ «Индивидуальный план развития» с табличной частью «План‑график», подбором задач и печатным макетом.
    • В форме задачи доступно открытие гиперссылок.
  • Улучшения
    • Регистрация выполнения задач и визуализация статусов; предотвращение дублей в документе.
  • Права доступа
    • Новые роли для чтения/изменения задач и документов ИПР.
  • Навигация
    • Объекты добавлены в подсистему «Учет развития сотрудников».

@coderabbitai

coderabbitai Bot commented Sep 10, 2025

Copy link
Copy Markdown

Walkthrough

Добавлены новые сущности ИПР: каталог ЗадачиИПР (иерархический), документ ИндивидуальныйПланРазвития с ТЧ ПланГрафик, регистр сведений ВыполнениеЗаданийИПР, перечисления ТипыЗаданий и СтатусыЗадачИПР, формы (элемента, выборов, документа), шаблон табличного документа и роли/права. Реализованы модули форм и объекта документа.

Changes

Cohort / File(s) Summary
Конфигурация и подсистема
src/cf/Configuration.xml, src/cf/Subsystems/УчетРазвитияСотрудников.xml
Регистрация каталога, документа, регистра, перечислений и ролей в конфигурации; добавление объектов в подсистему.
Каталог ЗадачиИПР: метаданные
src/cf/Catalogs/ЗадачиИПР.xml
Новый каталог с иерархией, реквизитами (Гиперссылка, ПлановыйТайминг, Тип, Компетенция), формами по умолчанию и сгенерированными типами.
Каталог ЗадачиИПР: формы выбора
.../ЗадачиИПР/Forms/ФормаВыбора.xml, .../ФормаВыбора/Ext/Form.xml
Форма выбора с динамическим списком, настройками поиска и отображения.
Каталог ЗадачиИПР: форма выбора с корзиной
.../ФормаВыбораСКорзиной.xml, .../ФормаВыбораСКорзиной/Ext/Form.xml, .../ФормаВыбораСКорзиной/Ext/Form/Module.bsl
Двухпанельная форма (список + корзина), команда переноса в документ, обработчики выбора/перетаскивания и добавления в корзину.
Каталог ЗадачиИПР: форма элемента
.../ФормаЭлемента.xml, .../ФормаЭлемента/Ext/Form.xml, .../ФормаЭлемента/Ext/Form/Module.bsl
Форма элемента с полями и командой ОткрытьСсылку; серверная логика открытия URL через внешнее приложение.
Документ ИПР: метаданные
src/cf/Documents/ИндивидуальныйПланРазвития.xml
Новый документ с ТЧ ПланГрафик, автонумерацией, регистрацией движений в регистре сведений.
Документ ИПР: форма
.../Forms/ФормаДокумента.xml, .../Forms/ФормаДокумента/Ext/Form.xml, .../Forms/ФормаДокумента/Ext/Form/Module.bsl
Полная форма документа: группы реквизитов, страницы, таблица ПланГрафик, табличный документ, команда ПодборЗадач, обработчики событий и серверные процедуры.
Документ ИПР: модуль объекта
.../Ext/ObjectModule.bsl
Логика копирования, проведения (движения регистра), проверки дублей, получение исключаемых статусов.
Шаблон табличного документа
.../Templates/МакетПланаГрафика.xml, .../Templates/МакетПланаГрафика/Ext/Template.xml
Шаблон SpreadsheetDocument с областями шапки/строки и форматами для вывода плана-графика.
Регистр сведений
src/cf/InformationRegisters/ВыполнениеЗаданийИПР.xml
Новый регистр с измерениями (Сотрудник, Задание), ресурсом Время и сгенерированными типами.
Перечисления
src/cf/Enums/ТипыЗаданий.xml, src/cf/Enums/СтатусыЗадачИПР.xml
Новые перечисления типов заданий и статусов задач ИПР.
Роли и права
src/cf/Roles/*, src/cf/Roles/*/Ext/Rights.xml
Добавлены роли Чтение/Изменение для документов и задач ИПР; права на объекты, атрибуты, режимы клиента и истории данных.

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: Пересобрать табличный документ плана
Loading
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
Loading
sequenceDiagram
  autonumber
  actor User as Пользователь
  participant DocForm as Форма документа ИПР
  participant DocObj as Объект документа
  participant Reg as Регистр сведений ВыполнениеЗаданийИПР

  User->>DocForm: Провести
  DocForm->>DocObj: Запись/Проведение
  DocObj->>Reg: Очистить набор записей
  DocObj->>Reg: Заполнить движения по ТЧ (фактическое время, сотрудник, задание)
  Reg-->>DocObj: Записать движения
Loading
sequenceDiagram
  autonumber
  actor User as Пользователь
  participant DocForm as Форма документа ИПР
  participant Roles as Роли/Права

  User->>DocForm: Открыть форму
  DocForm->>Roles: Проверка ролей (ИзменениеДокументовИПР, ИзменениеДатыДокументовИПР)
  Roles-->>DocForm: Разрешения
  DocForm->>DocForm: Установить ТолькоПросмотр/доступность элементов
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Pre-merge checks (3 passed)

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed Название коротко и ясно отражает основной вклад — добавление документа ИПР вместе с сопутствующими объектами и проведённый рефакторинг — и не перегружено избыточными деталями.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.

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.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

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
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch develop_Shadrin

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between b73969c and 5ef7ec8.

📒 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.xml
  • src/cf/Roles/ИзменениеДатыДокументовИПР/Ext/Rights.xml
  • src/cf/Documents/ИндивидуальныйПланРазвития/Forms/ФормаДокумента.xml
  • src/cf/Roles/ЧтениеДокументовИПР/Ext/Rights.xml
  • src/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

Comment on lines 6 to 11

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Лишний пробел в пользовательском синониме

Видимый текст с пробелом на конце смотрится как опечатка.

 				<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.

Suggested change
<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.

Comment on lines 12 to 19

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Форма помечена как «НЕ ИСПОЛЬЗУЕТСЯ» — убрать или исключить из поставки

Если форма реально не используется, лучше удалить, чтобы не раздувать конфигурацию и не путать пользователей; минимум — снять MobilePurpose и скрыть из интерфейса.

Для проверки используемости выполните поиск ссылок на форму:


🏁 Script executed:

#!/bin/bash
rg -nP -C2 'ФормаВыбораСКорзиной|Form\.ФормаВыбораСКорзиной|ФормаВыбораСКорзиной/Ext' --type-add 'xml:*.xml' --type xml

Length 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.

Comment on lines 7 to 31

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

⚠️ Potential issue

Открытие ссылки выполняется на сервере — ссылка откроется на стороне сервера, а не у пользователя

Вызывайте открытие 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.

Suggested change
&НаСервере
Процедура ОткрытьСсылкуВБраузере()
Гиперссылка = Объект.Гиперссылка;
Если ПустаяСтрока(Объект.Гиперссылка) Тогда
ОбщегоНазначения.СообщитьПользователю("Ссылка не указана.");
Возврат;
КонецЕсли;
Лок = НРег(Гиперссылка);
Если НЕ СтрНачинаетсяС(Лок, "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.

Comment on lines 123 to 205

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Comment on lines 433 to 441

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ 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.

Comment on lines 23 to 37

@coderabbitai coderabbitai Bot Sep 10, 2025

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

UI-свойства нельзя менять на сервере — перевести логику на клиент

В УстановитьВидимостьДоступность() и ЗаполнитьНаставника() на сервере изменяются свойства формы/элементов (ЭтаФорма.ТолькоПросмотр, Элементы.*). Это приведёт к ошибкам в управляемом приложении.

Правка (ключевые части):

-&НаСервере
-Процедура УстановитьВидимостьДоступность();	    
+&НаКлиенте
+Процедура УстановитьВидимостьДоступность()
     Если Пользователи.РолиДоступны("ИзменениеДокументовИПР") Тогда
         ЭтаФорма.ТолькоПросмотр = Ложь;
     ИначеЕсли Пользователи.РолиДоступны("ИзменениеДатыДокументовИПР") Тогда
         ЭтаФорма.ТолькоПросмотр = Истина; 
-        Элементы.Период.ТолькоПросмотр = Ложь;
-        Элементы.Дата.ТолькоПросмотр = Ложь;
-        Элементы.ПланГрафикФактическоеВремя.ТолькоПросмотр = Ложь;
+        Если Элементы.Найти("Период") <> Неопределено Тогда Элементы.Период.ТолькоПросмотр = Ложь; КонецЕсли;
+        Если Элементы.Найти("Дата") <> Неопределено Тогда Элементы.Дата.ТолькоПросмотр = Ложь; КонецЕсли;
+        Если Элементы.Найти("ПланГрафикФактическоеВремя") <> Неопределено Тогда Элементы.ПланГрафикФактическоеВремя.ТолькоПросмотр = Ложь; КонецЕсли;
     Иначе
         ЭтаФорма.ТолькоПросмотр = Истина;
     КонецЕсли;
 КонецПроцедуры

И убрать серверный доступ к элементам из ЗаполнитьНаставника():

-        Если ЗначениеЗаполнено(Объект.Наставник) Тогда
-            Элементы.Наставник.Видимость	= Истина;
-        КонецЕсли;

Вызывать УстановитьВидимостьДоступность() на клиенте (см. правку ПриОткрытии ниже).

Also applies to: 45-47

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ coderabbitai Изменение свойств элементов формы на сервере не вызывает ошибок. Наоборот в некоторых версиях платформы изменение некоторых свойств элементов делает неявные вызовы сервера для перерисовки формы.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@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.

Comment on lines 145 to 158

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Исправить заголовок блока и окраску строк: параметр заполняется не той областью, цвет задаётся после вывода

Сейчас БлокЗадания присваивается в область «Строка», а выводится «Шапка»; также цвет выставляется после вывода строки и не сработает.

Предлагаемый diff:

-        Область = Макет.ПолучитьОбласть("ОбластьСтрока");
-        Область.Параметры.БлокЗадания = Выборка.Блок;
-        Выборка.Сбросить();
-        ПланГрафикТабличныйДокумент.Вывести(ОбластьШапки);
+        Область = Макет.ПолучитьОбласть("ОбластьСтрока");
+        ОбластьШапки.Параметры.БлокЗадания = Выборка.Блок;
+        Выборка.Сбросить();
+        ПланГрафикТабличныйДокумент.Вывести(ОбластьШапки);
         Пока Выборка.Следующий() Цикл 
             ЗаполнитьЗначенияСвойств(Область.Параметры, Выборка);
             Область.Параметры.ДатаНачала = Формат(Выборка.ДатаНачала, "ДФ=dd.MM.yyyy");
-            ПланГрафикТабличныйДокумент.Вывести(Область);
-            Если Выборка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗадачИПР.ЗаданиеВыполненоНеудовлетворительно") ИЛИ 
-                Выборка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗадачИПР.ЗаданиеВыполненоУдовлетворительно") Тогда
-                ПланГрафикТабличныйДокумент.Область("ОбластьСтрока").ЦветФона = WebЦвета.БледноЗеленый;
-            Иначе
-                ПланГрафикТабличныйДокумент.Область("ОбластьСтрока").ЦветФона = WebЦвета.Белый;
-            КонецЕсли;
+            Если Выборка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗадачИПР.ЗаданиеВыполненоНеудовлетворительно")
+               ИЛИ Выборка.Статус = ПредопределенноеЗначение("Перечисление.СтатусыЗадачИПР.ЗаданиеВыполненоУдовлетворительно") Тогда
+                Область.ЦветФона = WebЦвета.БледноЗеленый;
+            Иначе
+                Область.ЦветФона = WebЦвета.Белый;
+            КонецЕсли;
+            ПланГрафикТабличныйДокумент.Вывести(Область);
             Область.Параметры.БлокЗадания = Неопределено;

Comment on lines 54 to 91

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Права шире, чем заявленная роль; сузить до редактирования даты

Для роли «Изменение даты…» не нужны 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.

Suggested change
<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.

Comment on lines 146 to 195

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Роль чтения даёт права на изменение истории данных — лишние привилегии

Для 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.

Suggested change
<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>

Comment on lines 81 to 135

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Роль «чтение» даёт 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.

Suggested change
<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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants