Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Изменена загрузка файла из табличного документа #130

Merged
merged 5 commits into from
Oct 23, 2024

Conversation

thvvmas
Copy link
Contributor

@thvvmas thvvmas commented Oct 23, 2024

#76, #100, #126
Изменение передачи свойств колонок табличного документа (была структура, сейчас таблица значений). Изменение алгоритма поиска данных. Было: документы по номеру, справочники по наименованию. Добавление варианта сопоставления колонок по наименованию, а не только в жесткой последовательности. Добавление функций преобразования даты из произвольного формата строки в тип Дата. Добавление возможности использования оператора сравнения И при соединениях данных таблицы и ссылочных объектов.
Исправление передачи пользователя в параметры установки параметров соединения внешнего источника данных. Добавление функции получения данных из таблицы внешнего источника данных с динамическим составлением запроса выборки по передаваемым условиям. Добавление функции инициализации таблицы значений с типизированным колонками на основании метаданных таблицы внешнего источника данных

Summary by CodeRabbit

  • Новые функции

    • Добавлена функция НайтиПоСсылке для поиска пользователя по ссылке.
    • Введена функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям для извлечения данных из внешних источников.
    • Добавлена функция ИнициализироватьТаблицуСоСвойствамиКолонок для инициализации свойств колонок загружаемого файла.
    • Введены функции для работы с табличными документами, включая конвертацию и получение параметров чтения.
    • Добавлен новый атрибут НаправлениеПотока в каталог интеграционных потоков.
    • Введено новое поле ввода "НаправлениеПотока" в форму интеграционных потоков.
    • Добавлена новая функция ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных для построения строк запроса к внешним источникам данных.
    • Введена функция ПолучитьНомерМесяцаПоСтроковомуПредставлению для преобразования строкового представления месяца в числовое значение.
  • Исправления ошибок

    • Улучшена обработка ошибок в функциях, связанных с SFTP и FTP.
    • Обновлены сообщения об ошибках для большей информативности.
    • Расширена логика обработки статусов интеграции.
  • Документация

    • Обновлены комментарии и описания функций для улучшения понимания их работы.
  • Обновления конфигурации

    • Обновлена версия конфигурации с 1.0.3.10 до 1.0.3.11.
    • Добавлены новые модули в конфигурацию.

@thvvmas thvvmas added the enhancement Улучшение существующей функциональности label Oct 23, 2024
@thvvmas thvvmas requested a review from ivanmolodec October 23, 2024 11:15
@thvvmas thvvmas self-assigned this Oct 23, 2024
Copy link

coderabbitai bot commented Oct 23, 2024

Walkthrough

В данном пулл-реквесте внесены изменения в несколько файлов, включая обновления в структуре конфигурации форм, добавление новых функций для работы с таблицами и улучшение обработки ошибок. Основные изменения включают добавление атрибута <Behavior> в элементы UsualGroup и создание новых функций для инициализации таблиц и передачи параметров на сервер. Также обновлены версии модулей и изменены некоторые параметры функций для улучшения их функциональности и ясности.

Changes

Файл Изменения
src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form.xml Обновлены элементы UsualGroup, добавлен <Behavior>Usual</Behavior> для групп данных.
src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера/Ext/Module.bsl Обновлен процесс ФормированиеТаблицы, добавлена новая функция ИнициализироватьТаблицуСоСвойствамиКолонок.
src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl Обновлена функция ЗагрузитьИзXLS, добавлены новые параметры и функции для инициализации структуры параметров.
src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.xml Добавлен новый XML-файл для метаданных модуля.
src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl Введены функции для обработки чтения и преобразования данных из таблиц.
src/cf/CommonModules/пбп_ИнтеграцииFTPSFTP/Ext/Module.bsl Удалена функция ПолучитьНомерМесяцаПоСтроковомуПредставлению, обновлена обработка ошибок.
src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl Добавлена функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям, обновлена логика получения пользователя.
src/cf/CommonModules/пбп_ОбновлениеИнформационнойБазыПБП/Ext/Module.bsl Обновлена версия в процедуре ПриДобавленииПодсистемы.
src/cf/CommonModules/пбп_Пользователи/Ext/Module.bsl Добавлена новая функция НайтиПоСсылке для поиска пользователя по ссылке.
src/cf/CommonModules/пбп_ПользователиСлужебный/Ext/Module.bsl Добавлена новая функция НайтиПоСсылке, использующая функцию из модуля пбп_Пользователи.
src/cf/Configuration.xml Обновлена версия конфигурации, добавлены и удалены модули.
src/cf/Subsystems/пбп_ЗагрузкаИзТабличногоДокумента.xml Добавлена новая ссылка на серверный модуль в разделе <Content>.

Possibly related PRs

  • Архитектурный рефакторинг подсистемы управления интеграциями #99: Изменения в этом PR касаются модификаций XML-структуры формы истории интеграции, включая добавление новых элементов UsualGroup, что напрямую связано с обновлениями в основном PR.
  • Исправлены пути к данным реквизитов формы #102: Этот PR также включает изменения в XML-формах, добавляя новые элементы и атрибуты, что может иметь концептуальную связь с изменениями в основном PR.
  • Add functions for sftp linux #113: Модификации в этом PR сосредоточены на обработчиках событий и утилитах внутри формы, что может быть актуально для изменений в основном PR, касающихся поведения и структуры форм.
  • refactoring the creation of hierarchical elements #129: Этот PR вводит новые функции и модификации существующих процедур, связанные с иерархическими элементами, что может быть связано со структурными изменениями в основном PR.

Suggested reviewers

  • ivanmolodec

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

Failed

  • E Reliability Rating on New Code (is worse than A)

Analysis Details

63 Issues

  • Bug 4 Bugs
  • Vulnerability 0 Vulnerabilities
  • Code Smell 59 Code Smells

Coverage and Duplications

  • Coverage No coverage information (0.00% Estimated after merge)
  • Duplications 0.00% Duplicated Code (0.40% Estimated after merge)

Project ID: PSSL

View in SonarQube

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 13

🧹 Outside diff range and nitpick comments (7)
src/cf/CommonModules/пбп_ПользователиСлужебный/Ext/Module.bsl (1)

33-34: Добавьте документацию параметра

Рекомендуется дополнить комментарий описанием параметра Пользователь по аналогии с документацией в основном модуле пбп_Пользователи.

Предлагаемое дополнение:

 // См. пбп_Пользователи.НайтиПоСсылке.
+//
+// Параметры:
+//  Пользователь - СправочникСсылка.Пользователи - Ссылка на элемент справочника пользователей
src/cf/CommonModules/пбп_Пользователи/Ext/Module.bsl (1)

39-49: Рекомендуется дополнить документацию

В документации следует указать поведение функции при передаче пустого значения параметра и добавить пример использования.

src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl (1)

39-48: Корректная обработка параметров!

Использование выделенной функции ИнициализироватьСтруктуруПередачиПараметровНаСервер для инициализации параметров улучшает поддерживаемость кода. Все параметры корректно инициализируются и соответствуют документации.

Рекомендуется добавить проверку входных параметров:

 Асинх Функция ЗагрузитьИзXLS(АдресСоответствияКолонок, НазваниеЛиста = "", НомерПервойСтроки = 1, СопоставлениеПоНаименованию = Ложь) Экспорт
+    Если ПустаяСтрока(АдресСоответствияКолонок) Тогда
+        ВызватьИсключение НСтр("ru = 'Не указан адрес соответствия колонок'");
+    КонецЕсли;
+    
+    Если НомерПервойСтроки < 1 Тогда
+        ВызватьИсключение НСтр("ru = 'Номер первой строки должен быть больше 0'");
+    КонецЕсли;
src/cf/CommonModules/пбп_ОбновлениеИнформационнойБазыПБП/Ext/Module.bsl (1)

77-77: Обновление версии библиотеки подтверждено.

Изменение версии с 1.0.3.10 на 1.0.3.11 соответствует внесенным изменениям в функциональность работы с табличными документами.

Рекомендуется добавить комментарий к изменению версии в истории изменений (changelog) с описанием внесенных улучшений:

  • Изменение алгоритма загрузки данных из табличных документов
  • Добавление возможности поиска документов по номеру и каталогов по наименованию
  • Добавление опции сопоставления колонок по наименованию
  • Добавление функций конвертации дат
  • Добавление логического оператора "И" для объединения данных
src/cf/Configuration.xml (1)

332-333: Восстановлены модули файловой системы.

Модули переадресации файловой системы восстановлены в конфигурации:

  • пбп_ФайловаяСистемаКлиентПереадресация
  • пбп_ФайловаяСистемаПереадресация

Это улучшает архитектуру обработки файлов в системе.

Рекомендуется убедиться, что все зависимые модули правильно используют функциональность переадресации файловой системы.

src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl (1)

264-268: Улучшите обработку исключений

В блоке Исключение вы скрываете исходное исключение и возвращаете сообщение об ошибке. Рекомендуется логировать информацию об исключении или повторно выбрасывать исключение после логирования для облегчения отладки.

src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl (1)

545-546: Используйте корректный метод объединения строк для формирования даты.

В функции ПолучитьТолькоДатуЕслиРазделительПробел для объединения частей даты используется конкатенация строк, что может привести к лишним пробелам или ошибкам формата. Рекомендуется использовать функцию СтрСоединить.

Пример исправления:

Для Разделитель = 0 По КоличествоРазделителей Цикл
-   ТолькоДата = ТолькоДата + ?(ПустаяСтрока(ТолькоДата), "", " ") + МассивРазделителейДатаВремя[Разделитель];
+   МассивДаты.Добавить(МассивРазделителейДатаВремя[Разделитель]);
КонецЦикла;
+ ТолькоДата = СтрСоединить(" ", МассивДаты);
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 1cc3e82 and d7ce071.

