4. Планирование отпусков и связанные метаданные#40
Conversation
…язанные метаданные
WalkthroughВ систему добавлены новые объекты для управления отпусками сотрудников: документ «ПланированиеОтпуска», отчет «ГрафикОтпусков» и регистр сведений «ОтпускаСотрудников». Реализованы формы, модули обработки и визуализации, а также интеграция этих объектов в подсистему «УчетПроектныхОтделов». Добавлены роли и права доступа для просмотра и редактирования отпусков. Changes
Sequence Diagram(s)sequenceDiagram
participant Пользователь
participant ФормаДокумента
participant Документ.ПланированиеОтпуска
participant Регистр.ОтпускаСотрудников
Пользователь->>ФормаДокумента: Вводит сотрудника и даты отпуска
ФормаДокумента->>ФормаДокумента: Пересчет количества дней отпуска при изменении дат
Пользователь->>Документ.ПланированиеОтпуска: Проводит документ
Документ.ПланированиеОтпуска->>Регистр.ОтпускаСотрудников: Записывает движение (даты, сотрудник)
sequenceDiagram
participant Пользователь
participant ФормаОтчета
participant СерверОтчета
participant Регистр.ОтпускаСотрудников
participant ДиаграммаГанта
Пользователь->>ФормаОтчета: Задает период и нажимает "Сформировать"
ФормаОтчета->>СерверОтчета: Запрос на формирование отчета
СерверОтчета->>Регистр.ОтпускаСотрудников: Запрашивает отпуска по периоду
Регистр.ОтпускаСотрудников-->>СерверОтчета: Возвращает данные по отпускам
СерверОтчета->>ДиаграммаГанта: Формирует и отображает диаграмму отпусков
Estimated code review effort
📜 Recent review detailsConfiguration used: .coderabbit.yaml 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (11)
src/cf/Reports/ГрафикОтпусков/Forms/Форма.xml (2)
5-11: Добавить англоязычный синоним формыВ конфигурации присутствуют англоязычные локали. Чтобы не получать пустые подписи в интерфейсе при переключении языка, добавьте элемент
<v8:item>c<v8:lang>en</v8:lang>и заполняйте<v8:content>Vacation schedule</v8:content>.
14-14: Рассмотрите возможность включить справку
<IncludeHelpInContents>установлен в false. Если отчёт будет использоваться конечными пользователями, короткое встроенное описание улучшит UX.src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента.xml (1)
5-11: Нет англоязычного названия формы документаАналогично предыдущей форме, добавьте английский элемент синонима для корректной мультиязычности.
src/cf/Reports/ГрафикОтпусков.xml (3)
15-21: Добавьте мультиязычные синонимы отчётаКак минимум нужен английский
<v8:item>для корректной локализации.
24-31: Отсутствует схема компоновки данныхЕсли отчёт строится только через управляемую форму (Gantt-чарт) — ок.
Если планируется выгрузка в табличные формы/печатные формы, добавьте DCS и форму настроек, иначе стандартные функции компоновки отчётов будут недоступны.
32-35: Подумайте о включении справки для отчёта
<IncludeHelpInContents>= false – мелочь, но поиск по справке облегчает поддержку.src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента/Ext/Form/Module.bsl (1)
37-42: Рассмотрите использование константы вместо магического числа.Использование числа 86400 (количество секунд в сутках) затрудняет понимание кода. Рекомендуется использовать именованную константу или встроенную функцию.
-КоличествоДнейОтпуска = 1 + (Объект.ДатаОкончания - Объект.ДатаНачала) / 86400; +КоличествоДнейОтпуска = 1 + (Объект.ДатаОкончания - Объект.ДатаНачала) / (24 * 60 * 60); // секунд в суткахИли еще лучше:
-КоличествоДнейОтпуска = 1 + (Объект.ДатаОкончания - Объект.ДатаНачала) / 86400; +КоличествоДнейОтпуска = (КонецДня(Объект.ДатаОкончания) - НачалоДня(Объект.ДатаНачала)) / (24 * 60 * 60) + 1;src/cf/Documents/ПланированиеОтпуска/Ext/ManagerModule.bsl (1)
3-25: Функция корректна, но можно улучшить обработку ошибокРеализация следует стандартным паттернам 1C для подготовки параметров проведения документов. Логика построения запроса и извлечения данных выполнена правильно.
Рекомендуется добавить проверку корректности ссылки на документ:
Функция ПодготовитьПараметрыПроведения(ДокументСсылка, Отказ) Экспорт + Если НЕ ЗначениеЗаполнено(ДокументСсылка) Тогда + Отказ = Истина; + Возврат Неопределено; + КонецЕсли; + ПараметрыПроведения = Новый Структура;src/cf/InformationRegisters/ОтпускаСотрудников.xml (1)
67-150: Ресурсы дат настроены правильноРесурсы ДатаНачала и ДатаОкончания корректно определены как поля типа дата. Включены полнотекстовый поиск и история данных.
Рекомендуется рассмотреть добавление ограничений на даты для предотвращения логических ошибок:
<MinValue>01.01.1900</MinValue> <MaxValue>31.12.2099</MaxValue>src/cf/Documents/ПланированиеОтпуска.xml (2)
122-163: Атрибут ДатаНачала требует дополнительной настройкиАтрибут корректно определен как тип дата, но рекомендуется добавить ограничения для предотвращения ввода некорректных значений.
Рекомендуется добавить ограничения на минимальную дату:
<MinValue>01.01.1900</MinValue> <MaxValue>31.12.2099</MaxValue>
164-205: Атрибут ДатаОкончания требует дополнительной настройкиАналогично атрибуту ДатаНачала, требуется добавить ограничения на допустимые значения дат.
Применить такие же ограничения, как для ДатаНачала:
<MinValue>01.01.1900</MinValue> <MaxValue>31.12.2099</MaxValue>
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (13)
src/cf/Configuration.xml(3 hunks)src/cf/Documents/ПланированиеОтпуска.xml(1 hunks)src/cf/Documents/ПланированиеОтпуска/Ext/ManagerModule.bsl(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/InformationRegisters/ОтпускаСотрудников.xml(1 hunks)src/cf/Reports/ГрафикОтпусков.xml(1 hunks)src/cf/Reports/ГрафикОтпусков/Forms/Форма.xml(1 hunks)src/cf/Reports/ГрафикОтпусков/Forms/Форма/Ext/Form.xml(1 hunks)src/cf/Reports/ГрафикОтпусков/Forms/Форма/Ext/Form/Module.bsl(1 hunks)src/cf/Subsystems/УчетПроектныхОтделов.xml(1 hunks)
🧰 Additional context used
🧠 Learnings (1)
src/cf/Documents/ПланированиеОтпуска/Ext/ObjectModule.bsl (1)
Learnt from: ivanmolodec
PR: firstBitSportivnaya/PDM#36
File: src/cf/Documents/ПланированиеОтпуска/Ext/ObjectModule.bsl:2-16
Timestamp: 2025-07-14T11:38:59.877Z
Learning: В 1C:Enterprise валидацию данных следует выполнять либо на уровне настроек метаданных (настройка "Проверка заполнения"), либо в процедуре ОбработкаПроверкиЗаполнения. Процедура ОбработкаПроведения предназначена для записи движений в регистры, а не для валидации данных.
🔇 Additional comments (17)
src/cf/Reports/ГрафикОтпусков/Forms/Форма.xml (1)
14-18: Проверьте адаптацию формы для мобильной платформыВ
<UsePurposes>указана мобильная платформа, однако сама форма пустая. Удостоверьтесь, что расширение формы (Ext) действительно содержит мобильный-френдли макет, иначе возможны проблемы отображения.src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента.xml (1)
14-18: Мобильная цель использования требует проверки разметкиПроверьте наличие оптимизированного мобильного макета и событий в расширении формы, иначе при открытии из мобильного клиента возможны ошибки.
src/cf/Configuration.xml (1)
1653-1654: Обеспечьте сквозную интеграцию новых метаданныхОбъекты зарегистрированы в конфигурации, но проверьте следующее:
- Включены ли они в план обмена (если используется распределённая ИБ).
- Есть ли правила полнотекстового поиска/ρерепроверка индексирования.
- Созданы ли права доступа по умолчанию («Полные права» их не покрывают для рядовых ролей).
Это лучше сделать до передачи конфигурации тестировщикам.
Also applies to: 1735-1735, 1874-1874
src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента/Ext/Form.xml (1)
1-127: Хорошо структурированная XML-форма документа.Форма правильно определяет все необходимые элементы: группировку полей, обработчики событий изменения дат, атрибуты формы с корректными типами данных и ограничениями. Реализация следует стандартам 1С:Предприятие.
src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента/Ext/Form/Module.bsl (2)
1-8: Корректная инициализация формы на сервере.Процедура правильно проверяет заполненность дат и выполняет расчет количества дней отпуска при создании формы.
10-17: Корректная логика обновления даты окончания.Процедура правильно рассчитывает дату окончания отпуска на основе количества дней и даты начала.
src/cf/Reports/ГрафикОтпусков/Forms/Форма/Ext/Form.xml (1)
1-388: Отлично настроенная форма отчета с диаграммой Ганта.Форма содержит все необходимые элементы для визуализации графика отпусков: поле выбора периода, кнопку формирования отчета и детально настроенную диаграмму Ганта с временными шкалами по месяцам и дням. Конфигурация визуальных элементов соответствует стандартам 1С:Предприятие.
src/cf/Documents/ПланированиеОтпуска/Ext/ObjectModule.bsl (2)
4-16: Корректная реализация валидации данных.Валидация правильно размещена в процедуре
ОбработкаПроверкиЗаполнениясогласно стандартам 1С:Предприятие. Проверка логической связи между датами начала и окончания отпуска реализована корректно с выводом понятного сообщения пользователю.
19-47: Правильная реализация проведения документа.Процедура проведения корректно:
- Получает параметры через менеджер документа
- Проверяет корректность подготовки данных
- Очищает предыдущие движения
- Создает новые записи в регистре сведений
- Активирует запись движений
Логика соответствует стандартам 1С:Предприятие.
src/cf/Reports/ГрафикОтпусков/Forms/Форма/Ext/Form/Module.bsl (2)
2-11: Корректная клиентская процедура формирования отчета.Процедура правильно проверяет заполненность периода перед вызовом серверной части и выводит информативное сообщение при отсутствии данных.
13-52: Эффективная реализация построения диаграммы Ганта.Серверная процедура корректно:
- Выполняет запрос к регистру сведений с правильной логикой пересечения периодов
- Настраивает диаграмму Ганта с отключением автоопределения интервала
- Создает точки и интервалы для каждого отпуска
- Использует
КонецДня()для корректного отображения дат окончанияЛогика построения отчета реализована профессионально.
src/cf/Documents/ПланированиеОтпуска/Ext/ManagerModule.bsl (1)
31-61: Построение запроса выполнено корректноФункция правильно формирует текст запроса с использованием временной таблицы для получения реквизитов документа. Структура запроса соответствует стандартам 1C.
src/cf/InformationRegisters/ОтпускаСотрудников.xml (2)
3-65: Метаданные регистра настроены корректноКонфигурация регистра сведений соответствует назначению хранения данных об отпусках сотрудников. Правильно настроены периодичность (RecorderPosition) и режим записи (RecorderSubordinate) для документооборота.
151-194: Измерение Сотрудник настроено оптимальноПравильно настроен тип ссылки на справочник Сотрудники, включен основной отбор (MainFilter) для повышения производительности запросов.
src/cf/Documents/ПланированиеОтпуска.xml (3)
3-81: Конфигурация документа выполнена корректноДокумент правильно настроен для планирования отпусков с поддержкой проведения и записи в регистр ОтпускаСотрудников. Основные свойства документа соответствуют стандартам 1C.
83-121: Атрибут Сотрудник настроен правильноКорректно определен тип ссылки на справочник Сотрудники с обязательным заполнением (ShowError).
63-65: Правильная настройка связи с регистромКорректно настроена запись в регистр ОтпускаСотрудников при проведении документа.
There was a problem hiding this comment.
🛠️ Refactor suggestion
Права и команды для новых объектов пока не добавлены
Документ, отчёт и регистр добавлены в подсистему, но в ролях, командном интерфейсе и рабочих местах они пока отсутствуют.
• Создайте роли «Чтение/Изменение ПланированияОтпуска» и «Просмотр ГрафикаОтпусков».
• Добавьте команды в интерфейс подсистемы, иначе элементы не будут видны пользователю.
🤖 Prompt for AI Agents
In src/cf/Subsystems/УчетПроектныхОтделов.xml around lines 69 to 71, the new
objects Document.ПланированиеОтпуска, Report.ГрафикОтпусков, and
InformationRegister.ОтпускаСотрудников are added but lack associated roles and
commands. Create roles named «Чтение/Изменение ПланированияОтпуска» and
«Просмотр ГрафикаОтпусков» to grant appropriate permissions. Then, add the
necessary commands for these objects in the subsystem's command interface to
ensure they are visible and accessible to users.
There was a problem hiding this comment.
Исправьте вызов серверной процедуры с клиента.
В строке 23 происходит вызов процедуры РасчетКоличестваДнейОтпуска(), которая помечена как серверная (&НаСервере), из клиентской процедуры. Это приведет к ошибке выполнения.
-&НаКлиенте
-Процедура ДатаНачалаПриИзменении(Элемент)
-
- Если ЗначениеЗаполнено(Объект.ДатаОкончания) Тогда
- РасчетКоличестваДнейОтпуска();
- КонецЕсли
-
-КонецПроцедуры
+&НаКлиенте
+Процедура ДатаНачалаПриИзменении(Элемент)
+
+ Если ЗначениеЗаполнено(Объект.ДатаОкончания) Тогда
+ РасчетКоличестваДнейОтпускаНаСервере();
+ КонецЕсли
+
+КонецПроцедурыДобавьте обертку для вызова серверной процедуры:
+&НаСервере
+Процедура РасчетКоличестваДнейОтпускаНаСервере()
+ РасчетКоличестваДнейОтпуска();
+КонецПроцедуры🤖 Prompt for AI Agents
In src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента/Ext/Form/Module.bsl
around lines 19 to 26, the client procedure ДатаНачалаПриИзменении calls the
server procedure РасчетКоличестваДнейОтпуска() directly, which causes a runtime
error. To fix this, create a client-side wrapper procedure marked with
&НаКлиенте that calls the server procedure asynchronously using
ВызватьПроцедуруСервера or equivalent remote call mechanism, then replace the
direct call in ДатаНачалаПриИзменении with a call to this client wrapper.
…и регистра сведений
There was a problem hiding this comment.
А зачем такая сложность со структурой? С пакетом запросов? Тут же можно просто получить результат запроса.
Похожая структура нужна когда в одном запросе и реквизиты и табличные части. Тут кажется эта сложность изляшняя
There was a problem hiding this comment.
А зачем такая сложность со структурой? С пакетом запросов? Тут же можно просто получить результат запроса. Похожая структура нужна когда в одном запросе и реквизиты и табличные части. Тут кажется эта сложность изляшняя
Это я попросил так сделать, чтобы было как в типовых и сразу учиться делать в одном с ними стиле
There was a problem hiding this comment.
Нет Смысла в серверной процедуре. Возвращай на клиент и вызывай при открытии а не при создании
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
src/cf/Documents/ПланированиеОтпуска/Ext/ManagerModule.bsl (1)
3-19: Упростите структуру функции согласно замечанию предыдущего ревьюСогласен с замечанием Sidorovaa90 о избыточной сложности. Текущая реализация с созданием структуры параметров и передачей её в вспомогательную функцию излишне усложняет код, когда можно просто выполнить запрос и получить результат.
Рекомендую упростить функцию:
Функция ПодготовитьПараметрыПроведения(ДокументСсылка, Отказ) Экспорт - ПараметрыПроведения = Новый Структура; - Запрос = Новый Запрос; Запрос.УстановитьПараметр("Ссылка", ДокументСсылка); + Запрос.Текст = ТекстЗапросаРеквизитыДокумента(); - Запрос.Текст = ТекстЗапросаРеквизитыДокумента(ПараметрыПроведения); Результат = Запрос.Выполнить(); ТаблицаРеквизиты = Результат.Выгрузить(); + Если ТаблицаРеквизиты.Количество() = 0 Тогда + Отказ = Истина; + Возврат Новый Структура; + КонецЕсли; + Реквизиты = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(ТаблицаРеквизиты[0]); + + ПараметрыПроведения = Новый Структура; ПараметрыПроведения.Вставить("Реквизиты", Реквизиты); Возврат ПараметрыПроведения; КонецФункцииИ упростите вспомогательную функцию:
-Функция ТекстЗапросаРеквизитыДокумента(ПараметрыПроведения) +Функция ТекстЗапросаРеквизитыДокумента() - ПараметрыПроведения.Вставить("Реквизиты", ПараметрыПроведения.Количество()); - ТекстЗапроса = "ВЫБРАТЬ | ПланированиеОтпуска.Ссылка КАК Ссылка,
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
src/cf/Documents/ПланированиеОтпуска/Ext/ManagerModule.bsl(1 hunks)src/cf/Documents/ПланированиеОтпуска/Ext/ObjectModule.bsl(1 hunks)src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента/Ext/Form.xml(1 hunks)src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента/Ext/Form/Module.bsl(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента/Ext/Form/Module.bsl
🚧 Files skipped from review as they are similar to previous changes (2)
- src/cf/Documents/ПланированиеОтпуска/Forms/ФормаДокумента/Ext/Form.xml
- src/cf/Documents/ПланированиеОтпуска/Ext/ObjectModule.bsl
There was a problem hiding this comment.
Добавьте проверку наличия данных перед обращением к индексу массива
Отсутствует проверка того, что результат запроса содержит строки перед обращением к ТаблицаРеквизиты[0]. Это может привести к ошибке времени выполнения, если документ с указанной ссылкой не найден.
Примените этот diff для добавления проверки:
ТаблицаРеквизиты = Результат.Выгрузить();
+Если ТаблицаРеквизиты.Количество() = 0 Тогда
+ Отказ = Истина;
+ Возврат ПараметрыПроведения;
+КонецЕсли;
+
Реквизиты = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(ТаблицаРеквизиты[0]);📝 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.
| ТаблицаРеквизиты = Результат.Выгрузить(); | |
| Реквизиты = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(ТаблицаРеквизиты[0]); | |
| ТаблицаРеквизиты = Результат.Выгрузить(); | |
| Если ТаблицаРеквизиты.Количество() = 0 Тогда | |
| Отказ = Истина; | |
| Возврат ПараметрыПроведения; | |
| КонецЕсли; | |
| Реквизиты = ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру(ТаблицаРеквизиты[0]); |
🤖 Prompt for AI Agents
In src/cf/Documents/ПланированиеОтпуска/Ext/ManagerModule.bsl around lines 13 to
14, add a check to ensure ТаблицаРеквизиты contains at least one row before
accessing ТаблицаРеквизиты[0]. Modify the code to verify that ТаблицаРеквизиты
is not empty, and only then convert the first row to a structure using
ОбщегоНазначения.СтрокаТаблицыЗначенийВСтруктуру to prevent runtime errors when
no data is returned.
|
Нужно доработать в соответствии со следующей логикой: При проведении записывать в РС Планы отпусков по 1 записи на каждый день между всеми периодами Соответственно в РС Планы отпусков |
Summary by CodeRabbit