-
Notifications
You must be signed in to change notification settings - Fork 7
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
Conversation
WalkthroughВ данном пулл-реквесте внесены изменения в несколько файлов, включая обновления в структуре конфигурации форм, добавление новых функций для работы с таблицами и улучшение обработки ошибок. Основные изменения включают добавление атрибута Changes
Possibly related PRs
Suggested reviewers
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? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
Documentation and Community
|
There was a problem hiding this comment.
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
📒 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 fLength 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 10Length 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
: Проверьте порядок параметров в методеМетод
УстановитьПараметрыСоединенияПользователя
может ожидать параметры в определенном порядке. Убедитесь, что порядок параметров соответствует ожиданиям метода.
Функция НайтиПоСсылке(Пользователь) Экспорт | ||
|
||
Возврат Неопределено; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходимо реализовать функционал поиска пользователя
Текущая реализация функции всегда возвращает Неопределено, что не соответствует документации. Функция должна искать пользователя ИБ по ссылке справочника.
Предлагаю следующую реализацию:
Функция НайтиПоСсылке(Пользователь) Экспорт
-
- Возврат Неопределено;
-
+
+ Если Не ЗначениеЗаполнено(Пользователь) Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ ТекПользовательИБ = ПользователиИнформационнойБазы.ТекущийПользователь();
+
+ Если Не ПравоДоступа("Администрирование", Метаданные)
+ И Пользователь <> ТекущийПользователь() Тогда
+ ВызватьИсключение НСтр("ru='Недостаточно прав доступа'");
+ КонецЕсли;
+
+ Для Каждого ПользовательИБ Из ПользователиИнформационнойБазы.ПолучитьПользователей() Цикл
+ Если ПользовательИБ.Имя = Пользователь.Наименование Тогда
+ Возврат ПользовательИБ;
+ КонецЕсли;
+ КонецЦикла;
+
+ Возврат Неопределено;
+
КонецФункции
Committable suggestion was skipped due to low confidence.
// Инициализирует таблицу со свойствами колонок загружаемого файла | ||
// | ||
// Возвращаемое значение: | ||
// ТаблицаЗначений - таблица готовая для заполнения данных колонок | ||
// | ||
Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт | ||
|
||
СвойстваКолонок = Новый ТаблицаЗначений; | ||
ДлинаСтроки = 150; | ||
СвойстваКолонок.Колонки.Добавить("ИмяКолонки" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | ||
СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | ||
СвойстваКолонок.Колонки.Добавить("ТипЗначения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | ||
СвойстваКолонок.Колонки.Добавить("ПолеПоиска1" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | ||
СвойстваКолонок.Колонки.Добавить("ПолеПоиска2" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | ||
СвойстваКолонок.Колонки.Добавить("ПолеПоиска3" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | ||
СвойстваКолонок.Колонки.Добавить("ОператорСравнения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(3)); | ||
|
||
Возврат СвойстваКолонок; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
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.
// Инициализирует таблицу со свойствами колонок загружаемого файла | |
// | |
// Возвращаемое значение: | |
// ТаблицаЗначений - таблица готовая для заполнения данных колонок | |
// | |
Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт | |
СвойстваКолонок = Новый ТаблицаЗначений; | |
ДлинаСтроки = 150; | |
СвойстваКолонок.Колонки.Добавить("ИмяКолонки" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | |
СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | |
СвойстваКолонок.Колонки.Добавить("ТипЗначения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | |
СвойстваКолонок.Колонки.Добавить("ПолеПоиска1" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | |
СвойстваКолонок.Колонки.Добавить("ПолеПоиска2" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | |
СвойстваКолонок.Колонки.Добавить("ПолеПоиска3" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтроки)); | |
СвойстваКолонок.Колонки.Добавить("ОператорСравнения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(3)); | |
Возврат СвойстваКолонок; | |
КонецФункции | |
// Инициализирует таблицу со свойствами колонок загружаемого файла | |
// | |
// Возвращаемое значение: | |
// ТаблицаЗначений - таблица готовая для заполнения данных колонок | |
// | |
Функция ИнициализироватьТаблицуСоСвойствамиКолонок() Экспорт | |
Const ДлинаСтрокиКолонки = 150; | |
СвойстваКолонок = Новый ТаблицаЗначений; | |
СвойстваКолонок.Колонки.Добавить("ИмяКолонки" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки)); | |
СвойстваКолонок.Колонки.Добавить("ИмяВТабДоке" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки)); | |
СвойстваКолонок.Колонки.Добавить("ТипЗначения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки)); | |
СвойстваКолонок.Колонки.Добавить("ПолеПоиска1" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки)); | |
СвойстваКолонок.Колонки.Добавить("ПолеПоиска2" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки)); | |
СвойстваКолонок.Колонки.Добавить("ПолеПоиска3" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(ДлинаСтрокиКолонки)); | |
СвойстваКолонок.Колонки.Добавить("ОператорСравнения" , пбп_ОбщегоНазначенияСервер.ОписаниеТипаСтрока(3)); | |
Возврат СвойстваКолонок; | |
КонецФункции |
Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям(ИнтеграционныйПоток, | ||
ПоляЗапроса = "", ПараметрыЗапроса = Неопределено, КоличествоПервых = 0, СтруктураИстории = Неопределено) Экспорт | ||
|
||
ЗаголовокОшибки = "Данные не были получены из внешнего источника данных"; | ||
СообщениеОбОшибке = ""; | ||
|
||
РеквизитыОбъекта = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( | ||
ИнтеграционныйПоток, "НастройкаИнтеграции.ИмяОбъекта, ТочкаВхода"); | ||
|
||
Если Не ЗначениеЗаполнено(РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта) Тогда | ||
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, | ||
"в настройках интеграции не заполнено наименование внешнего источника данных"); | ||
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); | ||
КонецЕсли; | ||
|
||
Если Не ЗначениеЗаполнено(РеквизитыОбъекта.ТочкаВхода) Тогда | ||
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, | ||
"в интеграционном потоке не заполнено имя таблицы внешнего источника данных"); | ||
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); | ||
КонецЕсли; | ||
|
||
Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда | ||
Возврат СообщениеОбОшибке; | ||
КонецЕсли; | ||
|
||
Попытка | ||
ТаблицаВыборки = ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника( | ||
РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта, РеквизитыОбъекта.ТочкаВхода, ПоляЗапроса); | ||
|
||
Запрос = Новый Запрос; | ||
|
||
ТекстЗапроса = "ВЫБРАТЬ | ||
| &ПоляЗапроса | ||
|ИЗ | ||
| ВнешнийИсточникДанных." + РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта | ||
+ ".Таблица." + РеквизитыОбъекта.ТочкаВхода + " КАК Таблица"; | ||
|
||
Если КоличествоПервых <> 0 Тогда | ||
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ ПЕРВЫЕ " + КоличествоПервых); | ||
КонецЕсли; | ||
|
||
Если Не ПустаяСтрока(ПоляЗапроса) Тогда | ||
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", ПоляЗапроса); | ||
Иначе | ||
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", "Таблица.*"); | ||
КонецЕсли; | ||
|
||
УсловияЗапроса = ""; | ||
|
||
// Установка предопределенных параметров запроса из интеграционного потока | ||
Для Каждого СтрокаПредопределенногоПараметра Из ИнтеграционныйПоток.ПараметрыВхода Цикл | ||
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", ?(ПустаяСтрока(УсловияЗапроса), "", " | ||
| И "), СтрокаПредопределенногоПараметра.Имя); | ||
|
||
Запрос.УстановитьПараметр(СтрокаПредопределенногоПараметра.Имя, СтрокаПредопределенногоПараметра.ЗначениеПоУмолчанию); | ||
КонецЦикла; | ||
|
||
// Установка опциональных параметров запроса | ||
Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл | ||
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", ?(ПустаяСтрока(УсловияЗапроса), "", " | ||
| И "), КлючИЗначение.Ключ); | ||
|
||
Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение); | ||
КонецЦикла; | ||
|
||
Если Не ПустаяСтрока(УсловияЗапроса) Тогда | ||
ТекстЗапроса = ТекстЗапроса + " | ||
|ГДЕ | ||
| " + УсловияЗапроса; | ||
КонецЕсли; | ||
|
||
Запрос.Текст = ТекстЗапроса; | ||
|
||
Если СтруктураИстории <> Неопределено Тогда | ||
СтруктураИстории.ИсходящееСообщение = пбп_ИнтеграцииСлужебный | ||
.ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос); | ||
НачалоВызова = ТекущаяДатаСеанса(); | ||
КонецЕсли; | ||
|
||
РезультатЗапроса = Запрос.Выполнить(); | ||
|
||
Если СтруктураИстории <> Неопределено Тогда | ||
СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова; | ||
КонецЕсли; | ||
|
||
ВыборкаРезультатаЗапроса = РезультатЗапроса.Выбрать(); | ||
|
||
Пока ВыборкаРезультатаЗапроса.Следующий() Цикл | ||
ЗаполнитьЗначенияСвойств(ТаблицаВыборки.Добавить(), ВыборкаРезультатаЗапроса); | ||
КонецЦикла; | ||
|
||
Возврат ТаблицаВыборки; | ||
Исключение | ||
СообщениеОбОшибке = ПолучитьПодробноеПредставлениеОшибкиИсключения(ЗаголовокОшибки, ИнформацияОбОшибке()); | ||
КонецПопытки; | ||
|
||
Возврат СообщениеОбОшибке; | ||
|
||
КонецФункции | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Рассмотрите возможность разделения функции на более мелкие
Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям
содержит много логики и длинна по коду. Для улучшения читаемости и поддерживаемости кода рекомендуется разделить ее на несколько функций, каждую из которых отвечает за свою задачу (например, создание текста запроса, установка параметров, обработка результатов).
ИмяВнешнегоИсточника, ИмяТаблицы, НеобходимыеПоля = "") Экспорт | ||
|
||
ТаблицаДанных = Новый ТаблицаЗначений; | ||
|
||
МетаданныеИсточника = Метаданные.ВнешниеИсточникиДанных[ИмяВнешнегоИсточника]; | ||
МетаданныеТаблицы = МетаданныеИсточника.Таблицы[ИмяТаблицы]; | ||
|
||
МассивНужныхПолей = Новый Массив; | ||
Если Не ПустаяСтрока(НеобходимыеПоля) Тогда | ||
МассивНужныхПолей = пбп_СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок( | ||
НеобходимыеПоля, ",", Истина, Истина); | ||
КонецЕсли; | ||
|
||
КоличествоНужныхПолей = МассивНужныхПолей.Количество(); | ||
Для Каждого ПолеТаблицы Из МетаданныеТаблицы.Поля Цикл | ||
Если КоличествоНужныхПолей <> 0 И МассивНужныхПолей.Найти(ПолеТаблицы.Имя) = Неопределено Тогда | ||
Продолжить; | ||
КонецЕсли; | ||
|
||
ТаблицаДанных.Колонки.Добавить(ПолеТаблицы.Имя, ПолеТаблицы.Тип); | ||
КонецЦикла; | ||
|
||
Возврат ТаблицаДанных; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Оптимизируйте инициализацию таблицы значений
В функции ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника
можно улучшить производительность, предварительно проверяя, существует ли поле в МетаданныеТаблицы.Поля
перед добавлением в массив нужных полей.
ПользовательСсылка = пбп_ПользователиСлужебный.ТекущийПользователь(); | ||
ТекущийПользователь = пбп_ПользователиСлужебный.НайтиПоСсылке(ПользовательСсылка); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Добавьте проверку наличия текущего пользователя
Если метод НайтиПоСсылке
не найдет пользователя, переменная ТекущийПользователь
будет неопределенной, что может вызвать ошибки при дальнейшем использовании. Рекомендуется добавить проверку заполненности ТекущийПользователь
.
Предлагаемый код:
ПользовательСсылка = пбп_ПользователиСлужебный.ТекущийПользователь();
ТекущийПользователь = пбп_ПользователиСлужебный.НайтиПоСсылке(ПользовательСсылка);
+Если Не ЗначениеЗаполнено(ТекущийПользователь) Тогда
+ // Обработка ситуации, когда пользователь не найден
+ Возврат;
+КонецЕсли;
Committable suggestion was skipped due to low confidence.
Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл | ||
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", ?(ПустаяСтрока(УсловияЗапроса), "", " | ||
| И "), КлючИЗначение.Ключ); | ||
|
||
Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение); | ||
КонецЦикла; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Добавьте проверку на наличие параметров запроса
Если ПараметрыЗапроса
не заполнены или равны Неопределено
, цикл Для Каждого
может вызвать ошибку. Рекомендуется добавить проверку перед циклом.
Предлагаемый код:
+Если ПараметрыЗапроса <> Неопределено Тогда
Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл
// существующий код
КонецЦикла;
+КонецЕсли;
Committable suggestion was skipped due to low confidence.
Исключение | ||
ТекстОшибки = НСтр("ru = 'Загрузка файла через табличный документ.Удаление временного файла'"); | ||
ЗаписьЖурналаРегистрации(ТекстОшибки, | ||
УровеньЖурналаРегистрации.Ошибка, , , | ||
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); | ||
КонецПопытки; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Улучшите обработку исключений при удалении временного файла.
В блоке Исключение
при удалении временного файла происходит запись ошибки в журнал, но отсутствуют действия по повторной попытке удаления или уведомлению пользователя о возможных проблемах с очищением временных данных. Рекомендуется добавить уведомление пользователя или обеспечить более надежную очистку временных файлов.
Если ТипКолонки.СодержитТип(Тип("Null")) Тогда | ||
|
||
ИмяКолонки = ТаблицаЗначений.Колонки[чИндекс].Имя; | ||
ЗагКолонки = ТаблицаЗначений.Колонки[чИндекс].Заголовок; | ||
ШирКолонки = ТаблицаЗначений.Колонки[чИндекс].Ширина; | ||
ЗнчКолонки = ТаблицаЗначений.ВыгрузитьКолонку(чИндекс); | ||
ТипКолонки = Новый ОписаниеТипов(ТипКолонки, ,"NULL" | ||
,ТипКолонки.КвалификаторыЧисла | ||
,ТипКолонки.КвалификаторыСтроки | ||
,ТипКолонки.КвалификаторыДаты | ||
,ТипКолонки.КвалификаторыДвоичныхДанных | ||
); | ||
|
||
ТаблицаЗначений.Колонки.Удалить(чИндекс); | ||
ТаблицаЗначений.Колонки.Вставить(чИндекс, ИмяКолонки, ТипКолонки, ЗагКолонки, ШирКолонки); | ||
ТаблицаЗначений.ЗагрузитьКолонку(ЗнчКолонки, чИндекс); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Избегайте изменения структуры таблицы во время итерации по колонкам.
В процедуре ТаблицаЗначенийБезNull
происходит удаление и вставка колонок внутри цикла по индексам, что может привести к смещению индексов и ошибкам. Рекомендуется сначала собрать список колонок для изменения, а затем применять изменения после завершения цикла.
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); | ||
КонецПопытки; | ||
|
||
Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Исправьте опечатку в имени переменной Табдок
.
На строке 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.
Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), Табдок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено); | |
Лист = ?(ЗначениеЗаполнено(НазваниеЛиста), ТабДок.Области.Найти(СтрЗаменить(НазваниеЛиста, " ", "_")), Неопределено); |
Счетчик = 0; | ||
ТЗ[Н].ПорядковыйНомер = Н; | ||
|
||
Для Каждого Колонка Из ТЗ.Колонки Цикл | ||
Если Не ЗначениеЗаполнено(ТЗ[Н][Колонка.Имя]) Тогда | ||
Счетчик = Счетчик + 1; | ||
КонецЕсли; | ||
КонецЦикла; | ||
|
||
Если Счетчик = ТЗ.Колонки.Количество() Тогда | ||
ТЗ.Удалить(Н); | ||
КонецЕсли; | ||
|
||
Н = Н - 1; | ||
|
There was a problem hiding this comment.
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.
There was a problem hiding this 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
: Добавьте перевод и документацию для статуса "Служебный"Для поддержания консистентности с другими значениями перечисления, необходимо:
- Добавить английский перевод в секцию Synonym
- Добавить описание назначения статуса в поле 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
: Добавьте перевод и документацию для статуса "ОшибкаСлужебного"Для поддержания консистентности с другими значениями перечисления, необходимо:
- Добавить английский перевод в секцию Synonym
- Добавить описание назначения статуса в поле 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
📒 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 xmlLength 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/пбп_ИнтеграционныеПотоки.xmlLength 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 fLength 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 bslLength 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 bslLength 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.bslLength of output: 25106
src/cf/Catalogs/пбп_ИнтеграционныеПотоки/Forms/ФормаЭлемента/Ext/Form.xml (1)
91-96
: Проверьте добавление поля направления потокаПоле корректно добавлено в форму, но рекомендуется:
- Добавить обработчик события ПриИзменении для синхронизации с другими полями формы
- Рассмотреть необходимость добавления подсказки в 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)
- Корректные настройки индексации и полнотекстового поиска
<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> |
There was a problem hiding this comment.
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.
<InputField name="НаправлениеПотока" id="59"> | ||
<DataPath>Объект.НаправлениеПотока</DataPath> | ||
<ExtendedEditMultipleValues>true</ExtendedEditMultipleValues> | ||
<ContextMenu name="НаправлениеПотокаКонтекстноеМеню" id="60"/> | ||
<ExtendedTooltip name="НаправлениеПотокаРасширеннаяПодсказка" id="61"/> | ||
</InputField> |
There was a problem hiding this comment.
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.
<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> |
There was a problem hiding this 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
📒 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 до 15src/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/ЗагрузкаФайлаЧерезТабличныйДокумент.mdLength 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
: Оптимизируйте инициализацию таблицы значений
МакетТаблица = ПолучитьИзВременногоХранилища(Макет); | ||
|
||
Для Каждого КолонкаТаблицы Из МакетТаблица Цикл | ||
Заглушка.Колонки.Добавить(КолонкаТаблицы.ИмяКолонки, Новый ОписаниеТипов(КолонкаТаблицы.ТипЗначения)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходима проверка структуры входных данных!
Текущая реализация предполагает определенную структуру входных данных без её проверки. Необходимо:
- Добавить проверку существования колонок ИмяКолонки и ТипЗначения
- Обработать возможные ошибки при работе с временным хранилищем
Предлагаемые изменения:
+ Если Не ЗначениеЗаполнено(Макет) Тогда
+ ВызватьИсключение НСтр("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.
МакетТаблица = ПолучитьИзВременногоХранилища(Макет); | |
Для Каждого КолонкаТаблицы Из МакетТаблица Цикл | |
Заглушка.Колонки.Добавить(КолонкаТаблицы.ИмяКолонки, Новый ОписаниеТипов(КолонкаТаблицы.ТипЗначения)); | |
Если Не ЗначениеЗаполнено(Макет) Тогда | |
ВызватьИсключение НСтр("ru='Не указан адрес макета во временном хранилище'"); | |
КонецЕсли; | |
МакетТаблица = ПолучитьИзВременногоХранилища(Макет); | |
Если МакетТаблица = Неопределено Тогда | |
ВызватьИсключение НСтр("ru='Не удалось получить данные из временного хранилища'"); | |
КонецЕсли; | |
Если МакетТаблица.Колонки.Найти("ИмяКолонки") = Неопределено | |
Или МакетТаблица.Колонки.Найти("ТипЗначения") = Неопределено Тогда | |
ВызватьИсключение НСтр("ru='Некорректная структура входных данных'"); | |
КонецЕсли; | |
Для Каждого КолонкаТаблицы Из МакетТаблица Цикл | |
Заглушка.Колонки.Добавить(КолонкаТаблицы.ИмяКолонки, Новый ОписаниеТипов(КолонкаТаблицы.ТипЗначения)); |
ХранилищеИсточников.Вставить(РазбивкаТипа[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)); | ||
|
||
Для Каждого СтрокаТаблицы Из ТЗ Цикл | ||
|
||
Для Каждого ИмяМассива Из МассивИменСсылочных Цикл | ||
СтрокаТаблицы[ИмяМассива + "КодЧислом"] = ОТЧ.ПривестиЗначение(СтрокаТаблицы[ИмяМассива]); | ||
КонецЦикла; | ||
|
||
Для Каждого Колонка Из СоответствиеПеречислений Цикл | ||
|
||
Для Каждого ТекЭлемент Из Метаданные.Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")].ЗначенияПеречисления Цикл | ||
Если нРег(ТекЭлемент.Синоним) = нРег(СтрокаТаблицы[Колонка.Ключ]) Тогда | ||
СтрокаТаблицы[Колонка.Ключ + "НеОбрабатывать"] = Перечисления[СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", "")][ТекЭлемент.Имя]; | ||
Прервать; | ||
КонецЕсли; | ||
КонецЦикла; | ||
|
||
КонецЦикла; | ||
|
||
КонецЦикла; | ||
|
||
Запрос = Новый Запрос; | ||
Запрос.Текст = | ||
"ВЫБРАТЬ | ||
| #ВставкаВТ | ||
|ПОМЕСТИТЬ ВходнаяТаблица | ||
|ИЗ | ||
| &ВходнаяТаблица КАК ВходнаяТаблица | ||
|; | ||
| | ||
|//////////////////////////////////////////////////////////////////////////////// | ||
|ВЫБРАТЬ | ||
| #ВставкаСсылочные | ||
| #ВставкаБазовые | ||
|ИЗ | ||
| ВходнаяТаблица КАК ВходнаяТаблица | ||
| #ВставкаИсточники | ||
| | ||
|УПОРЯДОЧИТЬ ПО | ||
| ВходнаяТаблица.ПорядковыйНомер"; | ||
|
||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаВТ", ВставкаВТ); | ||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаСсылочные", ВставкаСсылочные); | ||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаБазовые", ВставкаБазовые); | ||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаИсточники", ВставкаИсточники); | ||
|
||
Запрос.УстановитьПараметр("ВходнаяТаблица", ТЗ); | ||
РезультатЗапроса = Запрос.Выполнить(); | ||
|
||
ПоместитьВоВременноеХранилище(РезультатЗапроса.Выгрузить(), АдресПомещения); | ||
ПоместитьВоВременноеХранилище(ТаблицаДанных, Параметры.АдресПомещения); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Требуется проверка входных параметров!
Необходимо добавить валидацию входных параметров перед их использованием:
- Проверка существования адреса во временном хранилище
- Проверка корректности структуры параметров
Предлагаемые изменения:
Процедура ФормированиеТаблицы(АдресВХранилище, Расширение, Параметры) Экспорт
+ Если Не ЗначениеЗаполнено(Параметры.АдресМакета) Тогда
+ ВызватьИсключение НСтр("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.
ТаблицаСвойств = ПолучитьИзВременногоХранилища(Параметры.АдресМакета); | |
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресВХранилище); | |
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение); | |
ДвоичныеДанные.Записать(ИмяВременногоФайла); | |
ПараметрыЧтения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла(); | |
ПараметрыЧтения.НазваниеЛиста = Параметры.НазваниеЛиста; | |
ПараметрыЧтения.НомерСтроки = Параметры.НомерПервойСтроки; | |
ПараметрыЧтения.СопоставлениеПоНаименованию = Параметры.ПоНаименованию; | |
ТабДок = Новый ТабличныйДокумент; | |
ТабДок.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст); | |
ТаблицаДанных = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер | |
.КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений( | |
АдресВХранилище, Расширение, ТаблицаСвойств, ПараметрыЧтения); | |
Попытка | |
УдалитьФайлы(ИмяВременногоФайла); | |
Исключение | |
ЗаписьЖурналаРегистрации(НСтр("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='Не указан адрес для помещения результата'"); | |
КонецЕсли; | |
ТаблицаСвойств = ПолучитьИзВременногоХранилища(Параметры.АдресМакета); | |
ПараметрыЧтения = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер.ПолучитьПараметрыЧтенияФайла(); | |
ПараметрыЧтения.НазваниеЛиста = Параметры.НазваниеЛиста; | |
ПараметрыЧтения.НомерСтроки = Параметры.НомерПервойСтроки; | |
ПараметрыЧтения.СопоставлениеПоНаименованию = Параметры.ПоНаименованию; | |
ТаблицаДанных = пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер | |
.КонвертироватьДанныеТабличногоДокументаВТаблицуЗначений( | |
АдресВХранилище, Расширение, ТаблицаСвойств, ПараметрыЧтения); | |
ПоместитьВоВременноеХранилище(ТаблицаДанных, Параметры.АдресПомещения); |
// Получает представление текста запроса внешнего источника данных | ||
// | ||
// Параметры: | ||
// Запрос - Строка - текст запроса к таблице внешнего источника данных с добавлением значений параметров в текст | ||
// | ||
// Возвращаемое значение: | ||
// Строка - текст запроса с заполненными значениями параметров | ||
// | ||
Функция ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос) Экспорт | ||
|
||
ПредставлениеТекстаЗапроса = Запрос.Текст; | ||
|
||
Для Каждого ПараметрЗапроса Из Запрос.Параметры Цикл | ||
ТипЗначения = ТипЗнч(ПараметрЗапроса.Значение); | ||
Если ТипЗначения = Тип("Строка") Тогда | ||
ПредставлениеЗначения = """" + ПараметрЗапроса.Значение + """"; | ||
ИначеЕсли ТипЗначения = Тип("Дата") Тогда | ||
ПредставлениеЗначения = "'" + Формат(ПараметрЗапроса.Значение, "ДЛФ=DT") + "'"; | ||
ИначеЕсли ТипЗначения = Тип("Булево") Тогда | ||
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "БЛ=ЛОЖЬ; БИ=ИСТИНА"); | ||
Иначе | ||
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "ЧГ="); | ||
КонецЕсли; | ||
|
||
ПредставлениеТекстаЗапроса = СтрЗаменить(ПредставлениеТекстаЗапроса, | ||
"&" + ПараметрЗапроса.Ключ, ПредставлениеЗначения); | ||
КонецЦикла; | ||
|
||
Возврат ПредставлениеТекстаЗапроса; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Рекомендации по улучшению обработки параметров запроса.
Предлагаю следующие улучшения:
- Добавить проверку входного параметра Запрос на неопределено
- Вынести строковые литералы в константы
- Добавить обработку исключений для некорректных типов параметров
Пример реализации:
Функция ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос) Экспорт
+ Если Запрос = Неопределено Тогда
+ ВызватьИсключение НСтр("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.
// Получает представление текста запроса внешнего источника данных | |
// | |
// Параметры: | |
// Запрос - Строка - текст запроса к таблице внешнего источника данных с добавлением значений параметров в текст | |
// | |
// Возвращаемое значение: | |
// Строка - текст запроса с заполненными значениями параметров | |
// | |
Функция ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос) Экспорт | |
ПредставлениеТекстаЗапроса = Запрос.Текст; | |
Для Каждого ПараметрЗапроса Из Запрос.Параметры Цикл | |
ТипЗначения = ТипЗнч(ПараметрЗапроса.Значение); | |
Если ТипЗначения = Тип("Строка") Тогда | |
ПредставлениеЗначения = """" + ПараметрЗапроса.Значение + """"; | |
ИначеЕсли ТипЗначения = Тип("Дата") Тогда | |
ПредставлениеЗначения = "'" + Формат(ПараметрЗапроса.Значение, "ДЛФ=DT") + "'"; | |
ИначеЕсли ТипЗначения = Тип("Булево") Тогда | |
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "БЛ=ЛОЖЬ; БИ=ИСТИНА"); | |
Иначе | |
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "ЧГ="); | |
КонецЕсли; | |
ПредставлениеТекстаЗапроса = СтрЗаменить(ПредставлениеТекстаЗапроса, | |
"&" + ПараметрЗапроса.Ключ, ПредставлениеЗначения); | |
КонецЦикла; | |
Возврат ПредставлениеТекстаЗапроса; | |
КонецФункции | |
// Получает представление текста запроса внешнего источника данных | |
// | |
// Параметры: | |
// Запрос - Строка - текст запроса к таблице внешнего источника данных с добавлением значений параметров в текст | |
// | |
// Возвращаемое значение: | |
// Строка - текст запроса с заполненными значениями параметров | |
// | |
Функция ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос) Экспорт | |
Если Запрос = Неопределено Тогда | |
ВызватьИсключение НСтр("ru='Параметр Запрос не может быть неопределено'"); | |
КонецЕсли; | |
Попытка | |
ПредставлениеТекстаЗапроса = Запрос.Текст; | |
Для Каждого ПараметрЗапроса Из Запрос.Параметры Цикл | |
ТипЗначения = ТипЗнч(ПараметрЗапроса.Значение); | |
Если ТипЗначения = Тип("Строка") Тогда | |
ПредставлениеЗначения = """" + ПараметрЗапроса.Значение + """"; | |
ИначеЕсли ТипЗначения = Тип("Дата") Тогда | |
ПредставлениеЗначения = "'" + Формат(ПараметрЗапроса.Значение, "ДЛФ=DT") + "'"; | |
ИначеЕсли ТипЗначения = Тип("Булево") Тогда | |
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "БЛ=ЛОЖЬ; БИ=ИСТИНА"); | |
Иначе | |
ПредставлениеЗначения = Формат(ПараметрЗапроса.Значение, "ЧГ="); | |
КонецЕсли; | |
ПредставлениеТекстаЗапроса = СтрЗаменить(ПредставлениеТекстаЗапроса, | |
"&" + ПараметрЗапроса.Ключ, ПредставлениеЗначения); | |
КонецЦикла; | |
Возврат ПредставлениеТекстаЗапроса; | |
Исключение | |
ВызватьИсключение НСтр("ru='Ошибка при форматировании параметров запроса: '") + | |
ОписаниеОшибки(); | |
КонецПопытки; | |
КонецФункции |
|
||
РеквизитыОбъекта = пбп_ОбщегоНазначенияСервер.ЗначенияРеквизитовОбъекта( | ||
ИнтеграционныйПоток, "НастройкаИнтеграции.ИмяОбъекта, ТочкаВхода"); | ||
|
||
Если Не ЗначениеЗаполнено(РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта) Тогда | ||
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, | ||
"в настройках интеграции не заполнено наименование внешнего источника данных"); | ||
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); | ||
КонецЕсли; | ||
|
||
Если Не ЗначениеЗаполнено(РеквизитыОбъекта.ТочкаВхода) Тогда | ||
ПолноеОписаниеОшибки = СтрШаблон("ru = '%1. Подробно: %2';", ЗаголовокОшибки, | ||
"в интеграционном потоке не заполнено имя таблицы внешнего источника данных"); | ||
СообщениеОбОшибке = НСтр(ПолноеОписаниеОшибки); | ||
КонецЕсли; | ||
|
||
Если Не ПустаяСтрока(СообщениеОбОшибке) Тогда | ||
Возврат СообщениеОбОшибке; | ||
КонецЕсли; | ||
|
||
Попытка | ||
ТаблицаВыборки = ИнициализироватьТаблицуЗначенийИзТаблицыВнешнегоИсточника( | ||
РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта, РеквизитыОбъекта.ТочкаВхода, ПоляЗапроса); | ||
|
||
Запрос = Новый Запрос; | ||
|
||
ТекстЗапроса = "ВЫБРАТЬ | ||
| &ПоляЗапроса | ||
|ИЗ | ||
| ВнешнийИсточникДанных." + РеквизитыОбъекта.НастройкаИнтеграцииИмяОбъекта | ||
+ ".Таблица." + РеквизитыОбъекта.ТочкаВхода + " КАК Таблица"; | ||
|
||
Если КоличествоПервых <> 0 Тогда | ||
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ВЫБРАТЬ", "ВЫБРАТЬ ПЕРВЫЕ " + КоличествоПервых); | ||
КонецЕсли; | ||
|
||
Если Не ПустаяСтрока(ПоляЗапроса) Тогда | ||
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", ПоляЗапроса); | ||
Иначе | ||
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "&ПоляЗапроса", "Таблица.*"); | ||
КонецЕсли; | ||
|
||
УсловияЗапроса = ""; | ||
|
||
// Установка предопределенных параметров запроса из интеграционного потока | ||
Для Каждого СтрокаПредопределенногоПараметра Из ИнтеграционныйПоток.ПараметрыВхода Цикл | ||
НуженПеренос = ?(ПустаяСтрока(УсловияЗапроса), "", " | ||
| И "); | ||
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", | ||
НуженПеренос, СтрокаПредопределенногоПараметра.Имя); | ||
|
||
Запрос.УстановитьПараметр( | ||
СтрокаПредопределенногоПараметра.Имя, | ||
СтрокаПредопределенногоПараметра.ЗначениеПоУмолчанию); | ||
КонецЦикла; | ||
|
||
// Установка опциональных параметров запроса | ||
Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл | ||
НуженПеренос = ?(ПустаяСтрока(УсловияЗапроса), "", " | ||
| И "); | ||
УсловияЗапроса = УсловияЗапроса + СтрШаблон("%1Таблица.%2 = &%2", | ||
НуженПеренос, КлючИЗначение.Ключ); | ||
|
||
Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение); | ||
КонецЦикла; | ||
|
||
Если Не ПустаяСтрока(УсловияЗапроса) Тогда | ||
ТекстЗапроса = ТекстЗапроса + " | ||
|ГДЕ | ||
| " + УсловияЗапроса; | ||
КонецЕсли; | ||
|
||
Запрос.Текст = ТекстЗапроса; | ||
|
||
Если СтруктураИстории <> Неопределено Тогда | ||
СтруктураИстории.ИсходящееСообщение = пбп_ИнтеграцииСлужебный | ||
.ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных(Запрос); | ||
НачалоВызова = ТекущаяДатаСеанса(); | ||
КонецЕсли; | ||
|
||
РезультатЗапроса = Запрос.Выполнить(); | ||
|
||
Если СтруктураИстории <> Неопределено Тогда | ||
СтруктураИстории.ДлительностьВызова = ТекущаяДатаСеанса() - НачалоВызова; | ||
КонецЕсли; | ||
|
||
ВыборкаРезультатаЗапроса = РезультатЗапроса.Выбрать(); | ||
|
||
Пока ВыборкаРезультатаЗапроса.Следующий() Цикл | ||
ЗаполнитьЗначенияСвойств(ТаблицаВыборки.Добавить(), ВыборкаРезультатаЗапроса); | ||
КонецЦикла; | ||
|
||
Возврат ТаблицаВыборки; | ||
Исключение | ||
СообщениеОбОшибке = ПолучитьПодробноеПредставлениеОшибкиИсключения(ЗаголовокОшибки, ИнформацияОбОшибке()); | ||
КонецПопытки; | ||
|
||
Возврат СообщениеОбОшибке; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
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
// Строка, ТаблицаЗначений - таблица значений с данными, полученными из внешнего источника, | ||
// с типизированными колонками или строка с ошибкой | ||
// | ||
Функция ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям(ИнтеграционныйПоток, |
There was a problem hiding this comment.
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 Тогда |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Использование несуществующего метода "ПолучитьНомерМесяцаПоСтроковомуПредставлению".
В функциях ПолучитьНомерФорматаДатыИзСтроки
и ПреобразоватьДатуИзСтрокиПоФормату
вызывается метод ПолучитьНомерМесяцаПоСтроковомуПредставлению
из общего модуля пбп_ОбщегоНазначенияКлиентСервер
, который не существует. Это приведет к ошибке во время выполнения.
Рекомендуется реализовать данный метод в указанном модуле или использовать альтернативный метод для определения номера месяца по строковому представлению.
Also applies to: 681-681
🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results
[failure] 581-581: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L581
Метод ПолучитьНомерМесяцаПоСтроковомуПредставлению общего модуля пбп_ОбщегоНазначенияКлиентСервер не существует
+ " = " + ИмяОбъекта + Итерация + "." + РеквизитСравнения; | ||
КонецЦикла; | ||
|
||
Если Не ПустаяСтрока(ВставкаУсловияСоединения) Тогда | ||
ВставкаИсточники = ВставкаИсточники + " | ||
| ЛЕВОЕ СОЕДИНЕНИЕ " + СтрЗаменить(СтрокаТаблицы.ТипЗначения, СсылкаСтрока, "") | ||
+ " КАК " + ИмяОбъекта + Итерация + " | ||
| ПО ВходнаяТаблица." + СтрокаТаблицы.ИмяКолонки + " <> """" И " | ||
+ ВходнаяТаблицаСтрока + СтрокаТаблицы.ИмяКолонки + " <> 0 | ||
| И (" + ВставкаУсловияСоединения + ")"; | ||
КонецЕсли; | ||
|
||
ВставкаБазовые = ВставкаБазовые + ВходнаяТаблицаСтрока + СтрокаТаблицы.ИмяКолонки | ||
+ " КАК " + СтрокаТаблицы.ИмяКолонки + "Служебный," + Символы.ПС; | ||
КонецЕсли; | ||
|
||
ИначеЕсли СтрНайти(СтрокаТаблицы.ТипЗначения, "Перечисление") <> 0 Тогда | ||
КолонкаПеречисления = ТЗ.Колонки.Добавить(СтрокаТаблицы.ИмяКолонки + СтрокаНеОбрабатывать, | ||
Новый ОписаниеТипов(СтрокаТаблицы.ТипЗначения)); | ||
СоответствиеПеречислений.Вставить(СтрокаТаблицы.ИмяКолонки, СтрокаТаблицы.ТипЗначения); | ||
ВставкаВТ = СтрЗаменить(ВставкаВТ, "." + СтрокаТаблицы.ИмяКолонки + " КАК", "." + КолонкаПеречисления.Имя + " КАК"); | ||
ВставкаБазовые = ВставкаБазовые + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки); | ||
ИначеЕсли Не СтрНайти(СтрокаТаблицы.ИмяКолонки, СтрокаНеОбрабатывать) > 0 Тогда | ||
ВставкаБазовые = ВставкаБазовые + СтрШаблон(ШаблонИмяКолонки, СтрокаТаблицы.ИмяКолонки); | ||
Если СтрНайти(СтрокаТаблицы.ТипЗначения, "Дата") <> 0 | ||
И ТЗ.Колонки.Найти(СтрокаТаблицы.ИмяКолонки + "Строкой") <> Неопределено Тогда | ||
СтруктураИменКолонокДат.Вставить(СтрокаТаблицы.ИмяКолонки, ""); | ||
КонецЕсли; | ||
КонецЕсли; | ||
|
||
КонецЦикла; | ||
|
||
ВставкаВТ = ВставкаВТ + "ВходнаяТаблица.ПорядковыйНомер Как ПорядковыйНомер"; | ||
КоличествоСимволовЛев = 2; | ||
ВставкаБазовые = Лев(ВставкаБазовые, СтрДлина(ВставкаБазовые) - КоличествоСимволовЛев); | ||
|
||
Если КонвертироватьДаты Тогда | ||
ПрисвоитьНомераФорматовКолонокДат(ТЗ, СтруктураИменКолонокДат); | ||
КонецЕсли; | ||
|
||
Для Каждого СтрокаТаблицы Из ТЗ Цикл | ||
|
||
Для Каждого ИмяМассива Из МассивИменСсылочных Цикл | ||
СтрокаТаблицы[ИмяМассива + КодЧисломСтрока] = ОписаниеТипаЧисло15.ПривестиЗначение(СтрокаТаблицы[ИмяМассива]); | ||
КонецЦикла; | ||
|
||
Для Каждого Колонка Из СоответствиеПеречислений Цикл | ||
ИмяПеречисления = СтрЗаменить(Колонка.Значение, "ПеречислениеСсылка.", ""); | ||
|
||
Для Каждого ТекЭлемент Из Метаданные.Перечисления[ИмяПеречисления].ЗначенияПеречисления Цикл | ||
Если НРег(ТекЭлемент.Синоним) = НРег(СтрокаТаблицы[Колонка.Ключ]) Тогда | ||
СтрокаТаблицы[Колонка.Ключ + СтрокаНеОбрабатывать] = Перечисления[ИмяПеречисления][ТекЭлемент.Имя]; | ||
Прервать; | ||
КонецЕсли; | ||
КонецЦикла; | ||
|
||
КонецЦикла; | ||
|
||
Если КонвертироватьДаты Тогда | ||
Для Каждого КлючИЗначение Из СтруктураИменКолонокДат Цикл | ||
СтрокаТаблицы[КлючИЗначение.Ключ] = ПреобразоватьДатуИзСтрокиПоФормату( | ||
СтрокаТаблицы[КлючИЗначение.Ключ + "Строкой"], КлючИЗначение.Значение); | ||
КонецЦикла; | ||
КонецЕсли; | ||
|
||
КонецЦикла; | ||
|
||
Запрос = Новый Запрос; | ||
Запрос.Текст = | ||
"ВЫБРАТЬ | ||
| #ВставкаВТ | ||
|ПОМЕСТИТЬ ВходнаяТаблица | ||
|ИЗ | ||
| &ВходнаяТаблица КАК ВходнаяТаблица | ||
|; | ||
| | ||
|//////////////////////////////////////////////////////////////////////////////// | ||
|ВЫБРАТЬ | ||
| #ВставкаСсылочные | ||
| #ВставкаБазовые | ||
|ИЗ | ||
| ВходнаяТаблица КАК ВходнаяТаблица | ||
| #ВставкаИсточники | ||
| | ||
|УПОРЯДОЧИТЬ ПО | ||
| ВходнаяТаблица.ПорядковыйНомер"; | ||
|
||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаВТ", ВставкаВТ); | ||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаСсылочные", ВставкаСсылочные); | ||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаБазовые", ВставкаБазовые); | ||
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#ВставкаИсточники", ВставкаИсточники); | ||
|
||
Запрос.УстановитьПараметр("ВходнаяТаблица", ТЗ); | ||
РезультатЗапроса = Запрос.Выполнить(); | ||
|
||
ВыгрузкаРезультатаЗапроса = РезультатЗапроса.Выгрузить(); | ||
|
||
Возврат ВыгрузкаРезультатаЗапроса; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
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
Функция ПолучитьНомерФорматаДатыИзСтроки(ЗначениеКолонки) | ||
|
||
ЕстьВремя = СтрНайти(ЗначениеКолонки, ":") > 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"; | ||
КонецЕсли; | ||
|
||
Возврат РазрядРазделителя + "_" + РазрядФормата + "_" + РазрядВремени; | ||
|
||
КонецФункции | ||
|
There was a problem hiding this comment.
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
Функция ПреобразоватьДатуИзСтрокиПоФормату(ВхЗначение, НомерФормата) | ||
|
||
ПреобразованнаяДата = Неопределено; | ||
Если НомерФормата = "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" + День; | ||
КонецЕсли; | ||
|
||
СтрокаДата = День + "." + Месяц + "." + Год; | ||
|
||
ПреобразованнаяДата = Дата(СтрокаДата + " " + СтрокаВремя); | ||
|
||
КонецЕсли; | ||
|
||
Возврат ПреобразованнаяДата; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
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", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Исправьте синтаксическую ошибку в объявлении переменной.
В строке 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.
ТипКолонки = Новый ОписаниеТипов(ТипКолонки, ,"NULL", | |
ТипКолонки = Новый ОписаниеТипов(ТипКолонки, "NULL", |
🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results
[notice] 320-320: src/cf/CommonModules/пбп_ЗагрузкаФайлаЧерезТабличныйДокументСервер/Ext/Module.bsl#L320
Справа от ',' не хватает пробела
There was a problem hiding this 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
: Дополните документацию функции.Рекомендуется добавить в документацию:
- Примеры использования
- Описание возвращаемого значения 0 при некорректном вводе
- Поддерживаемые форматы названий месяцев
📜 Review details
Configuration used: .coderabbit.yaml
Review profile: CHILL
📒 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
// Получает номер месяца числом по строковому представлению | ||
// | ||
// Параметры: | ||
// МесяцСтрокойСокр - Строка - первые 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; | ||
КонецЕсли; | ||
|
||
Возврат МесяцЧислом; | ||
|
||
КонецФункции |
There was a problem hiding this comment.
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); МесяцыСоответствие.Вставить("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, МесяцЧислом);
Преимущества предложенного решения:
- Уменьшение сложности кода
- Улучшение производительности за счет использования соответствия
- Более надежная обработка входных данных
- Упрощение поддержки кода
📝 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.
// Получает номер месяца числом по строковому представлению | |
// | |
// Параметры: | |
// МесяцСтрокойСокр - Строка - первые 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
Нужно добавить в предопределенном значении потоков интеграции свойство направление, раз уж это обязательный реквизит |
There was a problem hiding this 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
📒 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.
Колонки.Вставить("НаправлениеПотока" , Новый ОписаниеТипов( | ||
"ПеречислениеСсылка.пбп_НаправленияИнтеграционныхПотоков")); |
There was a problem hiding this comment.
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.
Колонки.Вставить("НаправлениеПотока" , Новый ОписаниеТипов( | |
"ПеречислениеСсылка.пбп_НаправленияИнтеграционныхПотоков")); | |
ОписаниеТиповНаправления = Новый ОписаниеТипов("ПеречислениеСсылка.пбп_НаправленияИнтеграционныхПотоков"); | |
Колонки.Вставить("НаправлениеПотока", ОписаниеТиповНаправления); |
🧰 Tools
🪛 GitHub Check: 1C: Project SubSystems Library Sonarqube Results
[warning] 274-274: src/cf/CommonModules/пбп_ПредопределенныеЗначенияПереопределяемый/Ext/Module.bsl#L274
Уберите инициализацию параметров метода "Вставить" вложенными методами
#76, #100, #126
Изменение передачи свойств колонок табличного документа (была структура, сейчас таблица значений). Изменение алгоритма поиска данных. Было: документы по номеру, справочники по наименованию. Добавление варианта сопоставления колонок по наименованию, а не только в жесткой последовательности. Добавление функций преобразования даты из произвольного формата строки в тип Дата. Добавление возможности использования оператора сравнения И при соединениях данных таблицы и ссылочных объектов.
Исправление передачи пользователя в параметры установки параметров соединения внешнего источника данных. Добавление функции получения данных из таблицы внешнего источника данных с динамическим составлением запроса выборки по передаваемым условиям. Добавление функции инициализации таблицы значений с типизированным колонками на основании метаданных таблицы внешнего источника данных
Summary by CodeRabbit
Новые функции
НайтиПоСсылке
для поиска пользователя по ссылке.ПолучитьТаблицуДанныхИзВнешнегоИсточникаПоУсловиям
для извлечения данных из внешних источников.ИнициализироватьТаблицуСоСвойствамиКолонок
для инициализации свойств колонок загружаемого файла.НаправлениеПотока
в каталог интеграционных потоков.ПолучитьПредставлениеТекстЗапросаВнешнегоИсточникаДанных
для построения строк запроса к внешним источникам данных.ПолучитьНомерМесяцаПоСтроковомуПредставлению
для преобразования строкового представления месяца в числовое значение.Исправления ошибок
Документация
Обновления конфигурации