📒 Files selected for processing (12)
  • src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form.xml (2 hunks)
  • src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера/Ext/Module.bsl (3 hunks)
  • src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl (3 hunks)
  • src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.xml (1 hunks)
  • src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl (1 hunks)
  • src/cf/CommonModules/пбп_ИнтеграцииFTPSFTP/Ext/Module.bsl (1 hunks)
  • src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl (1 hunks)
  • src/cf/CommonModules/пбп_ОбновлениеИнформационнойБазыПБП/Ext/Module.bsl (1 hunks)
  • src/cf/CommonModules/пбп_Пользователи/Ext/Module.bsl (1 hunks)
  • src/cf/CommonModules/пбп_ПользователиСлужебный/Ext/Module.bsl (1 hunks)
  • src/cf/Configuration.xml (3 hunks)
  • src/cf/Subsystems/пбп_ЗагрузкаИзТабличногоДокумента.xml (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.xml
🧰 Additional context used
🔇 Additional comments (12)
src/cf/CommonModules/пбп_ПользователиСлужебный/Ext/Module.bsl (1)

33-39: Корректная реализация делегирования

Реализация функции НайтиПоСсылке соответствует архитектурному паттерну модуля и правильно делегирует вызов в целевой модуль пбп_Пользователи.

src/cf/Subsystems/пбп_ЗагрузкаИзТабличногоДокумента.xml (1)

21-21: Корректное добавление серверного модуля в подсистему

Добавление ссылки на общий модуль пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер выполнено корректно и соответствует общей архитектуре подсистемы.

Выполните следующий скрипт для проверки регистрации модуля в конфигурации:

✅ Verification successful

Let me verify the module definition by checking its content:


Модуль корректно зарегистрирован в конфигурации

Проверка показала, что общий модуль пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер:

  • Корректно определен как серверный модуль
  • Имеет правильные настройки области использования
  • Правильно зарегистрирован в подсистеме
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Проверка наличия определения модуля в конфигурации
# Ожидаемый результат: Наличие файла определения модуля

fd "пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.xml" --type f

Length of output: 445


Script:

#!/bin/bash
# Проверка содержимого файла определения модуля
cat "src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.xml"

Length of output: 2002

src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl (3)

25-34: Документация оформлена корректно!

Подробное описание параметров и их назначения соответствует стандартам документирования. Особенно полезно описание нового параметра СопоставлениеПоНаименованию, которое чётко объясняет различие между сопоставлением по наименованию и по порядку следования.


74-81: Корректная реализация вспомогательной функции!

Функция ИнициализироватьСтруктуруПередачиПараметровНаСервер имеет чёткое назначение и правильно размещена в разделе служебных процедур и функций. Структура содержит все необходимые ключи для передачи параметров на сервер.


59-60: Проверить обработку новых параметров на серверной стороне

Убедитесь, что серверный метод ФормированиеТаблицы корректно обрабатывает новый параметр ПоНаименованию из структуры параметров.

✅ Verification successful

Let me try a different approach to find the server-side implementation.


Параметр ПоНаименованию корректно обрабатывается на сервере

Анализ серверного кода показывает, что параметр ПоНаименованию корректно передается в параметры чтения файла через свойство СопоставлениеПоНаименованию (строка 40):

ПараметрыЧтения.СопоставлениеПоНаименованию = Параметры.ПоНаименованию;
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск определения серверного метода ФормированиеТаблицы
ast-grep --pattern 'Процедура ФормированиеТаблицы($$$)'

Length of output: 57


Script:

#!/bin/bash
# Search for server module with similar name
fd "пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера" --type f

# Search for the method implementation using ripgrep
rg "Процедура\s+ФормированиеТаблицы" -g "*.bsl" --with-filename --line-number -A 10

Length of output: 2149

src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера/Ext/Module.bsl (2)

30-31: Улучшена документация параметров!

Добавлена полезная ссылка на функцию инициализации структуры параметров, что улучшает понимание ожидаемого формата данных.


53-53: Корректная обработка типов данных!

Реализация правильно сохраняет типы данных колонок при создании заглушки, что важно для дальнейшей обработки данных.

Also applies to: 62-65

src/cf/Configuration.xml (2)

60-60: Обновление версии конфигурации.

Версия обновлена с 1.0.3.10 до 1.0.3.11, что соответствует внесенным изменениям в функциональность загрузки файлов из табличного документа.


283-284: Добавлены новые общие модули для расширения функциональности.

Новые модули соответствуют целям PR:

  • пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер для обработки загрузки файлов
  • пбп_ИнтеграцииFTPSFTP для работы с FTP/SFTP протоколами
✅ Verification successful

Let me generate additional scripts to check the actual implementation and usage of these modules to verify their proper integration.


Let me check the implementation of the new modules by looking at their actual code.


На основе проанализированного кода, я могу сформировать окончательный ответ.

Подтверждаю корректность добавления новых общих модулей.

Анализ показывает, что:

  • пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер содержит функционал для работы с табличными документами, включая конвертацию данных, обработку форматов дат и типизацию данных
  • пбп_ИнтеграцииFTPSFTP реализует полноценную поддержку протоколов FTP/SFTP с различными методами подключения (curl, sshpass, expect для Linux и WinSCP для Windows)

Оба модуля:

  • Имеют корректные настройки серверного исполнения
  • Содержат полную документацию методов
  • Правильно интегрированы в подсистемы конфигурации
  • Реализуют заявленную функциональность
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования новых модулей в других файлах конфигурации
echo "Поиск использования модуля ЗагрузкаФайлаЧерезТабличныйДокументСервер:"
rg -l "пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер"

echo "Поиск использования модуля ИнтеграцииFTPSFTP:"
rg -l "пбп_ИнтеграцииFTPSFTP"

Length of output: 1156


Script:

#!/bin/bash
# Проверим содержимое модулей и их использование
echo "=== Содержимое модуля пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер ==="
cat "src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.xml"

echo -e "\n=== Содержимое модуля пбп_ИнтеграцииFTPSFTP ==="
cat "src/cf/CommonModules/пбп_ИнтеграцииFTPSFTP.xml"

echo -e "\n=== Проверка использования в пбп_ИнтеграцииСервер ==="
cat "src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl"

echo -e "\n=== Проверка использования в пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера ==="
cat "src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера/Ext/Module.bsl"

Length of output: 33339


Script:

#!/bin/bash
# Проверим содержимое модулей
echo "=== Содержимое модуля пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl ==="
cat "src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl"

echo -e "\n=== Содержимое модуля пбп_ИнтеграцииFTPSFTP/Ext/Module.bsl ==="
cat "src/cf/CommonModules/пбп_ИнтеграцииFTPSFTP/Ext/Module.bsl"

Length of output: 71222

src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form.xml (1)

307-307: Корректное добавление поведения для групп элементов формы.

Добавление атрибута Behavior="Usual" для групп ГруппаДанныеСообщенияИсходящего и ГруппаДанныеСообщенияВходящего обеспечивает единообразное поведение элементов формы, что соответствует лучшим практикам разработки интерфейса.

Also applies to: 371-371

src/cf/CommonModules/пбп_ИнтеграцииFTPSFTP/Ext/Module.bsl (1)

1079-1079: Улучшение: Использование централизованной функции для получения номера месяца.

Замена локальной функции на централизованную пбп_ОбщегоНазначенияКлиентСервер.ПолучитьНомерМесяцаПоСтроковомуПредставлению улучшает поддерживаемость кода и обеспечивает единообразную обработку месяцев во всей системе.

src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl (1)

150-150: Проверьте порядок параметров в методе

Метод УстановитьПараметрыСоединенияПользователя может ожидать параметры в определенном порядке. Убедитесь, что порядок параметров соответствует ожиданиям метода.

Comment on lines +51 to +55
Функция НайтиПоСсылке(Пользователь) Экспорт

Возврат Неопределено;

КонецФункции
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Необходимо реализовать функционал поиска пользователя

Текущая реализация функции всегда возвращает Неопределено, что не соответствует документации. Функция должна искать пользователя ИБ по ссылке справочника.

Предлагаю следующую реализацию:

Функция НайтиПоСсылке(Пользователь) Экспорт
-	
-	Возврат Неопределено;
-	
+	
+	Если Не ЗначениеЗаполнено(Пользователь) Тогда
+		Возврат Неопределено;
+	КонецЕсли;
+	
+	ТекПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
+	
+	Если Не ПравоДоступа("Администрирование", Метаданные) 
+		И Пользователь <> ТекущийПользователь() Тогда
+		ВызватьИсключение НСтр("ru='Недостаточно прав доступа'");
+	КонецЕсли;
+	
+	Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
+		Если ПользовательИБ.Имя = Пользователь.Наименование Тогда
+			Возврат ПользовательИБ;
+		КонецЕсли;
+	КонецЦикла;
+	
+	Возврат Неопределено;
+	
КонецФункции

Committable suggestion was skipped due to low confidence.

Comment on lines 74 to 93
// Инициализирует таблицу со свойствами колонок загружаемого файла
//
// Возвращаемое значение:
// ТаблицаЗначений - таблица готовая для заполнения данных колонок
//
Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт

СвойстваКолонок = Новый ТаблицаЗначений;
ДлинаСтроки = 150;
СвойстваКолонок.Колонки.Добавить("ИмяКолонки" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ТипЗначения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ПолеПоиска1" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ПолеПоиска2" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ПолеПоиска3" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ОператорСравнения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(3));

Возврат СвойстваКолонок;

КонецФункции
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется вынести магическое число в константу!

Длина строки 150 символов используется многократно. Рекомендуется объявить её как константу для улучшения поддерживаемости кода.

Предлагаемые изменения:

 Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт
+    Const ДлинаСтрокиКолонки = 150;
     
     СвойстваКолонок = Новый ТаблицаЗначений;
-    ДлинаСтроки = 150;
-    СвойстваКолонок.Колонки.Добавить("ИмяКолонки"        , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
-    СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
-    СвойстваКолонок.Колонки.Добавить("ТипЗначения"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
-    СвойстваКолонок.Колонки.Добавить("ПолеПоиска1"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
-    СвойстваКолонок.Колонки.Добавить("ПолеПоиска2"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
-    СвойстваКолонок.Колонки.Добавить("ПолеПоиска3"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
+    СвойстваКолонок.Колонки.Добавить("ИмяКолонки"        , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
+    СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
+    СвойстваКолонок.Колонки.Добавить("ТипЗначения"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
+    СвойстваКолонок.Колонки.Добавить("ПолеПоиска1"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
+    СвойстваКолонок.Колонки.Добавить("ПолеПоиска2"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
+    СвойстваКолонок.Колонки.Добавить("ПолеПоиска3"       , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
📝 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
// Инициализирует таблицу со свойствами колонок загружаемого файла
//
// Возвращаемое значение:
// ТаблицаЗначений - таблица готовая для заполнения данных колонок
//
Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт
СвойстваКолонок = Новый ТаблицаЗначений;
ДлинаСтроки = 150;
СвойстваКолонок.Колонки.Добавить("ИмяКолонки" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ТипЗначения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ПолеПоиска1" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ПолеПоиска2" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ПолеПоиска3" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки));
СвойстваКолонок.Колонки.Добавить("ОператорСравнения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(3));
Возврат СвойстваКолонок;
КонецФункции
// Инициализирует таблицу со свойствами колонок загружаемого файла
//
// Возвращаемое значение:
// ТаблицаЗначений - таблица готовая для заполнения данных колонок
//
Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт
Const ДлинаСтрокиКолонки = 150;
СвойстваКолонок = Новый ТаблицаЗначений;
СвойстваКолонок.Колонки.Добавить("ИмяКолонки" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
СвойстваКолонок.Колонки.Добавить("ТипЗначения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
СвойстваКолонок.Колонки.Добавить("ПолеПоиска1" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
СвойстваКолонок.Колонки.Добавить("ПолеПоиска2" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
СвойстваКолонок.Колонки.Добавить("ПолеПоиска3" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки));
СвойстваКолонок.Колонки.Добавить("ОператорСравнения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(3));
Возврат СвойстваКолонок;
КонецФункции

Comment on lines 157 to 270
Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям(ИнтеграционныйПоток,
ПоляЗапроса = "", ПараметрыЗапроса = Неопределено, КоличествоПервых = 0, СтруктураИстории = Неопределено) Экспорт

ЗаголовокОшибки = "Данные не были получены из внешнего источника данных";
СообщениеОбОшибке = "";

РеквизитыОбъекта = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта(
ИнтеграционныйПоток, "НастройкаИнтеграции.ИмяОбъекта, ТочкаВхода");

Если Не ЗначениеЗаполнено(РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта) Тогда
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки,
"в настройках интеграции не заполнено наименование внешнего источника данных");
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки);
КонецЕсли;

Если Не ЗначениеЗаполнено(РеквизитыОбъекта.ТочкаВхода) Тогда
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки,
"в интеграционном потоке не заполнено имя таблицы внешнего источника данных");
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки);
КонецЕсли;

Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда
Возврат СообщениеОбОшибке;
КонецЕсли;

Попытка
ТаблицаВыборки = ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника(
РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта, РеквизитыОбъекта.ТочкаВхода, ПоляЗапроса);

Запрос = Новый Запрос;

ТекстЗапроса = "ВЫБРАТЬ
| &ПоляЗапроса
|ИЗ
| ВнешнийИсточникДанных." + РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта
+ ".Таблица." + РеквизитыОбъекта.ТочкаВхода + " КАК Таблица";

Если КоличествоПервых <> 0 Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ ПЕРВЫЕ " + КоличествоПервых);
КонецЕсли;

Если Не ПустаяСтрока(ПоляЗапроса) Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", ПоляЗапроса);
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", "Таблица.*");
КонецЕсли;

УсловияЗапроса = "";

// Установка предопределенных параметров запроса из интеграционного потока
Для Каждого СтрокаПредопределенногоПараметра Из ИнтеграционныйПоток.ПараметрыВхода Цикл
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", ?(ПустаяСтрока(УсловияЗапроса), "", "
| И "), СтрокаПредопределенногоПараметра.Имя);

Запрос.УстановитьПараметр(СтрокаПредопределенногоПараметра.Имя, СтрокаПредопределенногоПараметра.ЗначениеПоУмолчанию);
КонецЦикла;

// Установка опциональных параметров запроса
Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", ?(ПустаяСтрока(УсловияЗапроса), "", "
| И "), КлючИЗначение.Ключ);

Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;

Если Не ПустаяСтрока(УсловияЗапроса) Тогда
ТекстЗапроса = ТекстЗапроса + "
|ГДЕ
| " + УсловияЗапроса;
КонецЕсли;

Запрос.Текст = ТекстЗапроса;

Если СтруктураИстории <> Неопределено Тогда
СтруктураИстории.ИсходящееСообщение = пбп_ИнтеграцииСлужебный
.ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос);
НачалоВызова = ТекущаяДатаСеанса();
КонецЕсли;

РезультатЗапроса = Запрос.Выполнить();

Если СтруктураИстории <> Неопределено Тогда
СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова;
КонецЕсли;

ВыборкаРезультатаЗапроса = РезультатЗапроса.Выбрать();

Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
ЗаполнитьЗначенияСвойств(ТаблицаВыборки.Добавить(), ВыборкаРезультатаЗапроса);
КонецЦикла;

Возврат ТаблицаВыборки;
Исключение
СообщениеОбОшибке = ПолучитьПодробноеПредставлениеОшибкиИсключения(ЗаголовокОшибки, ИнформацияОбОшибке());
КонецПопытки;

Возврат СообщениеОбОшибке;

КонецФункции

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рассмотрите возможность разделения функции на более мелкие

Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям содержит много логики и длинна по коду. Для улучшения читаемости и поддерживаемости кода рекомендуется разделить ее на несколько функций, каждую из которых отвечает за свою задачу (например, создание текста запроса, установка параметров, обработка результатов).

Comment on lines +283 to +306
ИмяВнешнегоИсточника, ИмяТаблицы, НеобходимыеПоля = "") Экспорт

ТаблицаДанных = Новый ТаблицаЗначений;

МетаданныеИсточника = Метаданные.ВнешниеИсточникиДанных[ИмяВнешнегоИсточника];
МетаданныеТаблицы = МетаданныеИсточника.Таблицы[ИмяТаблицы];

МассивНужныхПолей = Новый Массив;
Если Не ПустаяСтрока(НеобходимыеПоля) Тогда
МассивНужныхПолей = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
НеобходимыеПоля, ",", Истина, Истина);
КонецЕсли;

КоличествоНужныхПолей = МассивНужныхПолей.Количество();
Для Каждого ПолеТаблицы Из МетаданныеТаблицы.Поля Цикл
Если КоличествоНужныхПолей <> 0 И МассивНужныхПолей.Найти(ПолеТаблицы.Имя) = Неопределено Тогда
Продолжить;
КонецЕсли;

ТаблицаДанных.Колонки.Добавить(ПолеТаблицы.Имя, ПолеТаблицы.Тип);
КонецЦикла;

Возврат ТаблицаДанных;

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Оптимизируйте инициализацию таблицы значений

В функции ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника можно улучшить производительность, предварительно проверяя, существует ли поле в МетаданныеТаблицы.Поля перед добавлением в массив нужных полей.

Comment on lines +147 to +148
ПользовательСсылка = пбп_ПользователиСлужебный.ТекущийПользователь();
ТекущийПользователь = пбп_ПользователиСлужебный.НайтиПоСсылке(ПользовательСсылка);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Добавьте проверку наличия текущего пользователя

Если метод НайтиПоСсылке не найдет пользователя, переменная ТекущийПользователь будет неопределенной, что может вызвать ошибки при дальнейшем использовании. Рекомендуется добавить проверку заполненности ТекущийПользователь.

Предлагаемый код:

ПользовательСсылка = пбп_ПользователиСлужебный.ТекущийПользователь();
ТекущийПользователь = пбп_ПользователиСлужебный.НайтиПоСсылке(ПользовательСсылка);
+Если Не ЗначениеЗаполнено(ТекущийПользователь) Тогда
+    // Обработка ситуации, когда пользователь не найден
+    Возврат;
+КонецЕсли;

Committable suggestion was skipped due to low confidence.

Comment on lines 229 to 235
Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", ?(ПустаяСтрока(УсловияЗапроса), "", "
| И "), КлючИЗначение.Ключ);

Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;

Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Добавьте проверку на наличие параметров запроса

Если ПараметрыЗапроса не заполнены или равны Неопределено, цикл Для Каждого может вызвать ошибку. Рекомендуется добавить проверку перед циклом.

Предлагаемый код:

+Если ПараметрыЗапроса <> Неопределено Тогда
    Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл
        // существующий код
    КонецЦикла;
+КонецЕсли;

Committable suggestion was skipped due to low confidence.

Comment on lines +70 to +75
Исключение
ТекстОшибки = НСтр("ru = 'Загрузка файла через табличный документ.Удаление временного файла'");
ЗаписьЖурналаРегистрации(ТекстОшибки,
УровеньЖурналаРегистрации.Ошибка, , ,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Улучшите обработку исключений при удалении временного файла.

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

Comment on lines 300 to 316
Если ТипКолонки.СодержитТип(Тип("Null")) Тогда

ИмяКолонки = ТаблицаЗначений.Колонки[чИндекс].Имя;
ЗагКолонки = ТаблицаЗначений.Колонки[чИндекс].Заголовок;
ШирКолонки = ТаблицаЗначений.Колонки[чИндекс].Ширина;
ЗнчКолонки = ТаблицаЗначений.ВыгрузитьКолонку(чИндекс);
ТипКолонки = Новый ОписаниеТипов(ТипКолонки, ,"NULL"
,ТипКолонки.КвалификаторыЧисла
,ТипКолонки.КвалификаторыСтроки
,ТипКолонки.КвалификаторыДаты
,ТипКолонки.КвалификаторыДвоичныхДанных
);

ТаблицаЗначений.Колонки.Удалить(чИндекс);
ТаблицаЗначений.Колонки.Вставить(чИндекс, ИмяКолонки, ТипКолонки, ЗагКолонки, ШирКолонки);
ТаблицаЗначений.ЗагрузитьКолонку(ЗнчКолонки, чИндекс);

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

⚠️ Potential issue

Избегайте изменения структуры таблицы во время итерации по колонкам.

В процедуре ТаблицаЗначенийБезNull происходит удаление и вставка колонок внутри цикла по индексам, что может привести к смещению индексов и ошибкам. Рекомендуется сначала собрать список колонок для изменения, а затем применять изменения после завершения цикла.

ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправьте опечатку в имени переменной Табдок.

На строке 77 используется переменная Табдок с маленькой буквой "д", тогда как в остальном коде используется ТабДок с большой буквой "Д". Это может привести к ошибкам во время выполнения из-за неверного обращения к переменной.

Предлагаемый исправленный код:

- Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено);
+ Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), ТабДок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено);
📝 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
Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено);
Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), ТабДок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено);

Comment on lines +99 to +113
Счетчик = 0;
ТЗ[Н].ПорядковыйНомер = Н;

Для Каждого Колонка Из ТЗ.Колонки Цикл
Если Не ЗначениеЗаполнено(ТЗ[Н][Колонка.Имя]) Тогда
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;

Если Счетчик = ТЗ.Колонки.Количество() Тогда
ТЗ.Удалить(Н);
КонецЕсли;

Н = Н - 1;

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

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

Текущая реализация удаления пустых строк через подсчет незаполненных полей может быть неэффективной. Предлагается использовать метод ТЗ.Итог() для определения пустых строк или применять фильтрацию таблицы значений.

Предложенный вариант:

Пока Не Н < 0 Цикл
-   Счетчик = 0;
-   ТЗ[Н].ПорядковыйНомер = Н;
-   Для Каждого Колонка Из ТЗ.Колонки Цикл
-       Если Не ЗначениеЗаполнено(ТЗ[Н][Колонка.Имя]) Тогда
-           Счетчик = Счетчик + 1;
-       КонецЕсли;
-   КонецЦикла;
-   Если Счетчик = ТЗ.Колонки.Количество() Тогда
+   Если Не ЕстьЗаполненныхЗначений(ТЗ[Н]) Тогда
        ТЗ.Удалить(Н);
    КонецЕсли;
    Н = Н - 1;
КонецЦикла;

Где ЕстьЗаполненныхЗначений — функция, проверяющая наличие заполненных значений в строке.

Committable suggestion was skipped due to low confidence.

Copy link

Failed

  • E Reliability Rating on New Code (is worse than A)

Analysis Details

63 Issues

  • Bug 4 Bugs
  • Vulnerability 0 Vulnerabilities
  • Code Smell 59 Code Smells

Coverage and Duplications

  • Coverage No coverage information (0.00% Estimated after merge)
  • Duplications 0.00% Duplicated Code (0.40% Estimated after merge)

Project ID: PSSL

View in SonarQube

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🧹 Outside diff range and nitpick comments (5)
src/cf/Enums/пбп_НаправленияИнтеграционныхПотоков.xml (1)

3-17: Рекомендуется добавить документацию для перечисления

Хотя структура перечисления корректна, рекомендуется добавить описание назначения перечисления в секции Comment для улучшения поддержки кода.

src/cf/Enums/пбп_СтатусыИнтеграции.xml (2)

163-174: Добавьте перевод и документацию для статуса "Служебный"

Для поддержания консистентности с другими значениями перечисления, необходимо:

  1. Добавить английский перевод в секцию Synonym
  2. Добавить описание назначения статуса в поле Comment

Предлагаемые изменения:

 <EnumValue uuid="2c1d93db-ac2f-4691-8a12-692f951bae4b">
     <Properties>
         <Name>Служебный</Name>
         <Synonym>
             <v8:item>
                 <v8:lang>ru</v8:lang>
                 <v8:content>Служебный</v8:content>
             </v8:item>
+            <v8:item>
+                <v8:lang>en</v8:lang>
+                <v8:content>Service</v8:content>
+            </v8:item>
         </Synonym>
-        <Comment/>
+        <Comment>Статус для служебных операций интеграции</Comment>
     </Properties>
 </EnumValue>

175-186: Добавьте перевод и документацию для статуса "ОшибкаСлужебного"

Для поддержания консистентности с другими значениями перечисления, необходимо:

  1. Добавить английский перевод в секцию Synonym
  2. Добавить описание назначения статуса в поле Comment

Предлагаемые изменения:

 <EnumValue uuid="da42d75a-deb5-4095-a4e6-2e5c319cc058">
     <Properties>
         <Name>ОшибкаСлужебного</Name>
         <Synonym>
             <v8:item>
                 <v8:lang>ru</v8:lang>
                 <v8:content>Ошибка служебного</v8:content>
             </v8:item>
+            <v8:item>
+                <v8:lang>en</v8:lang>
+                <v8:content>Service Error</v8:content>
+            </v8:item>
         </Synonym>
-        <Comment/>
+        <Comment>Статус ошибки при выполнении служебных операций интеграции</Comment>
     </Properties>
 </EnumValue>
src/cf/CommonModules/пбп_ИнтеграцииСлужебный/Ext/Module.bsl (1)

86-91: Корректно добавлена обработка служебных потоков!

Логика обработки статусов для служебных потоков реализована правильно, но есть замечание по форматированию кода.

Предлагаю исправить отступы для соответствия стилю кода:

-    Иначе
-        Если НовоеСообщение.Ошибка Тогда
-            НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.ОшибкаСлужебного;
-        Иначе
-            НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.Служебный;
-        КонецЕсли;
+	Иначе
+		Если НовоеСообщение.Ошибка Тогда
+			НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.ОшибкаСлужебного;
+		Иначе
+			НовоеСообщение.Статус = Перечисления.пбп_СтатусыИнтеграции.Служебный;
+		КонецЕсли;
src/cf/Catalogs/пбп_ИнтеграционныеПотоки.xml (1)

324-363: Добавьте английский перевод для атрибута.

Для поддержки многоязычности рекомендуется добавить английский перевод в секцию Synonym:

 					<Synonym>
 						<v8:item>
 							<v8:lang>ru</v8:lang>
 							<v8:content>Направление потока</v8:content>
 						</v8:item>
+						<v8:item>
+							<v8:lang>en</v8:lang>
+							<v8:content>Flow Direction</v8:content>
+						</v8:item>
 					</Synonym>
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between d7ce071 and 177b79a.

📒 Files selected for processing (8)
  • src/cf/Catalogs/пбп_ИнтеграционныеПотоки.xml (1 hunks)
  • src/cf/Catalogs/пбп_ИнтеграционныеПотоки/Forms/ФормаЭлемента/Ext/Form.xml (1 hunks)
  • src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form/Module.bsl (1 hunks)
  • src/cf/CommonModules/пбп_ИнтеграцииСлужебный/Ext/Module.bsl (2 hunks)
  • src/cf/Configuration.xml (4 hunks)
  • src/cf/Enums/пбп_НаправленияИнтеграционныхПотоков.xml (1 hunks)
  • src/cf/Enums/пбп_СтатусыИнтеграции.xml (1 hunks)
  • src/cf/Subsystems/пбп_УправлениеИнтеграциями.xml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/cf/Configuration.xml
🧰 Additional context used
🔇 Additional comments (9)
src/cf/Enums/пбп_НаправленияИнтеграционныхПотоков.xml (2)

1-2: Корректное объявление XML и пространств имен!

Структура файла соответствует стандартам 1С:Предприятие.


18-39: Проверьте необходимость форм списка и выбора

Отключены стандартные команды (UseStandardCommands = false), но не определены пользовательские формы списка и выбора. Убедитесь, что это соответствует требованиям:

  • DefaultListForm
  • DefaultChoiceForm
  • AuxiliaryListForm
  • AuxiliaryChoiceForm
✅ Verification successful

Let me check how this enum is used in the found files to better understand if custom forms are really needed.


Let me check if there are any form definitions for this enum in a separate directory, as they might be defined externally.


Based on the analysis, I can now provide the final response:

Отсутствие форм является корректным

Отключение стандартных команд (UseStandardCommands = false) и отсутствие пользовательских форм является допустимым, так как:

  • Перечисление используется только как тип данных в справочнике пбп_ИнтеграционныеПотоки
  • Включен быстрый выбор (QuickChoice = true)
  • Установлен режим выбора BothWays, что позволяет использовать встроенный механизм выбора
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования перечисления в формах
rg -l "пбп_НаправленияИнтеграционныхПотоков" --type xml

Length of output: 476


Script:

#!/bin/bash
# Check usage context in related files
echo "=== Configuration.xml ===="
rg -A 5 "пбп_НаправленияИнтеграционныхПотоков" src/cf/Configuration.xml

echo -e "\n=== Subsystem usage ===="
rg -A 5 "пбп_НаправленияИнтеграционныхПотоков" src/cf/Subsystems/пбп_УправлениеИнтеграциями.xml

echo -e "\n=== Catalog usage ===="
rg -A 5 "пбп_НаправленияИнтеграционныхПотоков" src/cf/Catalogs/пбп_ИнтеграционныеПотоки.xml

Length of output: 2218


Script:

#!/bin/bash
# Поиск форм перечисления в каталоге форм
fd "пбп_НаправленияИнтеграционныхПотоков" src/cf/Enums -t f -e xml

# Проверка использования в атрибутах других форм
echo "=== Использование в формах ==="
rg -C 3 "пбп_НаправленияИнтеграционныхПотоков" src/cf/Forms/ || echo "Директория Forms не найдена или упоминаний нет"

Length of output: 905

src/cf/Subsystems/пбп_УправлениеИнтеграциями.xml (1)

52-52: Корректное добавление перечисления в подсистему

Добавление перечисления пбп_НаправленияИнтеграционныхПотоков в подсистему логично дополняет функциональность управления интеграциями и соответствует общей структуре изменений.

Выполним проверку наличия файла перечисления:

✅ Verification successful

Let me verify the enum's content to ensure it's properly defined:


Подтверждено корректное добавление перечисления в подсистему

Перечисление пбп_НаправленияИнтеграционныхПотоков корректно определено и содержит все необходимые значения для управления направлениями интеграционных потоков (Входящий, Исходящий, Служебный). Структура файла и его содержимое полностью соответствуют требованиям платформы 1С:Предприятие.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка существования файла перечисления
fd "пбп_НаправленияИнтеграционныхПотоков.xml" --type f

Length of output: 356


Script:

#!/bin/bash
# Проверка содержимого файла перечисления
cat "src/cf/Enums/пбп_НаправленияИнтеграционныхПотоков.xml"

Length of output: 3579

src/cf/Enums/пбп_СтатусыИнтеграции.xml (1)

163-186: Проверьте использование новых значений перечисления

Необходимо убедиться, что новые статусы корректно обрабатываются во всех местах использования перечисления пбп_СтатусыИнтеграции.

✅ Verification successful

Let me try a different approach to search for these enum values in the codebase.


Let me search specifically for the usage of these enum values in the integration-related code.


Let me try one final search without specifying the file type:


На основе анализа кода, я могу сформировать окончательный ответ:

Новые значения перечисления корректно используются в коде

Анализ показал, что новые статусы Служебный и ОшибкаСлужебного правильно интегрированы в существующую логику обработки статусов интеграции:

  • В модуле пбп_ИнтеграцииСлужебный статусы используются для маркировки результатов служебных операций:

    • Служебный - для успешных служебных операций
    • ОшибкаСлужебного - при возникновении ошибок в служебных операциях
  • В форме элемента справочника пбп_ИсторияИнтеграции эти статусы корректно обрабатываются в функции НаправлениеИнтеграцииВыгружено

Новые значения перечисления логично встроены в существующую систему статусов интеграции и используются по назначению - для идентификации результатов выполнения служебных операций.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск использования новых значений перечисления
echo "Поиск использования статуса 'Служебный':"
rg -l "Служебный|Service" --type bsl

echo -e "\nПоиск использования статуса 'ОшибкаСлужебного':"
rg -l "ОшибкаСлужебного|ServiceError" --type bsl

Length of output: 359


Script:

#!/bin/bash
# Поиск файлов с расширением .bsl
echo "Поиск bsl файлов:"
fd '\.bsl$'

echo -e "\nПоиск использования статусов в bsl файлах:"
fd '\.bsl$' --exec rg -l "Служебный|ОшибкаСлужебного"

echo -e "\nПоиск других файлов, где могут использоваться статусы:"
fd '\.xml$' --exec rg -l "Служебный|ОшибкаСлужебного"

Length of output: 30060


Script:

#!/bin/bash
# Поиск использования статусов в модулях интеграции
echo "Поиск в модулях интеграции:"
rg -l "пбп_СтатусыИнтеграции" --type bsl

echo -e "\nПросмотр контекста использования:"
rg -C 5 "пбп_СтатусыИнтеграции\.Служебный|пбп_СтатусыИнтеграции\.ОшибкаСлужебного" --type bsl

Length of output: 483


Script:

#!/bin/bash
# Поиск использования перечисления в файлах
echo "Поиск использования перечисления:"
rg -C 5 "пбп_СтатусыИнтеграции"

echo -e "\nПоиск конкретных значений:"
rg -C 5 "Служебный|ОшибкаСлужебного" src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl src/cf/CommonModules/пбп_ИнтеграцииСлужебный/Ext/Module.bsl

Length of output: 25106

src/cf/Catalogs/пбп_ИнтеграционныеПотоки/Forms/ФормаЭлемента/Ext/Form.xml (1)

91-96: Проверьте добавление поля направления потока

Поле корректно добавлено в форму, но рекомендуется:

  1. Добавить обработчик события ПриИзменении для синхронизации с другими полями формы
  2. Рассмотреть необходимость добавления подсказки в ExtendedTooltip для улучшения UX
src/cf/CommonModules/пбп_ИнтеграцииСлужебный/Ext/Module.bsl (2)

56-58: Документация корректно обновлена!

Описание параметров процедуры соответствует текущей сигнатуре.


72-74: Улучшена логика определения направления потока!

Использование НаправлениеПотока непосредственно из объекта интеграционного потока делает код более поддерживаемым и уменьшает вероятность ошибок.

src/cf/Catalogs/пбп_ИсторияИнтеграции/Forms/ФормаЭлемента/Ext/Form/Module.bsl (1)

282-284: Корректное расширение условий проверки статуса!

Добавление проверок на статусы Служебный и ОшибкаСлужебного логично дополняет существующую функциональность.

Давайте проверим использование новых статусов в кодовой базе:

✅ Verification successful

Based on the search results, I can now generate the final response since we have found clear evidence of the new statuses being used consistently in the codebase.

Подтверждено корректное использование новых статусов интеграции

Проверка показала, что новые статусы Служебный и ОшибкаСлужебного корректно используются в системе:

  • В модуле формы пбп_ИсторияИнтеграции для проверки состояния выгрузки
  • В общем модуле пбп_ИнтеграцииСлужебный для установки статусов новых сообщений

Изменения логически согласованы и правильно интегрированы в существующий код.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск использования новых статусов интеграции
# Ожидаемый результат: Найти все места, где используются новые статусы

echo "Поиск использования статуса 'Служебный':"
rg -A 2 "пбп_СтатусыИнтеграции\.Служебный"

echo "Поиск использования статуса 'ОшибкаСлужебного':"
rg -A 2 "пбп_СтатусыИнтеграции\.ОшибкаСлужебного"

Length of output: 1628

src/cf/Catalogs/пбп_ИнтеграционныеПотоки.xml (1)

324-363: Корректная реализация атрибута НаправлениеПотока.

Атрибут правильно сконфигурирован:

  • Использование перечисления для ограничения допустимых значений
  • Обязательное заполнение (FillChecking=ShowError)
  • Корректные настройки индексации и полнотекстового поиска

Comment on lines +40 to +77
<ChildObjects>
<EnumValue uuid="4089864a-2bf2-4922-b485-7e7751dafd2f">
<Properties>
<Name>Исходящий</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Исходящий</v8:content>
</v8:item>
</Synonym>
<Comment/>
</Properties>
</EnumValue>
<EnumValue uuid="2b79cd73-4039-40e2-87cc-845401beac8e">
<Properties>
<Name>Входящий</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Входящий</v8:content>
</v8:item>
</Synonym>
<Comment/>
</Properties>
</EnumValue>
<EnumValue uuid="1475f3e9-3b55-4fca-baea-975a0f14ad7e">
<Properties>
<Name>Служебный</Name>
<Synonym>
<v8:item>
<v8:lang>ru</v8:lang>
<v8:content>Служебный</v8:content>
</v8:item>
</Synonym>
<Comment/>
</Properties>
</EnumValue>
</ChildObjects>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рассмотрите добавление порядка сортировки значений

Для улучшения пользовательского интерфейса рекомендуется добавить атрибут <Order> для каждого значения перечисления. Это обеспечит консистентный порядок отображения в пользовательском интерфейсе.

Пример реализации:

 <EnumValue uuid="4089864a-2bf2-4922-b485-7e7751dafd2f">
   <Properties>
     <Name>Исходящий</Name>
+    <Order>1</Order>
     <Synonym>

Committable suggestion was skipped due to low confidence.

Comment on lines +91 to +96
<InputField name="НаправлениеПотока" id="59">
<DataPath>Объект.НаправлениеПотока</DataPath>
<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>
<ContextMenu name="НаправлениеПотокаКонтекстноеМеню" id="60"/>
<ExtendedTooltip name="НаправлениеПотокаРасширеннаяПодсказка" id="61"/>
</InputField>
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендация по улучшению структуры формы

Для поддержания единообразия с другими полями формы (например, ПользовательскаяФункция), рекомендуется добавить следующие атрибуты:

  • EditMode="EnterOnInput"
  • EditTextUpdate="OnValueChange"
 <InputField name="НаправлениеПотока" id="59">
 	<DataPath>Объект.НаправлениеПотока</DataPath>
+	<EditMode>EnterOnInput</EditMode>
+	<EditTextUpdate>OnValueChange</EditTextUpdate>
 	<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>
 	<ContextMenu name="НаправлениеПотокаКонтекстноеМеню" id="60"/>
 	<ExtendedTooltip name="НаправлениеПотокаРасширеннаяПодсказка" id="61"/>
 </InputField>
📝 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
<InputField name="НаправлениеПотока" id="59">
<DataPath>Объект.НаправлениеПотока</DataPath>
<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>
<ContextMenu name="НаправлениеПотокаКонтекстноеМеню" id="60"/>
<ExtendedTooltip name="НаправлениеПотокаРасширеннаяПодсказка" id="61"/>
</InputField>
<InputField name="НаправлениеПотока" id="59">
<DataPath>Объект.НаправлениеПотока</DataPath>
<EditMode>EnterOnInput</EditMode>
<EditTextUpdate>OnValueChange</EditTextUpdate>
<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues>
<ContextMenu name="НаправлениеПотокаКонтекстноеМеню" id="60"/>
<ExtendedTooltip name="НаправлениеПотокаРасширеннаяПодсказка" id="61"/>
</InputField>

Copy link

Failed

  • E Reliability Rating on New Code (is worse than A)

Analysis Details

24 Issues

  • Bug 3 Bugs
  • Vulnerability 0 Vulnerabilities
  • Code Smell 21 Code Smells

Coverage and Duplications

  • Coverage No coverage information (0.00% Estimated after merge)
  • Duplications 0.00% Duplicated Code (0.40% Estimated after merge)

Project ID: PSSL

View in SonarQube

Copy link

Passed

Analysis Details

29 Issues

  • Bug 0 Bugs
  • Vulnerability 0 Vulnerabilities
  • Code Smell 29 Code Smells

Coverage and Duplications

  • Coverage No coverage information (0.00% Estimated after merge)
  • Duplications 0.00% Duplicated Code (0.40% Estimated after merge)

Project ID: PSSL

View in SonarQube

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 11

🧹 Outside diff range and nitpick comments (1)
src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера/Ext/Module.bsl (1)

74-95: Требуется улучшение документации функции!

Необходимо дополнить документацию функции:

  • Описать назначение каждой колонки
  • Указать допустимые значения для колонки ОператорСравнения
  • Добавить пример использования

Предлагаемый формат документации:

 // Инициализирует таблицу со свойствами колонок загружаемого файла
 // 
+// Колонки:
+//  * ИмяКолонки - Строка(150) - Имя колонки в результирующей таблице
+//  * ИмяВТабДоке - Строка(150) - Имя колонки в исходном табличном документе
+//  * ТипЗначения - Строка(150) - Имя типа значения в формате встроенного языка
+//  * ПолеПоиска1 - Строка(150) - Первое поле для поиска значений
+//  * ПолеПоиска2 - Строка(150) - Второе поле для поиска значений
+//  * ПолеПоиска3 - Строка(150) - Третье поле для поиска значений
+//  * ОператорСравнения - Строка(3) - Оператор сравнения для поиска ("И", "ИЛИ")
+//
+// Пример:
+//  СвойстваКолонок = ИнициализироватьТаблицуСоСвойствамиКолонок();
+//  НоваяСтрока = СвойстваКолонок.Добавить();
+//  НоваяСтрока.ИмяКолонки = "Номенклатура";
+//  НоваяСтрока.ИмяВТабДоке = "Наименование";
+//  НоваяСтрока.ТипЗначения = "СправочникСсылка.Номенклатура";
+//  НоваяСтрока.ОператорСравнения = "И";
 // 
 // Возвращаемое значение:
 //  ТаблицаЗначений - таблица готовая для заполнения данных колонок
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 177b79a and c000bed.

📒 Files selected for processing (5)
  • src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументВызовСервера/Ext/Module.bsl (3 hunks)
  • src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl (3 hunks)
  • src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl (1 hunks)
  • src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl (1 hunks)
  • src/cf/CommonModules/пбп_ИнтеграцииСлужебный/Ext/Module.bsl (3 hunks)
🧰 Additional context used
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results
src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl

[notice] 39-39: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl#L39
Справа от ',' не хватает пробела


[notice] 39-39: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl#L39
Добавьте описание метода программного интерфейса

src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl

[failure] 342-342: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L342
Уменьшите когнитивную сложность "ПолучитьПромежуточнуюТаблицуЗначенийИзТабличногоДокумента" с 18 до 15


[notice] 320-320: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L320
Справа от ',' не хватает пробела


[warning] 492-492: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L492
Длина строки 121 превышает максимально допустимую 120


[failure] 56-56: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L56
Уменьшите цикломатическую сложность "КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений" с 41 до 20


[failure] 581-581: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L581
Метод ПолучитьНомерМесяцаПоСтроковомуПредставлению общего модуля пбп_ОбщегоНазначенияКлиентСервер не существует


[failure] 513-513: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L513
Уменьшите когнитивную сложность "ПолучитьНомерФорматаДатыИзСтроки" с 20 до 15


[warning] 276-276: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L276
Полю "ВставкаСсылочныеВставкаБазовые" не назначен псевдоним или пропущено ключевое слово КАК


[warning] 226-226: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L226
Синтаксическая конструкция вида "Если...Тогда...ИначеЕсли..." должна содержать ветвь "Иначе".


[failure] 189-189: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L189
Превышен допустимый уровень вложенности управляющих конструкций


[failure] 681-681: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L681
Метод ПолучитьНомерМесяцаПоСтроковомуПредставлению общего модуля пбп_ОбщегоНазначенияКлиентСервер не существует


[failure] 180-180: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L180
Превышен допустимый уровень вложенности управляющих конструкций


[failure] 612-612: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L612
Уменьшите цикломатическую сложность "ПреобразоватьДатуИзСтрокиПоФормату" с 22 до 20


[failure] 612-612: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L612
Уменьшите когнитивную сложность "ПреобразоватьДатуИзСтрокиПоФормату" с 33 до 15


[warning] 268-268: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L268
Полю "ВставкаВТ" не назначен псевдоним или пропущено ключевое слово КАК


[warning] 56-56: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L56
Длина метода "КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений" равна 236, что больше установленного лимита в 200 строк


[failure] 56-56: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L56
Уменьшите когнитивную сложность "КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений" с 86 до 15

src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl

[warning] 202-202: src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L202
Текст запроса должен быть корректным и открываться конструктором запросов


[warning] 171-171: src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L171
Уменьшите количество необязательных параметров c 4 до допустимого 3


[failure] 171-171: src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L171
Уменьшите когнитивную сложность "ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям" с 17 до 15

🔇 Additional comments (6)
src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl (3)

25-37: Документация функции оформлена корректно!

Подробное описание параметров и возвращаемого значения соответствует стандартам документирования.


75-82: Отличное решение по структурированию параметров!

Выделение инициализации структуры параметров в отдельную функцию улучшает читаемость и поддерживаемость кода.


Line range hint 39-69: Требуется форматирование сигнатуры функции.

Необходимо добавить пробел после запятой в объявлении функции для соответствия стандартам кодирования.

Предлагаемое исправление:

-Асинх Функция ЗагрузитьИзXLS(АдресСоответствияКолонок,НазваниеЛиста = "",
+Асинх Функция ЗагрузитьИзXLS(АдресСоответствияКолонок, НазваниеЛиста = "",

Проверьте использование нового параметра в других модулях.

Добавление параметра СопоставлениеПоНаименованию может потребовать обновления вызовов функции в других местах.

✅ Verification successful

Let me check the actual usage of this function by examining the content of these files.


Требуется только форматирование, функциональных изменений не требуется

Проверка показала, что новый параметр СопоставлениеПоНаименованию имеет значение по умолчанию Ложь, а существующие вызовы функции в документации используют только первые два параметра. Это означает, что добавление нового параметра не нарушает обратную совместимость.

Единственное необходимое изменение - это форматирование сигнатуры функции:

-Асинх Функция ЗагрузитьИзXLS(АдресСоответствияКолонок,НазваниеЛиста = "",
+Асинх Функция ЗагрузитьИзXLS(АдресСоответствияКолонок, НазваниеЛиста = "",
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск всех вызовов функции ЗагрузитьИзXLS
rg -l "ЗагрузитьИзXLS\(" 

Length of output: 152


Script:

#!/bin/bash
# Check content of both files
echo "=== Module.bsl content ==="
rg -A 5 "ЗагрузитьИзXLS\(" src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl

echo -e "\n=== Documentation content ==="
rg -A 5 "ЗагрузитьИзXLS\(" docs/ЗагрузкаФайлаЧерезТабличныйДокумент.md

Length of output: 1391

🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[notice] 39-39: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl#L39
Справа от ',' не хватает пробела


[notice] 39-39: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументКлиент/Ext/Module.bsl#L39
Добавьте описание метода программного интерфейса

src/cf/CommonModules/пбп_ИнтеграцииСлужебный/Ext/Module.bsl (1)

Line range hint 56-91: Улучшена обработка статусов интеграции!

Изменения улучшают код за счет:

  • Упрощения интерфейса процедуры путем удаления избыточного параметра ЭтоЗагрузка
  • Добавления корректной обработки служебных сообщений
  • Использования более структурированного подхода с перечислением НаправлениеПотока
src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl (2)

147-150: Добавьте проверку наличия текущего пользователя


289-312: Оптимизируйте инициализацию таблицы значений

Comment on lines +62 to +65
МакетТаблица = ПолучитьИзВременногоХранилища(Макет);

Для Каждого КолонкаТаблицы Из МакетТаблица Цикл
Заглушка.Колонки.Добавить(КолонкаТаблицы.ИмяКолонки, Новый ОписаниеТипов(КолонкаТаблицы.ТипЗначения));
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Необходима проверка структуры входных данных!

Текущая реализация предполагает определенную структуру входных данных без её проверки. Необходимо:

  • Добавить проверку существования колонок ИмяКолонки и ТипЗначения
  • Обработать возможные ошибки при работе с временным хранилищем

Предлагаемые изменения:

+    Если Не ЗначениеЗаполнено(Макет) Тогда
+        ВызватьИсключение НСтр("ru='Не указан адрес макета во временном хранилище'");
+    КонецЕсли;
+    
     МакетТаблица = ПолучитьИзВременногоХранилища(Макет);
+    
+    Если МакетТаблица = Неопределено Тогда
+        ВызватьИсключение НСтр("ru='Не удалось получить данные из временного хранилища'");
+    КонецЕсли;
+    
+    Если МакетТаблица.Колонки.Найти("ИмяКолонки") = Неопределено 
+        Или МакетТаблица.Колонки.Найти("ТипЗначения") = Неопределено Тогда
+        ВызватьИсключение НСтр("ru='Некорректная структура входных данных'");
+    КонецЕсли;
📝 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
МакетТаблица = ПолучитьИзВременногоХранилища(Макет);
Для Каждого КолонкаТаблицы Из МакетТаблица Цикл
Заглушка.Колонки.Добавить(КолонкаТаблицы.ИмяКолонки, Новый ОписаниеТипов(КолонкаТаблицы.ТипЗначения));
Если Не ЗначениеЗаполнено(Макет) Тогда
ВызватьИсключение НСтр("ru='Не указан адрес макета во временном хранилище'");
КонецЕсли;
МакетТаблица = ПолучитьИзВременногоХранилища(Макет);
Если МакетТаблица = Неопределено Тогда
ВызватьИсключение НСтр("ru='Не удалось получить данные из временного хранилища'");
КонецЕсли;
Если МакетТаблица.Колонки.Найти("ИмяКолонки") = Неопределено
Или МакетТаблица.Колонки.Найти("ТипЗначения") = Неопределено Тогда
ВызватьИсключение НСтр("ru='Некорректная структура входных данных'");
КонецЕсли;
Для Каждого КолонкаТаблицы Из МакетТаблица Цикл
Заглушка.Колонки.Добавить(КолонкаТаблицы.ИмяКолонки, Новый ОписаниеТипов(КолонкаТаблицы.ТипЗначения));

Comment on lines +35 to +46
ХранилищеИсточников.Вставить(РазбивкаТипа[1], ?(ВхождениеИсточника = Неопределено, 1, ВхождениеИсточника + 1));
Итерация = ?(ХранилищеИсточников.Получить(РазбивкаТипа[1]) = 0, "", Строка(ХранилищеИсточников.Получить(РазбивкаТипа[1])));

Если РазбивкаТипа[0] = "Документ" Тогда
РеквизитСравнения = "Номер";
Иначе
РеквизитСравнения = "Наименование";
КонецЕсли;

ВставкаСсылочные = ВставкаСсылочные + РазбивкаТипа[1] + Итерация + ".Ссылка КАК " + Колонка.Ключ + "," + Символы.ПС;

Если Не СтрНайти(ВставкаИсточники, " " + РазбивкаТипа[1] + " ") > 0 Тогда
ВставкаИсточники = ВставкаИсточники + "
| ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(Колонка.Значение, "Ссылка", "") + " КАК " + РазбивкаТипа[1] + Итерация + "
| ПО " + "ВходнаяТаблица." + Колонка.Ключ + " <> """" И " + "ВходнаяТаблица." + Колонка.Ключ + " <> 0" + "
| И (ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + РеквизитСравнения + Символы.ПС;

Если СтрНайти(РазбивкаТипа[1], "Номенклатура") > 0 Тогда
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Артикул" + Символы.ПС;
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС;
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС;
ИначеЕсли СтрНайти(Колонка.Значение, "Справочник") > 0
И Не СтрНайти(Колонка.Значение, "Организации") > 0 Тогда
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС;
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС;
КонецЕсли;

ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "Служебный," + Символы.ПС;
ВставкаИсточники = ВставкаИсточники + ")";
КонецЕсли;

ИначеЕсли СтрНайти(Колонка.Значение, "Перечисление") <> 0 Тогда
КолонкаПеречисления = ТЗ.Колонки.Добавить(Колонка.Ключ + "НеОбрабатывать", Новый ОписаниеТипов(Колонка.Значение));
СоответствиеПеречислений.Вставить(Колонка.Ключ, Колонка.Значение);
ВставкаВТ = СтрЗаменить(ВставкаВТ, "." + Колонка.Ключ + " КАК", "." + КолонкаПеречисления.Имя + " КАК");
ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС;
ИначеЕсли Не СтрНайти(Колонка.Ключ, "НеОбрабатывать") > 0 Тогда
ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС;
КонецЕсли;

КонецЦикла;

ВставкаВТ = ВставкаВТ + "ВходнаяТаблица.ПорядковыйНомер Как ПорядковыйНомер";
ВставкаБазовые = Лев(ВставкаБазовые, СтрДлина(ВставкаБазовые) - 2);
ОТЧ = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15));

Для Каждого СтрокаТаблицы Из ТЗ Цикл

Для Каждого ИмяМассива Из МассивИменСсылочных Цикл
СтрокаТаблицы[ИмяМассива + "КодЧислом"] = ОТЧ.ПривестиЗначение(СтрокаТаблицы[ИмяМассива]);
КонецЦикла;

Для Каждого Колонка Из СоответствиеПеречислений Цикл

Для Каждого ТекЭлемент Из Метаданные.Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")].ЗначенияПеречисления Цикл
Если нРег(ТекЭлемент.Синоним) = нРег(СтрокаТаблицы[Колонка.Ключ]) Тогда
СтрокаТаблицы[Колонка.Ключ + "НеОбрабатывать"] = Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")][ТекЭлемент.Имя];
Прервать;
КонецЕсли;
КонецЦикла;

КонецЦикла;

КонецЦикла;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| #ВставкаВТ
|ПОМЕСТИТЬ ВходнаяТаблица
|ИЗ
| &ВходнаяТаблица КАК ВходнаяТаблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| #ВставкаСсылочные
| #ВставкаБазовые
|ИЗ
| ВходнаяТаблица КАК ВходнаяТаблица
| #ВставкаИсточники
|
|УПОРЯДОЧИТЬ ПО
| ВходнаяТаблица.ПорядковыйНомер";

Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаВТ", ВставкаВТ);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаСсылочные", ВставкаСсылочные);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаБазовые", ВставкаБазовые);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаИсточники", ВставкаИсточники);

Запрос.УстановитьПараметр("ВходнаяТаблица", ТЗ);
РезультатЗапроса = Запрос.Выполнить();

ПоместитьВоВременноеХранилище(РезультатЗапроса.Выгрузить(), АдресПомещения);
ПоместитьВоВременноеХранилище(ТаблицаДанных, Параметры.АдресПомещения);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Требуется проверка входных параметров!

Необходимо добавить валидацию входных параметров перед их использованием:

  • Проверка существования адреса во временном хранилище
  • Проверка корректности структуры параметров

Предлагаемые изменения:

 Процедура ФормированиеТаблицы(АдресВХранилище, Расширение, Параметры) Экспорт
+    Если Не ЗначениеЗаполнено(Параметры.АдресМакета) Тогда
+        ВызватьИсключение НСтр("ru='Не указан адрес макета во временном хранилище'");
+    КонецЕсли;
+    
+    Если Не ЗначениеЗаполнено(Параметры.АдресПомещения) Тогда
+        ВызватьИсключение НСтр("ru='Не указан адрес для помещения результата'");
+    КонецЕсли;
     
     ТаблицаСвойств = ПолучитьИзВременногоХранилища(Параметры.АдресМакета);
📝 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
ТаблицаСвойств = ПолучитьИзВременногоХранилища(Параметры.АдресМакета);
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
ПараметрыЧтения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла();
ПараметрыЧтения.НазваниеЛиста = Параметры.НазваниеЛиста;
ПараметрыЧтения.НомерСтроки = Параметры.НомерПервойСтроки;
ПараметрыЧтения.СопоставлениеПоНаименованию = Параметры.ПоНаименованию;
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
ТаблицаДанных = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер
.КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений(
АдресВХранилище, Расширение, ТаблицаСвойств, ПараметрыЧтения);
Попытка
УдалитьФайлы(ИмяВременногоФайла);
Исключение
ЗаписьЖурналаРегистрации(НСтр("ru = 'Загрузка файла через табличный документ.Удаление временного файла'"), УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено);
ПервыйЛист = ТабДок.Области[0].Имя;
Для Каждого ЛистДок Из ТабДок.Области Цикл
Если ЛистДок.Верх = 1 Тогда
ПервыйЛист = ЛистДок.Имя;
КонецЕсли;
КонецЦикла;
ТабДок = ТабДок.ПолучитьОбласть(?(Лист = Неопределено, ПервыйЛист, СтрЗаменить(НазваниеЛиста, " ", "_")));
Если Не НомерСтроки = 1 Тогда
ТабДок.УдалитьОбласть(ТабДок.Область("R1:R" + Строка(НомерСтроки - 1)), ТипСмещенияТабличногоДокумента.ПоВертикали);
КонецЕсли;
ТабДок.ВставитьОбласть(ТабДок.Область("R1"),
ТабДок.Область("R1"),
ТипСмещенияТабличногоДокумента.ПоГоризонтали);
Табдок.Область("R1").Очистить(Истина, Истина, Истина);
Счетчик = 0;
Для Каждого Колонка Из Макет Цикл
Счетчик = Счетчик + 1;
Если Не ЗначениеЗаполнено(Колонка.Значение) Тогда
Продолжить;
КонецЕсли;
ТабДок.Область("R1" + "C" + Строка(Счетчик)).Текст = Колонка.Ключ;
КонецЦикла;
ПЗ = Новый ПостроительЗапроса;
ПЗ.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());
ПЗ.ДобавлениеПредставлений = ТипДобавленияПредставлений.Добавлять;
ПЗ.ЗаполнитьНастройки();
ПЗ.Выполнить();
ТЗ = ПЗ.Результат.Выгрузить();
ТЗ.Колонки.Добавить("ПорядковыйНомер", Новый ОписаниеТипов("Число"));
КоллекцияОтборов = Новый ТаблицаЗначений;
КоллекцияОтборов.Колонки.Добавить("ТипДанных");
КоллекцияОтборов.Колонки.Добавить("НомерСтрокиДочерней");
КоллекцияОтборов.Колонки.Добавить("МассивДанных");
КоллекцияОтборов.Колонки.Добавить("НазваниеКолонки");
Н = ТЗ.Количество() - 1;
Пока НЕ Н < 0 Цикл
Счетчик = 0;
ТЗ[Н].ПорядковыйНомер = Н;
Для каждого Колонка Из ТЗ.Колонки Цикл
Если Не ЗначениеЗаполнено(ТЗ[Н][Колонка.Имя]) Тогда
Счетчик = Счетчик + 1;
КонецЕсли;
КонецЦикла;
Если Счетчик = ТЗ.Колонки.Количество() Тогда
ТЗ.Удалить(Н);
КонецЕсли;
Н = Н - 1;
КонецЦикла;
ВставкаВТ = "";
ВставкаБазовые = "";
ВставкаСсылочные = "";
ВставкаИсточники = "";
ХранилищеИсточников = Новый Соответствие;
МассивИменСсылочных = Новый Массив;
СоответствиеПеречислений = Новый Соответствие;
Для Каждого Колонка Из Макет Цикл
Если Не ЗначениеЗаполнено(Колонка.Значение) Тогда
Продолжить;
КонецЕсли;
ВставкаВТ = ВставкаВТ + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС;
Если СтрНайти(Колонка.Значение, "Ссылка") <> 0 И СтрНайти(Колонка.Значение, "Перечисление") = 0 Тогда
ТЗ.Колонки.Добавить(Колонка.Ключ + "КодЧислом", Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15)));
ВставкаВТ = ВставкаВТ + "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом КАК " + Колонка.Ключ + "КодЧислом," + Символы.ПС;
МассивИменСсылочных.Добавить(Колонка.Ключ);
РазбивкаТипа = СтрРазделить(СтрЗаменить(Колонка.Значение, "Ссылка", ""), ".", Ложь);
ВхождениеИсточника = ХранилищеИсточников.Получить(РазбивкаТипа[1]);
ХранилищеИсточников.Вставить(РазбивкаТипа[1], ?(ВхождениеИсточника = Неопределено, 1, ВхождениеИсточника + 1));
Итерация = ?(ХранилищеИсточников.Получить(РазбивкаТипа[1]) = 0, "", Строка(ХранилищеИсточников.Получить(РазбивкаТипа[1])));
Если РазбивкаТипа[0] = "Документ" Тогда
РеквизитСравнения = "Номер";
Иначе
РеквизитСравнения = "Наименование";
КонецЕсли;
ВставкаСсылочные = ВставкаСсылочные + РазбивкаТипа[1] + Итерация + ".Ссылка КАК " + Колонка.Ключ + "," + Символы.ПС;
Если Не СтрНайти(ВставкаИсточники, " " + РазбивкаТипа[1] + " ") > 0 Тогда
ВставкаИсточники = ВставкаИсточники + "
| ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(Колонка.Значение, "Ссылка", "") + " КАК " + РазбивкаТипа[1] + Итерация + "
| ПО " + "ВходнаяТаблица." + Колонка.Ключ + " <> """" И " + "ВходнаяТаблица." + Колонка.Ключ + " <> 0" + "
| И (ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + РеквизитСравнения + Символы.ПС;
Если СтрНайти(РазбивкаТипа[1], "Номенклатура") > 0 Тогда
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Артикул" + Символы.ПС;
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС;
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС;
ИначеЕсли СтрНайти(Колонка.Значение, "Справочник") > 0
И Не СтрНайти(Колонка.Значение, "Организации") > 0 Тогда
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + "КодЧислом = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС;
ВставкаИсточники = ВставкаИсточники + " ИЛИ "
+ "ВходнаяТаблица." + Колонка.Ключ + " = " + РазбивкаТипа[1] + Итерация + "." + "Код" + Символы.ПС;
КонецЕсли;
ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "Служебный," + Символы.ПС;
ВставкаИсточники = ВставкаИсточники + ")";
КонецЕсли;
ИначеЕсли СтрНайти(Колонка.Значение, "Перечисление") <> 0 Тогда
КолонкаПеречисления = ТЗ.Колонки.Добавить(Колонка.Ключ + "НеОбрабатывать", Новый ОписаниеТипов(Колонка.Значение));
СоответствиеПеречислений.Вставить(Колонка.Ключ, Колонка.Значение);
ВставкаВТ = СтрЗаменить(ВставкаВТ, "." + Колонка.Ключ + " КАК", "." + КолонкаПеречисления.Имя + " КАК");
ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС;
ИначеЕсли Не СтрНайти(Колонка.Ключ, "НеОбрабатывать") > 0 Тогда
ВставкаБазовые = ВставкаБазовые + "ВходнаяТаблица." + Колонка.Ключ + " КАК " + Колонка.Ключ + "," + Символы.ПС;
КонецЕсли;
КонецЦикла;
ВставкаВТ = ВставкаВТ + "ВходнаяТаблица.ПорядковыйНомер Как ПорядковыйНомер";
ВставкаБазовые = Лев(ВставкаБазовые, СтрДлина(ВставкаБазовые) - 2);
ОТЧ = Новый ОписаниеТипов("Число", , , Новый КвалификаторыЧисла(15));
Для Каждого СтрокаТаблицы Из ТЗ Цикл
Для Каждого ИмяМассива Из МассивИменСсылочных Цикл
СтрокаТаблицы[ИмяМассива + "КодЧислом"] = ОТЧ.ПривестиЗначение(СтрокаТаблицы[ИмяМассива]);
КонецЦикла;
Для Каждого Колонка Из СоответствиеПеречислений Цикл
Для Каждого ТекЭлемент Из Метаданные.Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")].ЗначенияПеречисления Цикл
Если нРег(ТекЭлемент.Синоним) = нРег(СтрокаТаблицы[Колонка.Ключ]) Тогда
СтрокаТаблицы[Колонка.Ключ + "НеОбрабатывать"] = Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")][ТекЭлемент.Имя];
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| #ВставкаВТ
|ПОМЕСТИТЬ ВходнаяТаблица
|ИЗ
| &ВходнаяТаблица КАК ВходнаяТаблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| #ВставкаСсылочные
| #ВставкаБазовые
|ИЗ
| ВходнаяТаблица КАК ВходнаяТаблица
| #ВставкаИсточники
|
|УПОРЯДОЧИТЬ ПО
| ВходнаяТаблица.ПорядковыйНомер";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаВТ", ВставкаВТ);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаСсылочные", ВставкаСсылочные);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаБазовые", ВставкаБазовые);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаИсточники", ВставкаИсточники);
Запрос.УстановитьПараметр("ВходнаяТаблица", ТЗ);
РезультатЗапроса = Запрос.Выполнить();
ПоместитьВоВременноеХранилище(РезультатЗапроса.Выгрузить(), АдресПомещения);
ПоместитьВоВременноеХранилище(ТаблицаДанных, Параметры.АдресПомещения);
Если Не ЗначениеЗаполнено(Параметры.АдресМакета) Тогда
ВызватьИсключение НСтр("ru='Не указан адрес макета во временном хранилище'");
КонецЕсли;
Если Не ЗначениеЗаполнено(Параметры.АдресПомещения) Тогда
ВызватьИсключение НСтр("ru='Не указан адрес для помещения результата'");
КонецЕсли;
ТаблицаСвойств = ПолучитьИзВременногоХранилища(Параметры.АдресМакета);
ПараметрыЧтения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла();
ПараметрыЧтения.НазваниеЛиста = Параметры.НазваниеЛиста;
ПараметрыЧтения.НомерСтроки = Параметры.НомерПервойСтроки;
ПараметрыЧтения.СопоставлениеПоНаименованию = Параметры.ПоНаименованию;
ТаблицаДанных = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер
.КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений(
АдресВХранилище, Расширение, ТаблицаСвойств, ПараметрыЧтения);
ПоместитьВоВременноеХранилище(ТаблицаДанных, Параметры.АдресПомещения);

Comment on lines +121 to +151
// Получает представление текста запроса внешнего источника данных
//
// Параметры:
// Запрос - Строка - текст запроса к таблице внешнего источника данных с добавлением значений параметров в текст
//
// Возвращаемое значение:
// Строка - текст запроса с заполненными значениями параметров
//
Функция ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос) Экспорт

ПредставлениеТекстаЗапроса = Запрос.Текст;

Для Каждого ПараметрЗапроса Из Запрос.Параметры Цикл
ТипЗначения = ТипЗнч(ПараметрЗапроса.Значение);
Если ТипЗначения = Тип("Строка") Тогда
ПредставлениеЗначения = """" + ПараметрЗапроса.Значение + """";
ИначеЕсли ТипЗначения = Тип("Дата") Тогда
ПредставлениеЗначения = "'" + Формат(ПараметрЗапроса.Значение, "ДЛФ=DT") + "'";
ИначеЕсли ТипЗначения = Тип("Булево") Тогда
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "БЛ=ЛОЖЬ; БИ=ИСТИНА");
Иначе
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "ЧГ=");
КонецЕсли;

ПредставлениеТекстаЗапроса = СтрЗаменить(ПредставлениеТекстаЗапроса,
"&" + ПараметрЗапроса.Ключ, ПредставлениеЗначения);
КонецЦикла;

Возврат ПредставлениеТекстаЗапроса;

КонецФункции
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендации по улучшению обработки параметров запроса.

Предлагаю следующие улучшения:

  1. Добавить проверку входного параметра Запрос на неопределено
  2. Вынести строковые литералы в константы
  3. Добавить обработку исключений для некорректных типов параметров

Пример реализации:

 Функция ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос) Экспорт
+    Если Запрос = Неопределено Тогда
+        ВызватьИсключение НСтр("ru='Параметр Запрос не может быть неопределено'");
+    КонецЕсли;
+    
+    Попытка
         ПредставлениеТекстаЗапроса = Запрос.Текст;
         
         Для Каждого ПараметрЗапроса Из Запрос.Параметры Цикл
             ТипЗначения = ТипЗнч(ПараметрЗапроса.Значение);
             Если ТипЗначения = Тип("Строка") Тогда
                 ПредставлениеЗначения = """" + ПараметрЗапроса.Значение + """";
             ИначеЕсли ТипЗначения = Тип("Дата") Тогда
                 ПредставлениеЗначения = "'" + Формат(ПараметрЗапроса.Значение, "ДЛФ=DT") + "'";
             ИначеЕсли ТипЗначения = Тип("Булево") Тогда
                 ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "БЛ=ЛОЖЬ; БИ=ИСТИНА");
             Иначе
                 ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "ЧГ=");
             КонецЕсли;
             
             ПредставлениеТекстаЗапроса = СтрЗаменить(ПредставлениеТекстаЗапроса,
                 "&" + ПараметрЗапроса.Ключ, ПредставлениеЗначения);
         КонецЦикла;
         
         Возврат ПредставлениеТекстаЗапроса;
+    Исключение
+        ВызватьИсключение НСтр("ru='Ошибка при форматировании параметров запроса: '") + 
+            ОписаниеОшибки();
+    КонецПопытки;
 КонецФункции
📝 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
// Получает представление текста запроса внешнего источника данных
//
// Параметры:
// Запрос - Строка - текст запроса к таблице внешнего источника данных с добавлением значений параметров в текст
//
// Возвращаемое значение:
// Строка - текст запроса с заполненными значениями параметров
//
Функция ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос) Экспорт
ПредставлениеТекстаЗапроса = Запрос.Текст;
Для Каждого ПараметрЗапроса Из Запрос.Параметры Цикл
ТипЗначения = ТипЗнч(ПараметрЗапроса.Значение);
Если ТипЗначения = Тип("Строка") Тогда
ПредставлениеЗначения = """" + ПараметрЗапроса.Значение + """";
ИначеЕсли ТипЗначения = Тип("Дата") Тогда
ПредставлениеЗначения = "'" + Формат(ПараметрЗапроса.Значение, "ДЛФ=DT") + "'";
ИначеЕсли ТипЗначения = Тип("Булево") Тогда
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "БЛ=ЛОЖЬ; БИ=ИСТИНА");
Иначе
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "ЧГ=");
КонецЕсли;
ПредставлениеТекстаЗапроса = СтрЗаменить(ПредставлениеТекстаЗапроса,
"&" + ПараметрЗапроса.Ключ, ПредставлениеЗначения);
КонецЦикла;
Возврат ПредставлениеТекстаЗапроса;
КонецФункции
// Получает представление текста запроса внешнего источника данных
//
// Параметры:
// Запрос - Строка - текст запроса к таблице внешнего источника данных с добавлением значений параметров в текст
//
// Возвращаемое значение:
// Строка - текст запроса с заполненными значениями параметров
//
Функция ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос) Экспорт
Если Запрос = Неопределено Тогда
ВызватьИсключение НСтр("ru='Параметр Запрос не может быть неопределено'");
КонецЕсли;
Попытка
ПредставлениеТекстаЗапроса = Запрос.Текст;
Для Каждого ПараметрЗапроса Из Запрос.Параметры Цикл
ТипЗначения = ТипЗнч(ПараметрЗапроса.Значение);
Если ТипЗначения = Тип("Строка") Тогда
ПредставлениеЗначения = """" + ПараметрЗапроса.Значение + """";
ИначеЕсли ТипЗначения = Тип("Дата") Тогда
ПредставлениеЗначения = "'" + Формат(ПараметрЗапроса.Значение, "ДЛФ=DT") + "'";
ИначеЕсли ТипЗначения = Тип("Булево") Тогда
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "БЛ=ЛОЖЬ; БИ=ИСТИНА");
Иначе
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "ЧГ=");
КонецЕсли;
ПредставлениеТекстаЗапроса = СтрЗаменить(ПредставлениеТекстаЗапроса,
"&" + ПараметрЗапроса.Ключ, ПредставлениеЗначения);
КонецЦикла;
Возврат ПредставлениеТекстаЗапроса;
Исключение
ВызватьИсключение НСтр("ru='Ошибка при форматировании параметров запроса: '") +
ОписаниеОшибки();
КонецПопытки;
КонецФункции

Comment on lines +171 to +275

РеквизитыОбъекта = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта(
ИнтеграционныйПоток, "НастройкаИнтеграции.ИмяОбъекта, ТочкаВхода");

Если Не ЗначениеЗаполнено(РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта) Тогда
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки,
"в настройках интеграции не заполнено наименование внешнего источника данных");
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки);
КонецЕсли;

Если Не ЗначениеЗаполнено(РеквизитыОбъекта.ТочкаВхода) Тогда
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки,
"в интеграционном потоке не заполнено имя таблицы внешнего источника данных");
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки);
КонецЕсли;

Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда
Возврат СообщениеОбОшибке;
КонецЕсли;

Попытка
ТаблицаВыборки = ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника(
РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта, РеквизитыОбъекта.ТочкаВхода, ПоляЗапроса);

Запрос = Новый Запрос;

ТекстЗапроса = "ВЫБРАТЬ
| &ПоляЗапроса
|ИЗ
| ВнешнийИсточникДанных." + РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта
+ ".Таблица." + РеквизитыОбъекта.ТочкаВхода + " КАК Таблица";

Если КоличествоПервых <> 0 Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ ПЕРВЫЕ " + КоличествоПервых);
КонецЕсли;

Если Не ПустаяСтрока(ПоляЗапроса) Тогда
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", ПоляЗапроса);
Иначе
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", "Таблица.*");
КонецЕсли;

УсловияЗапроса = "";

// Установка предопределенных параметров запроса из интеграционного потока
Для Каждого СтрокаПредопределенногоПараметра Из ИнтеграционныйПоток.ПараметрыВхода Цикл
НуженПеренос = ?(ПустаяСтрока(УсловияЗапроса), "", "
| И ");
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2",
НуженПеренос, СтрокаПредопределенногоПараметра.Имя);

Запрос.УстановитьПараметр(
СтрокаПредопределенногоПараметра.Имя,
СтрокаПредопределенногоПараметра.ЗначениеПоУмолчанию);
КонецЦикла;

// Установка опциональных параметров запроса
Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл
НуженПеренос = ?(ПустаяСтрока(УсловияЗапроса), "", "
| И ");
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2",
НуженПеренос, КлючИЗначение.Ключ);

Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;

Если Не ПустаяСтрока(УсловияЗапроса) Тогда
ТекстЗапроса = ТекстЗапроса + "
|ГДЕ
| " + УсловияЗапроса;
КонецЕсли;

Запрос.Текст = ТекстЗапроса;

Если СтруктураИстории <> Неопределено Тогда
СтруктураИстории.ИсходящееСообщение = пбп_ИнтеграцииСлужебный
.ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос);
НачалоВызова = ТекущаяДатаСеанса();
КонецЕсли;

РезультатЗапроса = Запрос.Выполнить();

Если СтруктураИстории <> Неопределено Тогда
СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова;
КонецЕсли;

ВыборкаРезультатаЗапроса = РезультатЗапроса.Выбрать();

Пока ВыборкаРезультатаЗапроса.Следующий() Цикл
ЗаполнитьЗначенияСвойств(ТаблицаВыборки.Добавить(), ВыборкаРезультатаЗапроса);
КонецЦикла;

Возврат ТаблицаВыборки;
Исключение
СообщениеОбОшибке = ПолучитьПодробноеПредставлениеОшибкиИсключения(ЗаголовокОшибки, ИнформацияОбОшибке());
КонецПопытки;

Возврат СообщениеОбОшибке;

КонецФункции
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Необходимо уменьшить сложность функции

Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям имеет высокую когнитивную сложность. Рекомендуется разделить её на несколько более простых функций:

  • Функция формирования текста запроса
  • Функция установки параметров
  • Функция выполнения запроса и обработки результатов
🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[warning] 202-202: src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L202
Текст запроса должен быть корректным и открываться конструктором запросов


[warning] 171-171: src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L171
Уменьшите количество необязательных параметров c 4 до допустимого 3


[failure] 171-171: src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L171
Уменьшите когнитивную сложность "ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям" с 17 до 15

// Строка, ТаблицаЗначений - таблица значений с данными, полученными из внешнего источника,
// с типизированными колонками или строка с ошибкой
//
Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям(ИнтеграционныйПоток,
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Оптимизируйте количество необязательных параметров

Функция имеет 4 необязательных параметра, что превышает рекомендуемое количество. Рекомендуется объединить параметры в структуру.

Предлагаемый код:

-Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям(ИнтеграционныйПоток,
-	ПоляЗапроса = "", ПараметрыЗапроса = Неопределено, КоличествоПервых = 0, 
-   СтруктураИстории = Неопределено) Экспорт
+Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям(ИнтеграционныйПоток,
+	ПараметрыВыборки) Экспорт

Committable suggestion was skipped due to low confidence.

🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[warning] 171-171: src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L171
Уменьшите количество необязательных параметров c 4 до допустимого 3


[failure] 171-171: src/cf/CommonModules/пбп_ИнтеграцииСервер/Ext/Module.bsl#L171
Уменьшите когнитивную сложность "ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям" с 17 до 15

СокрМесяц = ТРег(Лев(МассивРазделителей[1], КоличествоПервыхСимволов));
Если Число(МассивРазделителей[0]) > МаксКоличествоДнейВМесяце Тогда // тут год
РазрядФормата = "1";
ИначеЕсли пбп_ОбщегоНазначенияКлиентСервер.ПолучитьНомерМесяцаПоСтроковомуПредставлению(СокрМесяц) = 0 Тогда
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Использование несуществующего метода "ПолучитьНомерМесяцаПоСтроковомуПредставлению".

В функциях ПолучитьНомерФорматаДатыИзСтроки и ПреобразоватьДатуИзСтрокиПоФормату вызывается метод ПолучитьНомерМесяцаПоСтроковомуПредставлению из общего модуля пбп_ОбщегоНазначенияКлиентСервер, который не существует. Это приведет к ошибке во время выполнения.

Рекомендуется реализовать данный метод в указанном модуле или использовать альтернативный метод для определения номера месяца по строковому представлению.

Also applies to: 681-681

🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[failure] 581-581: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L581
Метод ПолучитьНомерМесяцаПоСтроковомуПредставлению общего модуля пбп_ОбщегоНазначенияКлиентСервер не существует

Comment on lines +56 to +297
+ " = " + ИмяОбъекта + Итерация + "." + РеквизитСравнения;
КонецЦикла;

Если Не ПустаяСтрока(ВставкаУсловияСоединения) Тогда
ВставкаИсточники = ВставкаИсточники + "
| ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(СтрокаТаблицы.ТипЗначения, СсылкаСтрока, "")
+ " КАК " + ИмяОбъекта + Итерация + "
| ПО ВходнаяТаблица." + СтрокаТаблицы.ИмяКолонки + " <> """" И "
+ ВходнаяТаблицаСтрока + СтрокаТаблицы.ИмяКолонки + " <> 0
| И (" + ВставкаУсловияСоединения + ")";
КонецЕсли;

ВставкаБазовые = ВставкаБазовые + ВходнаяТаблицаСтрока + СтрокаТаблицы.ИмяКолонки
+ " КАК " + СтрокаТаблицы.ИмяКолонки + "Служебный," + Символы.ПС;
КонецЕсли;

ИначеЕсли СтрНайти(СтрокаТаблицы.ТипЗначения, "Перечисление") <> 0 Тогда
КолонкаПеречисления = ТЗ.Колонки.Добавить(СтрокаТаблицы.ИмяКолонки + СтрокаНеОбрабатывать,
Новый ОписаниеТипов(СтрокаТаблицы.ТипЗначения));
СоответствиеПеречислений.Вставить(СтрокаТаблицы.ИмяКолонки, СтрокаТаблицы.ТипЗначения);
ВставкаВТ = СтрЗаменить(ВставкаВТ, "." + СтрокаТаблицы.ИмяКолонки + " КАК", "." + КолонкаПеречисления.Имя + " КАК");
ВставкаБазовые = ВставкаБазовые + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки);
ИначеЕсли Не СтрНайти(СтрокаТаблицы.ИмяКолонки, СтрокаНеОбрабатывать) > 0 Тогда
ВставкаБазовые = ВставкаБазовые + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки);
Если СтрНайти(СтрокаТаблицы.ТипЗначения, "Дата") <> 0
И ТЗ.Колонки.Найти(СтрокаТаблицы.ИмяКолонки + "Строкой") <> Неопределено Тогда
СтруктураИменКолонокДат.Вставить(СтрокаТаблицы.ИмяКолонки, "");
КонецЕсли;
КонецЕсли;

КонецЦикла;

ВставкаВТ = ВставкаВТ + "ВходнаяТаблица.ПорядковыйНомер Как ПорядковыйНомер";
КоличествоСимволовЛев = 2;
ВставкаБазовые = Лев(ВставкаБазовые, СтрДлина(ВставкаБазовые) - КоличествоСимволовЛев);

Если КонвертироватьДаты Тогда
ПрисвоитьНомераФорматовКолонокДат(ТЗ, СтруктураИменКолонокДат);
КонецЕсли;

Для Каждого СтрокаТаблицы Из ТЗ Цикл

Для Каждого ИмяМассива Из МассивИменСсылочных Цикл
СтрокаТаблицы[ИмяМассива + КодЧисломСтрока] = ОписаниеТипаЧисло15.ПривестиЗначение(СтрокаТаблицы[ИмяМассива]);
КонецЦикла;

Для Каждого Колонка Из СоответствиеПеречислений Цикл
ИмяПеречисления = СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "");

Для Каждого ТекЭлемент Из Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления Цикл
Если НРег(ТекЭлемент.Синоним) = НРег(СтрокаТаблицы[Колонка.Ключ]) Тогда
СтрокаТаблицы[Колонка.Ключ + СтрокаНеОбрабатывать] = Перечисления[ИмяПеречисления][ТекЭлемент.Имя];
Прервать;
КонецЕсли;
КонецЦикла;

КонецЦикла;

Если КонвертироватьДаты Тогда
Для Каждого КлючИЗначение Из СтруктураИменКолонокДат Цикл
СтрокаТаблицы[КлючИЗначение.Ключ] = ПреобразоватьДатуИзСтрокиПоФормату(
СтрокаТаблицы[КлючИЗначение.Ключ + "Строкой"], КлючИЗначение.Значение);
КонецЦикла;
КонецЕсли;

КонецЦикла;

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| #ВставкаВТ
|ПОМЕСТИТЬ ВходнаяТаблица
|ИЗ
| &ВходнаяТаблица КАК ВходнаяТаблица
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| #ВставкаСсылочные
| #ВставкаБазовые
|ИЗ
| ВходнаяТаблица КАК ВходнаяТаблица
| #ВставкаИсточники
|
|УПОРЯДОЧИТЬ ПО
| ВходнаяТаблица.ПорядковыйНомер";

Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаВТ", ВставкаВТ);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаСсылочные", ВставкаСсылочные);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаБазовые", ВставкаБазовые);
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаИсточники", ВставкаИсточники);

Запрос.УстановитьПараметр("ВходнаяТаблица", ТЗ);
РезультатЗапроса = Запрос.Выполнить();

ВыгрузкаРезультатаЗапроса = РезультатЗапроса.Выгрузить();

Возврат ВыгрузкаРезультатаЗапроса;

КонецФункции
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется рефакторинг функции для снижения сложности и улучшения поддерживаемости.

Функция КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений имеет цикломатическую сложность 86 и длину 236 строк, что значительно превышает рекомендуемые значения. Такие большие и сложные функции трудно читать и сопровождать.

Рекомендуется разделить функцию на несколько более мелких функций, каждая из которых отвечает за определенную часть логики. Это улучшит читаемость кода и облегчит его поддержку.

🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[failure] 56-56: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L56
Уменьшите цикломатическую сложность "КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений" с 41 до 20


[warning] 276-276: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L276
Полю "ВставкаСсылочныеВставкаБазовые" не назначен псевдоним или пропущено ключевое слово КАК


[warning] 226-226: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L226
Синтаксическая конструкция вида "Если...Тогда...ИначеЕсли..." должна содержать ветвь "Иначе".


[failure] 189-189: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L189
Превышен допустимый уровень вложенности управляющих конструкций


[failure] 180-180: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L180
Превышен допустимый уровень вложенности управляющих конструкций


[warning] 268-268: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L268
Полю "ВставкаВТ" не назначен псевдоним или пропущено ключевое слово КАК


[warning] 56-56: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L56
Длина метода "КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений" равна 236, что больше установленного лимита в 200 строк


[failure] 56-56: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L56
Уменьшите когнитивную сложность "КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений" с 86 до 15

Comment on lines +513 to +571
Функция ПолучитьНомерФорматаДатыИзСтроки(ЗначениеКолонки)

ЕстьВремя = СтрНайти(ЗначениеКолонки, ":") > 0;
ЭтоУниверсальноеВремя = Ложь;

Если ЕстьВремя Тогда
МассивРазделителей = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
ЗначениеКолонки, ":", Истина, Истина);
Если СтрНайти(МассивРазделителей[1], "AM") > 0
Или СтрНайти(МассивРазделителей[1], "PM") > 0 Тогда
РазрядВремени = "2";
Иначе
РазрядВремени = "1";
КонецЕсли;

МассивРазделителейДатаВремя = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
МассивРазделителей[0], " ", Истина, Истина);
КоличествоРазделителей = 2;
Если МассивРазделителейДатаВремя.Количество() = КоличествоРазделителей Тогда
ТолькоДата = МассивРазделителейДатаВремя[0];
ИначеЕсли МассивРазделителейДатаВремя.Количество() = 0 Тогда
МассивРазделителейДатаВремя = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
МассивРазделителей[0], "T", Истина, Истина);
Если МассивРазделителейДатаВремя.Количество() = КоличествоРазделителей Тогда
ТолькоДата = МассивРазделителейДатаВремя[0];
ЭтоУниверсальноеВремя = Истина;
КонецЕсли;
Иначе
ТолькоДата = ПолучитьТолькоДатуЕслиРазделительПробел(МассивРазделителейДатаВремя);
КонецЕсли;
Иначе
ТолькоДата = ЗначениеКолонки;
РазрядВремени = "0";
КонецЕсли;

Если Не ЭтоУниверсальноеВремя Тогда
Если СтрНайти(ТолькоДата, ".") > 0 Тогда
РазрядРазделителя = "1";
РазрядФормата = ПолучитьРазрядФорматаДатыИзСтроки(ЗначениеКолонки, ".");
ИначеЕсли СтрНайти(ТолькоДата, "/") > 0 Тогда
РазрядРазделителя = "2";
РазрядФормата = ПолучитьРазрядФорматаДатыИзСтроки(ЗначениеКолонки, "/");
ИначеЕсли СтрНайти(ТолькоДата, "-") > 0 Тогда
РазрядРазделителя = "3";
РазрядФормата = ПолучитьРазрядФорматаДатыИзСтроки(ЗначениеКолонки, "-");
Иначе
РазрядРазделителя = "4";
РазрядФормата = ПолучитьРазрядФорматаДатыИзСтроки(ЗначениеКолонки, " ");
КонецЕсли;
Иначе
РазрядРазделителя = "0";
РазрядФормата = "0";
РазрядВремени = "0";
КонецЕсли;

Возврат РазрядРазделителя + "_" + РазрядФормата + "_" + РазрядВремени;

КонецФункции

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется рефакторинг функции для снижения сложности и улучшения поддерживаемости.

Функция ПолучитьНомерФорматаДатыИзСтроки имеет когнитивную сложность 20, что превышает рекомендуемый предел в 15. Это может затруднить понимание логики и дальнейшую поддержку функции.

Предлагается разбить функцию на несколько более простых подфункций, каждая из которых отвечает за конкретный этап обработки. Это позволит снизить сложность и улучшить читаемость кода.

🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[failure] 513-513: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L513
Уменьшите когнитивную сложность "ПолучитьНомерФорматаДатыИзСтроки" с 20 до 15

Comment on lines +612 to +702
Функция ПреобразоватьДатуИзСтрокиПоФормату(ВхЗначение, НомерФормата)

ПреобразованнаяДата = Неопределено;
Если НомерФормата = "000" Тогда
ПреобразованнаяДата = XMLЗначение(Тип("Дата"), ВхЗначение);
Иначе
РазрядыФормата = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(НомерФормата, "_");

СтрокаВремя = "";
Если РазрядыФормата[2] = "0" Тогда
СтрокаВремя = "00:00:00";
ТолькоДата = ВхЗначение;
Иначе
МассивРазделителей = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
ВхЗначение, ":", Истина, Истина);

МассивРазделителейДатаВремя = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
МассивРазделителей[0], " ", Истина, Истина);
Если РазрядыФормата[0] = "4" Тогда
ТолькоДата = ПолучитьТолькоДатуЕслиРазделительПробел(МассивРазделителейДатаВремя);
Иначе
ТолькоДата = МассивРазделителейДатаВремя[0];
КонецЕсли;

Если РазрядыФормата[1] = "1" Тогда
Часы = МассивРазделителейДатаВремя[МассивРазделителейДатаВремя.Количество() - 1];
МинутыСекунды = МассивРазделителей[1];
Иначе
ЧасыБезСдвигаЧисло = Число(МассивРазделителейДатаВремя[МассивРазделителейДатаВремя.Количество() - 1]);
КоличествоСимволовДоПослеОбеда = 2;
КоличествоЧасовСдвига = 12;
Если Прав(МинутыСекунды, КоличествоСимволовДоПослеОбеда) = "PM" Тогда
Часы = ЧасыБезСдвигаЧисло + КоличествоЧасовСдвига;
Иначе
Часы = ЧасыБезСдвигаЧисло;
КонецЕсли;

МинутыСекунды = СтрЗаменить(МинутыСекунды, " AM", "");
МинутыСекунды = СтрЗаменить(МинутыСекунды, " PM", "");
КонецЕсли;

СтрокаВремя = Строка(Часы) + ":" + МинутыСекунды;
КонецЕсли;

Если РазрядыФормата[0] = "1" Тогда
РазделительРазрядов = ".";
ИначеЕсли РазрядыФормата[0] = "2" Тогда
РазделительРазрядов = "/";
ИначеЕсли РазрядыФормата[0] = "3" Тогда
РазделительРазрядов = "-";
Иначе
РазделительРазрядов = " ";
КонецЕсли;

МассивГодМесяцДата = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(
ТолькоДата, РазделительРазрядов, Истина, Истина);

Если РазрядыФормата[1] = "1" Тогда
Год = МассивГодМесяцДата[0];
Месяц = МассивГодМесяцДата[1];
День = МассивГодМесяцДата[2];
ИначеЕсли РазрядыФормата[1] = "2" Тогда
Год = МассивГодМесяцДата[2];
Месяц = МассивГодМесяцДата[1];
День = МассивГодМесяцДата[0];
Иначе
Год = МассивГодМесяцДата[2];
КоличествоПервыхСимволов = 3;
СокрМесяц = ТРег(Лев(МассивГодМесяцДата[1], КоличествоПервыхСимволов));
Месяц = пбп_ОбщегоНазначенияКлиентСервер.ПолучитьНомерМесяцаПоСтроковомуПредставлению(СокрМесяц);
День = МассивГодМесяцДата[0];
КонецЕсли;

НомерЧислаБезНуля = 10;
Если Число(Месяц) < НомерЧислаБезНуля И Лев(Месяц, 1) <> "0" Тогда
Месяц = "0" + Месяц;
КонецЕсли;

Если Число(День) < НомерЧислаБезНуля И Лев(День, 1) <> "0" Тогда
День = "0" + День;
КонецЕсли;

СтрокаДата = День + "." + Месяц + "." + Год;

ПреобразованнаяДата = Дата(СтрокаДата + " " + СтрокаВремя);

КонецЕсли;

Возврат ПреобразованнаяДата;

КонецФункции
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется рефакторинг функции для снижения сложности и улучшения поддерживаемости.

Функция ПреобразоватьДатуИзСтрокиПоФормату имеет цикломатическую сложность 22 и когнитивную сложность 33, что превышает рекомендуемые значения. Это может привести к трудностям в понимании и сопровождении кода.

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

🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[failure] 681-681: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L681
Метод ПолучитьНомерМесяцаПоСтроковомуПредставлению общего модуля пбп_ОбщегоНазначенияКлиентСервер не существует


[failure] 612-612: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L612
Уменьшите цикломатическую сложность "ПреобразоватьДатуИзСтрокиПоФормату" с 22 до 20


[failure] 612-612: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L612
Уменьшите когнитивную сложность "ПреобразоватьДатуИзСтрокиПоФормату" с 33 до 15

ЗаголовокКолонки = ТаблицаЗначений.Колонки[чИндекс].Заголовок;
ШиринаКолонки = ТаблицаЗначений.Колонки[чИндекс].Ширина;
ЗначениеКолонки = ТаблицаЗначений.ВыгрузитьКолонку(чИндекс);
ТипКолонки = Новый ОписаниеТипов(ТипКолонки, ,"NULL",
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Исправьте синтаксическую ошибку в объявлении переменной.

В строке 320 в вызове конструктора Новый ОписаниеТипов присутствует лишняя запятая после аргумента ТипКолонки, что может привести к синтаксической ошибке.

Исправленный код:

-			ТипКолонки = Новый ОписаниеТипов(ТипКолонки, ,"NULL",
+			ТипКолонки = Новый ОписаниеТипов(ТипКолонки, "NULL",
📝 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
ТипКолонки = Новый ОписаниеТипов(ТипКолонки, ,"NULL",
ТипКолонки = Новый ОписаниеТипов(ТипКолонки, "NULL",
🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[notice] 320-320: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L320
Справа от ',' не хватает пробела

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Outside diff range and nitpick comments (1)
src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl (1)

87-94: Дополните документацию функции.

Рекомендуется добавить в документацию:

  1. Примеры использования
  2. Описание возвращаемого значения 0 при некорректном вводе
  3. Поддерживаемые форматы названий месяцев
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between c000bed and 1f6ffa5.

📒 Files selected for processing (1)
  • src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl (1 hunks)
🧰 Additional context used
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results
src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl

[failure] 95-95: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L95
Уменьшите когнитивную сложность "ПолучитьНомерМесяцаПоСтроковомуПредставлению" с 25 до 15


[notice] 97-97: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L97
Возможная опечатка в "Янв"


[notice] 112-112: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L112
Возможная опечатка в "Июн"


[notice] 115-115: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L115
Возможная опечатка в "Июл"


[notice] 100-100: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L100
Возможная опечатка в "Фев"


[notice] 118-118: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L118
Возможная опечатка в "Авг"


[notice] 124-124: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L124
Возможная опечатка в "Окт"


[failure] 95-95: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L95
Уменьшите цикломатическую сложность "ПолучитьНомерМесяцаПоСтроковомуПредставлению" с 26 до 20

Comment on lines +87 to +139
// Получает номер месяца числом по строковому представлению
//
// Параметры:
// МесяцСтрокойСокр - Строка - первые 3 буквы названия месяца
//
// Возвращаемое значение:
// Число - номер месяца числом
//
Функция ПолучитьНомерМесяцаПоСтроковомуПредставлению(МесяцСтрокойСокр) Экспорт

Если МесяцСтрокойСокр = "Янв"
Или МесяцСтрокойСокр = "Jan" Тогда
МесяцЧислом = 1;
ИначеЕсли МесяцСтрокойСокр = "Фев"
Или МесяцСтрокойСокр = "Feb" Тогда
МесяцЧислом = 2;
ИначеЕсли МесяцСтрокойСокр = "Мар"
Или МесяцСтрокойСокр = "Mar" Тогда
МесяцЧислом = 3;
ИначеЕсли МесяцСтрокойСокр = "Апр"
Или МесяцСтрокойСокр = "Apr" Тогда
МесяцЧислом = 4;
ИначеЕсли МесяцСтрокойСокр = "Май"
Или МесяцСтрокойСокр = "May" Тогда
МесяцЧислом = 5;
ИначеЕсли МесяцСтрокойСокр = "Июн"
Или МесяцСтрокойСокр = "Jun" Тогда
МесяцЧислом = 6;
ИначеЕсли МесяцСтрокойСокр = "Июл"
Или МесяцСтрокойСокр = "Jul" Тогда
МесяцЧислом = 7;
ИначеЕсли МесяцСтрокойСокр = "Авг"
Или МесяцСтрокойСокр = "Aug" Тогда
МесяцЧислом = 8;
ИначеЕсли МесяцСтрокойСокр = "Сен"
Или МесяцСтрокойСокр = "Sep" Тогда
МесяцЧислом = 9;
ИначеЕсли МесяцСтрокойСокр = "Окт"
Или МесяцСтрокойСокр = "Oct" Тогда
МесяцЧислом = 10;
ИначеЕсли МесяцСтрокойСокр = "Ноя"
Или МесяцСтрокойСокр = "Nov" Тогда
МесяцЧислом = 11;
ИначеЕсли МесяцСтрокойСокр = "Dec"
Или МесяцСтрокойСокр = "Дек" Тогда
МесяцЧислом = 12;
Иначе
МесяцЧислом = 0;
КонецЕсли;

Возврат МесяцЧислом;

КонецФункции
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется упростить логику функции и добавить проверку входных данных.

Текущая реализация имеет высокую цикломатическую (26) и когнитивную (25) сложность. Предлагаю следующие улучшения:

  1. Использовать соответствие для сопоставления названий месяцев с числами
  2. Добавить нормализацию входной строки
  3. Вынести названия месяцев в константы

Предлагаемая реализация:

+ #Область ПрограммныйИнтерфейс
+
+ // Соответствие названий месяцев и их номеров
+ Перем МесяцыСоответствие;
+
+ // Инициализация соответствия месяцев при первом обращении к модулю
+ МесяцыСоответствие = Новый Соответствие;
+ МесяцыСоответствие.Вставить("ЯНВ", 1); МесяцыСоответствие.Вставить("JAN", 1);
+ МесяцыСоответствие.Вставить("ФЕВ", 2); МесяцыСоответствие.Вставить("FEB", 2);
+ МесяцыСоответствие.Вставить("МАР", 3); МесяцыСоответствие.Вставить("MAR", 3);
+ МесяцыСоответствие.Вставить("АПР", 4); МесяцыСоответствие.Вставить("APR", 4);
+ МесяцыСоответствие.Вставить("МАЙ", 5); МесяцыСоответствие.Вставить("MAY", 5);
+ МесяцыСоответствие.Вставить("ИЮН", 6); МесяцыСоответствие.Вставить("JUN", 6);
+ МесяцыСоответствие.Вставить("ИЮЛ", 7); МесяцыСоответствие.Вставить("JUL", 7);
+ МесяцыСоответствие.Вставить("АВГ", 8); МесяцыСоответствие.Вставить("AUG", 8);
+ МесяцыСоответствие.Вставить("СЕН", 9); МесяцыСоответствие.Вставить("SEP", 9);
+ МесяцыСоответствие.Вставить("ОКТ", 10); МесяцыСоответствие.Вставить("OCT", 10);
+ МесяцыСоответствие.Вставить("НОЯ", 11); МесяцыСоответствие.Вставить("NOV", 11);
+ МесяцыСоответствие.Вставить("ДЕК", 12); МесяцыСоответствие.Вставить("DEC", 12);

- Функция ПолучитьНомерМесяцаПоСтроковомуПредставлению(МесяцСтрокойСокр) Экспорт
-   Если МесяцСтрокойСокр = "Янв"
-     Или МесяцСтрокойСокр = "Jan" Тогда
-     МесяцЧислом = 1;
-   ИначеЕсли МесяцСтрокойСокр = "Фев"
-     Или МесяцСтрокойСокр = "Feb" Тогда
-     МесяцЧислом = 2;
-   // ... остальные условия
-   Иначе
-     МесяцЧислом = 0;
-   КонецЕсли;
-   
-   Возврат МесяцЧислом;
+ Функция ПолучитьНомерМесяцаПоСтроковомуПредставлению(МесяцСтрокойСокр) Экспорт
+   Если ПустаяСтрока(МесяцСтрокойСокр) Тогда
+     Возврат 0;
+   КонецЕсли;
+   
+   НормализованноеНазвание = ВРег(СокрЛП(МесяцСтрокойСокр));
+   
+   МесяцЧислом = МесяцыСоответствие[НормализованноеНазвание];
+   Возврат ?(МесяцЧислом = Неопределено, 0, МесяцЧислом);

Преимущества предложенного решения:

  1. Уменьшение сложности кода
  2. Улучшение производительности за счет использования соответствия
  3. Более надежная обработка входных данных
  4. Упрощение поддержки кода
📝 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
// Получает номер месяца числом по строковому представлению
//
// Параметры:
// МесяцСтрокойСокр - Строка - первые 3 буквы названия месяца
//
// Возвращаемое значение:
// Число - номер месяца числом
//
Функция ПолучитьНомерМесяцаПоСтроковомуПредставлению(МесяцСтрокойСокр) Экспорт
Если МесяцСтрокойСокр = "Янв"
Или МесяцСтрокойСокр = "Jan" Тогда
МесяцЧислом = 1;
ИначеЕсли МесяцСтрокойСокр = "Фев"
Или МесяцСтрокойСокр = "Feb" Тогда
МесяцЧислом = 2;
ИначеЕсли МесяцСтрокойСокр = "Мар"
Или МесяцСтрокойСокр = "Mar" Тогда
МесяцЧислом = 3;
ИначеЕсли МесяцСтрокойСокр = "Апр"
Или МесяцСтрокойСокр = "Apr" Тогда
МесяцЧислом = 4;
ИначеЕсли МесяцСтрокойСокр = "Май"
Или МесяцСтрокойСокр = "May" Тогда
МесяцЧислом = 5;
ИначеЕсли МесяцСтрокойСокр = "Июн"
Или МесяцСтрокойСокр = "Jun" Тогда
МесяцЧислом = 6;
ИначеЕсли МесяцСтрокойСокр = "Июл"
Или МесяцСтрокойСокр = "Jul" Тогда
МесяцЧислом = 7;
ИначеЕсли МесяцСтрокойСокр = "Авг"
Или МесяцСтрокойСокр = "Aug" Тогда
МесяцЧислом = 8;
ИначеЕсли МесяцСтрокойСокр = "Сен"
Или МесяцСтрокойСокр = "Sep" Тогда
МесяцЧислом = 9;
ИначеЕсли МесяцСтрокойСокр = "Окт"
Или МесяцСтрокойСокр = "Oct" Тогда
МесяцЧислом = 10;
ИначеЕсли МесяцСтрокойСокр = "Ноя"
Или МесяцСтрокойСокр = "Nov" Тогда
МесяцЧислом = 11;
ИначеЕсли МесяцСтрокойСокр = "Dec"
Или МесяцСтрокойСокр = "Дек" Тогда
МесяцЧислом = 12;
Иначе
МесяцЧислом = 0;
КонецЕсли;
Возврат МесяцЧислом;
КонецФункции
#Область ПрограммныйИнтерфейс
// Соответствие названий месяцев и их номеров
Перем МесяцыСоответствие;
// Инициализация соответствия месяцев при первом обращении к модулю
МесяцыСоответствие = Новый Соответствие;
МесяцыСоответствие.Вставить("ЯНВ", 1); МесяцыСоответствие.Вставить("JAN", 1);
МесяцыСоответствие.Вставить("ФЕВ", 2); МесяцыСоответствие.Вставить("FEB", 2);
МесяцыСоответствие.Вставить("МАР", 3); МесяцыСоответствие.Вставить("MAR", 3);
МесяцыСоответствие.Вставить("АПР", 4); МесяцыСоответствие.Вставить("APR", 4);
МесяцыСоответствие.Вставить("МАЙ", 5); МесяцыСоответствие.Вставить("MAY", 5);
МесяцыСоответствие.Вставить("ИЮН", 6); МесяцыСоответствие.Вставить("JUN", 6);
МесяцыСоответствие.Вставить("ИЮЛ", 7); МесяцыСоответствие.Вставить("JUL", 7);
МесяцыСоответствие.Вставить("АВГ", 8); МесяцыСоответствие.Вставить("AUG", 8);
МесяцыСоответствие.Вставить("СЕН", 9); МесяцыСоответствие.Вставить("SEP", 9);
МесяцыСоответствие.Вставить("ОКТ", 10); МесяцыСоответствие.Вставить("OCT", 10);
МесяцыСоответствие.Вставить("НОЯ", 11); МесяцыСоответствие.Вставить("NOV", 11);
МесяцыСоответствие.Вставить("ДЕК", 12); МесяцыСоответствие.Вставить("DEC", 12);
// Получает номер месяца числом по строковому представлению
//
// Параметры:
// МесяцСтрокойСокр - Строка - первые 3 буквы названия месяца
//
// Возвращаемое значение:
// Число - номер месяца числом
//
Функция ПолучитьНомерМесяцаПоСтроковомуПредставлению(МесяцСтрокойСокр) Экспорт
Если ПустаяСтрока(МесяцСтрокойСокр) Тогда
Возврат 0;
КонецЕсли;
НормализованноеНазвание = ВРег(СокрЛП(МесяцСтрокойСокр));
МесяцЧислом = МесяцыСоответствие[НормализованноеНазвание];
Возврат ?(МесяцЧислом = Неопределено, 0, МесяцЧислом);
КонецФункции
🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[failure] 95-95: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L95
Уменьшите когнитивную сложность "ПолучитьНомерМесяцаПоСтроковомуПредставлению" с 25 до 15


[notice] 97-97: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L97
Возможная опечатка в "Янв"


[notice] 112-112: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L112
Возможная опечатка в "Июн"


[notice] 115-115: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L115
Возможная опечатка в "Июл"


[notice] 100-100: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L100
Возможная опечатка в "Фев"


[notice] 118-118: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L118
Возможная опечатка в "Авг"


[notice] 124-124: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L124
Возможная опечатка в "Окт"


[failure] 95-95: src/cf/CommonModules/пбп_ОбщегоНазначенияКлиентСервер/Ext/Module.bsl#L95
Уменьшите цикломатическую сложность "ПолучитьНомерМесяцаПоСтроковомуПредставлению" с 26 до 20

@ivanmolodec
Copy link
Member

Нужно добавить в предопределенном значении потоков интеграции свойство направление, раз уж это обязательный реквизит

Copy link

Passed

Analysis Details

30 Issues

  • Bug 0 Bugs
  • Vulnerability 0 Vulnerabilities
  • Code Smell 30 Code Smells

Coverage and Duplications

  • Coverage No coverage information (0.00% Estimated after merge)
  • Duplications 0.00% Duplicated Code (0.40% Estimated after merge)

Project ID: PSSL

View in SonarQube

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 1f6ffa5 and 55c723d.

📒 Files selected for processing (1)
  • src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/Ext/Module.bsl (3 hunks)
🧰 Additional context used
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results
src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/Ext/Module.bsl

[warning] 274-274: src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/Ext/Module.bsl#L274
Уберите инициализацию параметров метода "Вставить" вложенными методами

🔇 Additional comments (1)
src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/Ext/Module.bsl (1)

Line range hint 125-138: Корректная реализация направления потока!

Добавление свойства НаправлениеПотока в предопределенный интеграционный поток полностью соответствует требованиям, озвученным в комментариях к PR.

Comment on lines +274 to +275
Колонки.Вставить("НаправлениеПотока" , Новый ОписаниеТипов(
"ПеречислениеСсылка.пбп_НаправленияИнтеграционныхПотоков"));
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется упростить инициализацию колонки

Текущая реализация использует вложенный вызов метода при добавлении колонки, что может усложнить читаемость кода.

Предлагается следующий рефакторинг:

-	Колонки.Вставить("НаправлениеПотока"	, Новый ОписаниеТипов(
-		"ПеречислениеСсылка.пбп_НаправленияИнтеграционныхПотоков"));
+	ОписаниеТиповНаправления = Новый ОписаниеТипов("ПеречислениеСсылка.пбп_НаправленияИнтеграционныхПотоков");
+	Колонки.Вставить("НаправлениеПотока", ОписаниеТиповНаправления);
📝 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
Колонки.Вставить("НаправлениеПотока" , Новый ОписаниеТипов(
"ПеречислениеСсылка.пбп_НаправленияИнтеграционныхПотоков"));
ОписаниеТиповНаправления = Новый ОписаниеТипов("ПеречислениеСсылка.пбп_НаправленияИнтеграционныхПотоков");
Колонки.Вставить("НаправлениеПотока", ОписаниеТиповНаправления);
🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results

[warning] 274-274: src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/Ext/Module.bsl#L274
Уберите инициализацию параметров метода "Вставить" вложенными методами

@ivanmolodec ivanmolodec merged commit 8762df6 into develop Oct 23, 2024
6 checks passed
@ivanmolodec ivanmolodec deleted the rework-upload-file-from-table branch October 23, 2024 15:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement Улучшение существующей функциональности
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants