Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

233457 редактирование статей по изменениям принципов DI в ORM #199

Open
wants to merge 6 commits into
base: master
Choose a base branch
from

Conversation

Nasutya
Copy link
Contributor

@Nasutya Nasutya commented Nov 8, 2023

233457 update articles
Внесла правки по устаревшим конструкциям, параллельно правила стилистику и оформление этих статей.

Summary by CodeRabbit

Примечания к выпуску

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

    • Внедрение зависимости для получения экземпляра IDataService через IUnityContainer.
    • Обновление методов для работы с LimitFunction и ExternalLangDef.
  • Улучшения документации

    • Расширенные инструкции по интеграции и использованию LookUp, GEEditorExt, и других компонентов.
    • Добавлены примеры кода для подстановки значений параметров в limitFunction.
    • Обновлены разделы о работе с PseudoDetail, VariableDef и DateTime ограничениями.
  • Исправления ошибок

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

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

Copy link

coderabbitai bot commented Oct 25, 2024

Walkthrough

В данном пул-реквесте внесены изменения в документацию и код, касающиеся улучшения механизма получения данных, а также внедрения зависимости через контейнер Unity. Основные изменения касаются методов, связанных с получением экземпляров IDataService и ExternalLangDef, что позволяет улучшить управление зависимостями. Также обновлены примеры кода и документация для повышения ясности и структурированности, включая обработку событий и улучшение интерфейса пользователя.

Changes

Файл Изменения
pages/guides/practical-guides/flexberry-asp-net/gpg_auto-get-data-from-lookup.en.md Обновлен метод PreApplyToControls для использования контейнера Unity для получения IDataService. Добавлен обработчик события change для элемента ctrlЗаказ. Указано, что flexberryautogenerated должно быть установлено в false.
pages/guides/practical-guides/flexberry-asp-net/gpg_auto-get-data-from-lookup.ru.md Аналогичные изменения, как в английской версии.
pages/guides/practical-guides/flexberry-ember/gpg_server-logic-implementation.md Добавлен метод changeOrderStatusPaid() и обновлен метод OnUpdateOrder, изменена логика обработки статусов заказа.
pages/products/flexberry-aspnet/controls/limit-editor/fa_limit-function-parameters.ru.md Обновлены комментарии и примеры к методу SubstituteParameters, улучшена ясность.
pages/products/flexberry-aspnet/controls/lookup/fa_lookup-limit-web.en.md Обновлены примеры кода для получения IDataService через контейнер Unity.
pages/products/flexberry-orm/additional-features/fo_additional-loading.ru.md Уточнены инструкции по загрузке объектов, улучшена структура документа.
pages/products/flexberry-orm/query-language/fo_exist-details.ru.md Обновлены примеры кода для работы с ExternalLangDef, улучшено управление зависимостями.
pages/products/flexberry-winforms/controls/lookup/fw_lookup.ru.md Обновлены методы для получения IDataService через Unity, улучшены инструкции по обработке событий.
pages/products/flexberry-winforms/forms/editform/fw_edit-objects-on-forms.ru.md Добавлен метод SwitchEditingObject(newObject) для переключения редактируемого объекта.
pages/products/flexberry-winforms/forms/editform/fw_editform.ru.md Обновлены разделы о создании и настройке форм редактирования, улучшены примеры кода.

Poem

В лесу, где зайцы скачут,
Изменения в коде — как светлый день,
Unity в помощь, сервисы в порядке,
Теперь всё будет, как мы хотим, не лень! 🐇✨
С документацией дружим,
Код пишем, как по нотам,
Вперед к успеху, вместе,
С каждым шагом — только в рост!


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

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

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

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

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

Other keywords and placeholders

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

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

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

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Inline review comments failed to post. This is likely due to GitHub's limits when posting large numbers of comments.

🛑 Comments failed to post (78)
pages/products/flexberry-orm/data-service/fo_construction-ds.ru.md (1)

22-22: ⚠️ Potential issue

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

Текст ссылки "Получить его у провайдера сервиса данных" больше не соответствует актуальному способу получения сервиса через Unity контейнер.

Предлагаю изменить на:

-3.[Получить его у провайдера сервиса данных](fo_ds-provider.html).
+3.[Получить его через Unity контейнер](fo_ds-provider.html).
📝 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.[Получить его через Unity контейнер](fo_ds-provider.html).
pages/products/flexberry-orm/query-language/fo_function-implication.ru.md (1)

30-33: 🛠️ Refactor suggestion

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

Прямое создание экземпляра ExternalLangDef не соответствует современным принципам внедрения зависимостей, используемым в проекте.

Предлагается следующий вариант реализации с использованием IUnityContainer:

-var langDef = new ExternalLangDef();
+var ds = container.Resolve<IDataService>();
+var langDef = DataServiceProvider.DataService.GetLangDef();

Это позволит:

  1. Следовать единому подходу к управлению зависимостями
  2. Упростить тестирование
  3. Обеспечить более гибкую конфигурацию

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-orm/lock-service/fo_lock-service.ru.md (2)

38-44: 🛠️ Refactor suggestion

Рекомендация по улучшению SQL-определения

В определении таблицы рекомендуется:

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

Предлагаемая структура:

CREATE TABLE STORMNETLOCKDATA (
    LockKey VARCHAR(300) NOT NULL PRIMARY KEY,
    UserName VARCHAR(100) NOT NULL,
    LockDate DATETIME NOT NULL DEFAULT GETDATE()
);

CREATE INDEX IDX_STORMNETLOCKDATA_USERNAME ON STORMNETLOCKDATA(UserName);

19-30: 🛠️ Refactor suggestion

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

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

Предлагаю обновить пример:

-LockService ls = new LockService();
+// Получение LockService через IUnityContainer
+var container = new UnityContainer();
+var lockService = container.Resolve<ILockService>();
-ls.SetLock(автор);
+lockService.SetLock(автор);

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-orm/data-types/fo_nonstored-calculated-properties.ru.md (1)

40-40: ⚠️ Potential issue

Исправьте несоответствие в именовании переменных

В примере используются разные имена для сервиса данных: dataService и ds. Рекомендуется использовать единое именование.

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

-ICSSoft.STORMNET.DataObject[] persons = dataService.LoadObjects(lcs);
+ICSSoft.STORMNET.DataObject[] persons = ds.LoadObjects(lcs);

Also applies to: 43-43

pages/products/flexberry-orm/data-service/fo_reading-portion.ru.md (1)

25-25: ⚠️ Potential issue

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

В объявлении массива присутствует опечатка.

-DataObject[) dataobjects = ds.LoadObjects(lcs, ref state);
+DataObject[] dataobjects = ds.LoadObjects(lcs, ref state);
📝 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.

DataObject[] dataobjects = ds.LoadObjects(lcs, ref state); // Вызываем сервис данных, состояние запоминается.
pages/products/flexberry-orm/data-object/fo_load-multiple-details-example.ru.md (1)

16-18: ⚠️ Potential issue

Несоответствие в использовании переменных и неполная инициализация

В примере кода присутствуют следующие проблемы:

  1. Неясно, как именно получить mainUnityContainer
  2. Переменная ds определена в строке 17, но в строке 18 используется dataService

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

-IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer.Resolve<IDataService>();            
-OrmSample ormSample = new OrmSample(dataService);
+// Получение контейнера через UnityFactory
+IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
+IDataService ds = mainUnityContainer.Resolve<IDataService>();            
+OrmSample ormSample = new OrmSample(ds);
📝 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.

// Получение контейнера через UnityFactory
IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
IDataService ds = mainUnityContainer.Resolve<IDataService>();            
OrmSample ormSample = new OrmSample(ds);
pages/products/flexberry-orm/data-service/fo_processing-one-object.ru.md (2)

34-36: ⚠️ Potential issue

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

  1. Отсутствует конкретная реализация получения контейнера Unity
  2. Нет обработки ошибок при разрешении зависимостей
  3. Отсутствует информация о жизненном цикле контейнера

Рекомендуемая реализация:

 private static void UpdateObject(DataObject dparam)
 {
-  IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-  IDataService ds = mainUnityContainer.Resolve<IDataService>();
-  ds.UpdateObject(ref dparam);
+  try
+  {
+    var container = UnityFactory.GetContainer();
+    var dataService = container.Resolve<IDataService>();
+    dataService.UpdateObject(ref dparam);
+  }
+  catch (ResolutionFailedException ex)
+  {
+    throw new InvalidOperationException("Ошибка при получении IDataService из контейнера Unity", ex);
+  }
 }

Аналогичные изменения следует применить к методу LoadObject.

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

Also applies to: 40-42


18-19: ⚠️ Potential issue

Исправьте синтаксическую ошибку в сигнатуре метода Main

В сигнатуре метода Main присутствует синтаксическая ошибка:

-static void Main(string[) args)
+static void Main(string[] args)
📝 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.

static void Main(string[] args)
{
pages/products/flexberry-orm/data-object/fo_actions-saving-object.ru.md (1)

35-35: 🛠️ Refactor suggestion

Рекомендуется добавить обработку ошибок

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

Предлагаю обернуть операцию в try-catch блок:

-ds.UpdateObject(cdda);
+try
+{
+    ds.UpdateObject(cdda);
+}
+catch (Exception ex)
+{
+    Console.WriteLine($"Ошибка при сохранении объекта: {ex.Message}");
+    throw;
+}
📝 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.

try
{
    ds.UpdateObject(cdda);
}
catch (Exception ex)
{
    Console.WriteLine($"Ошибка при сохранении объекта: {ex.Message}");
    throw;
}
pages/products/flexberry-orm/data-object/fo_prototyping-example.ru.md (2)

18-19: ⚠️ Potential issue

Исправить несоответствие имен переменных

Переменная ds используется в строке 18, но в строке 19 все еще используется старое имя dataService.

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

IDataService ds = mainUnityContainer.Resolve<IDataService>();
-OrmSample ormSample = new OrmSample(dataService);
+OrmSample ormSample = new OrmSample(ds);
📝 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.

IDataService ds = mainUnityContainer.Resolve<IDataService>();
OrmSample ormSample = new OrmSample(ds);

46-46: 🛠️ Refactor suggestion

Улучшить форматирование вывода

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

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

-Console.WriteLine("Time taken for loading: {1} ms{0}prototyping: {2} ms{0}persistence: {3} ms.", Environment.NewLine, loadObjectTime, prototypingTime, updateTime);
+Console.WriteLine($"""
+    Time taken for:
+    loading: {loadObjectTime} ms
+    prototyping: {prototypingTime} ms
+    persistence: {updateTime} ms
+    """);
📝 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.

Console.WriteLine($"""
    Time taken for:
    loading: {loadObjectTime} ms
    prototyping: {prototypingTime} ms
    persistence: {updateTime} ms
    """);
pages/products/flexberry-orm/business-servers/fo_unique-data-check.ru.md (2)

39-40: 🛠️ Refactor suggestion

Обеспечьте согласованность примеров и подчеркните важность проверки

  1. Пример должен быть согласован с предыдущим блоком кода в отношении обработки ошибок.
  2. Важно отметить значимость проверки __primaryKey для корректной валидации при обновлении записи.
-IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer.Resolve<IDataService>();
+// Получение контейнера Unity
+IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
+
+// Получение сервиса данных с обработкой ошибок
+IDataService ds;
+try
+{
+    ds = mainUnityContainer.Resolve<IDataService>();
+}
+catch (ResolutionFailedException ex)
+{
+    throw new InvalidOperationException("Не удалось получить IDataService из контейнера Unity", ex);
+}
+
+// Проверка уникальности с учетом первичного ключа для корректной работы при обновлении

Committable suggestion was skipped due to low confidence.


27-28: 🛠️ Refactor suggestion

Дополните пример получения контейнера Unity

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

-IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer.Resolve<IDataService>();
+// Получение контейнера Unity
+IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
+
+// Получение сервиса данных с обработкой ошибок
+IDataService ds;
+try
+{
+    ds = mainUnityContainer.Resolve<IDataService>();
+}
+catch (ResolutionFailedException ex)
+{
+    throw new InvalidOperationException("Не удалось получить IDataService из контейнера Unity", ex);
+}
📝 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.

// Получение контейнера Unity
IUnityContainer mainUnityContainer = UnityFactory.GetContainer();

// Получение сервиса данных с обработкой ошибок
IDataService ds;
try
{
    ds = mainUnityContainer.Resolve<IDataService>();
}
catch (ResolutionFailedException ex)
{
    throw new InvalidOperationException("Не удалось получить IDataService из контейнера Unity", ex);
}
pages/products/flexberry-orm/authority-audit/efs_AuditWinExampleManual.ru.md (2)

44-44: ⚠️ Potential issue

Исправьте просторечное выражение

Слово "заместо" является просторечием. Рекомендуется использовать литературное слово "вместо".

-указав заместо ... необходимые значения наименования Win-сервиса
+указав вместо ... необходимые значения наименования Win-сервиса
📝 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.

указав вместо ... необходимые значения наименования Win-сервиса и строки подключения к базе аудита.
🧰 Tools
🪛 LanguageTool

[misspelling] ~44-~44: «заместо» — просторечие, исправление: «вместо»
Context: ...ringName" value="..." />


указав заместо ... необходимые значения наименования W...

(RU_SIMPLE_REPLACE)

</blockquote></details>

</details>

---

63-66: _:warning: Potential issue_

**Объедините повторяющиеся разделы**

Строки 63-66 содержат повторение информации о подключении сборки `ICSSoft.STORMNET.Business.Audit.dll`. Рекомендуется объединить эти строки в один пункт.

```diff
-## Подключить к приложению DesktopCustomizer ICSSoft.STORMNET.Business.Audit.dll
-
-ICSSoft.STORMNET.Business.Audit.dll
+## Подключение сборки ICSSoft.STORMNET.Business.Audit.dll
+
+Необходимо подключить к приложению сборку `ICSSoft.STORMNET.Business.Audit.dll`
📝 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.

## Подключение сборки ICSSoft.STORMNET.Business.Audit.dll

Необходимо подключить к приложению сборку `ICSSoft.STORMNET.Business.Audit.dll`
pages/products/flexberry-orm/data-service/fo_Intercept-formation-sql-query.ru.md (2)

20-22: 🛠️ Refactor suggestion

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

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

 IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer.Resolve<IDataService>();
-ICSSoft.STORMNET.Business.SQLDataService sqldataservice = (ICSSoft.STORMNET.Business.SQLDataService)ds; 
+IDataService ds;
+try
+{
+    ds = mainUnityContainer.Resolve<IDataService>();
+    if (ds == null)
+    {
+        throw new InvalidOperationException("Не удалось разрешить IDataService");
+    }
+    ICSSoft.STORMNET.Business.SQLDataService sqldataservice = (ICSSoft.STORMNET.Business.SQLDataService)ds;
+}
+catch (Exception ex)
+{
+    // Логирование ошибки
+    throw new InvalidOperationException("Ошибка при инициализации сервиса данных", ex);
+}
📝 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.

    IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
    IDataService ds;
    try
    {
        ds = mainUnityContainer.Resolve<IDataService>();
        if (ds == null)
        {
            throw new InvalidOperationException("Не удалось разрешить IDataService");
        }
        ICSSoft.STORMNET.Business.SQLDataService sqldataservice = (ICSSoft.STORMNET.Business.SQLDataService)ds;
    }
    catch (Exception ex)
    {
        // Логирование ошибки
        throw new InvalidOperationException("Ошибка при инициализации сервиса данных", ex);
    }

16-30: 🛠️ Refactor suggestion

Добавьте использование оператора using для освобождения ресурсов

При работе с сервисами данных важно корректно освобождать ресурсы. Рекомендуется использовать оператор using для автоматического освобождения ресурсов.

 static void Main()
 {
     //...
     // создаем датасервис
     IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-    IDataService ds = mainUnityContainer.Resolve<IDataService>();
-    ICSSoft.STORMNET.Business.SQLDataService sqldataservice = (ICSSoft.STORMNET.Business.SQLDataService)ds; 
-    // перед формированием 
-    sqldataservice.OnGenerateSQLSelect+=new ICSSoft.STORMNET.Business.OnGenerateSQLSelectEventHandler(ds_OnGenerateSQLSelect);  
-    // после формирования
-    sqldataservice.AfterGenerateSQLSelectQuery+=new ICSSoft.STORMNET.Business.AfterGenerateSQLSelectQueryEventHandler(ds_AfterGenerateSQLSelectQuery); 
-    // строка посылается на выполение ...
-    sqldataservice.OnCreateCommand+=new ICSSoft.STORMNET.Business.OnCreateCommandEventHandler(ds_OnCreateCommand);
+    using (IDataService ds = mainUnityContainer.Resolve<IDataService>())
+    {
+        ICSSoft.STORMNET.Business.SQLDataService sqldataservice = (ICSSoft.STORMNET.Business.SQLDataService)ds; 
+        // перед формированием 
+        sqldataservice.OnGenerateSQLSelect+=new ICSSoft.STORMNET.Business.OnGenerateSQLSelectEventHandler(ds_OnGenerateSQLSelect);  
+        // после формирования
+        sqldataservice.AfterGenerateSQLSelectQuery+=new ICSSoft.STORMNET.Business.AfterGenerateSQLSelectQueryEventHandler(ds_AfterGenerateSQLSelectQuery); 
+        // строка посылается на выполение ...
+        sqldataservice.OnCreateCommand+=new ICSSoft.STORMNET.Business.OnCreateCommandEventHandler(ds_OnCreateCommand);
+        
+        // Здесь размещается основной код работы с сервисом данных
+    }
     //...
 } 
📝 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.

static void Main()
{
    //...
    // создаем датасервис
    IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
    using (IDataService ds = mainUnityContainer.Resolve<IDataService>())
    {
        ICSSoft.STORMNET.Business.SQLDataService sqldataservice = (ICSSoft.STORMNET.Business.SQLDataService)ds; 
        // перед формированием 
        sqldataservice.OnGenerateSQLSelect+=new ICSSoft.STORMNET.Business.OnGenerateSQLSelectEventHandler(ds_OnGenerateSQLSelect);  
        // после формирования
        sqldataservice.AfterGenerateSQLSelectQuery+=new ICSSoft.STORMNET.Business.AfterGenerateSQLSelectQueryEventHandler(ds_AfterGenerateSQLSelectQuery); 
        // строка посылается на выполение ...
        sqldataservice.OnCreateCommand+=new ICSSoft.STORMNET.Business.OnCreateCommandEventHandler(ds_OnCreateCommand);
        
        // Здесь размещается основной код работы с сервисом данных
    }
    //...
} 
pages/products/flexberry-orm/data-object/fo_load-alter-objects.ru.md (2)

27-27: ⚠️ Potential issue

Несогласованность в использовании имен переменных

В коде используется переменная dataService, но она определена как ds. Необходимо привести к единому стилю.

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

-OrmSample ormSample = new OrmSample(dataService);
+OrmSample ormSample = new OrmSample(ds);

-dataService.LoadObject(CDDA.Views.CDDA_E, cdda);
+ds.LoadObject(CDDA.Views.CDDA_E, cdda);

Also applies to: 38-38


47-49: 🛠️ Refactor suggestion

Рекомендуется добавить обработку ошибок

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

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

 // Сохранение объекта. Обновляются только загруженные свойства.
-dataService.UpdateObject(cdda);
+try
+{
+    ds.UpdateObject(cdda);
+}
+catch (Exception ex)
+{
+    Console.WriteLine($"Ошибка при сохранении объекта: {ex.Message}");
+    throw;
+}

Committable suggestion was skipped due to low confidence.

pages/guides/practical-guides/flexberry-asp-net/gpg_auto-get-data-from-lookup.ru.md (2)

32-48: 🛠️ Refactor suggestion

Рекомендуется улучшить обработку события change

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

Предлагаемые улучшения:

<script type="text/javascript">
  $(function() {
    var lookupTimeout;
    $('#<%= ctrlЗаказ.ClientID %>').on('change', function (e, d) {
      clearTimeout(lookupTimeout);
      
      // Показываем индикатор загрузки
      $(this).addClass('loading');
      
      // Откладываем PostBack на 300мс
      lookupTimeout = setTimeout(function() {
        $.ics.postBack('', '', function() {
          // Скрываем индикатор загрузки после завершения PostBack
          $('#<%= ctrlЗаказ.ClientID %>').removeClass('loading');
        });
      }, 300);
    });
  });
</script>

Также добавьте стили для индикатора загрузки:

.loading {
  opacity: 0.5;
  pointer-events: none;
}

32-48: ⚠️ Potential issue

Необходимо доработать реализацию метода PreApplyToControls

В текущей реализации есть несколько моментов, требующих внимания:

  1. Строка 39 содержит незавершенный код получения контейнера Unity
  2. Отсутствует обработка ошибок при загрузке данных
  3. Нет проверки на null для переменной заказ
  4. Возможна утечка памяти при загрузке большого количества записей

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

 protected override void PreApplyToControls()
 {
   if (IsPostBack && (DataObject == null || DataObject.GetStatus(true) == ObjectStatus.Created))
   {
     var заказ = ctrlЗаказ.SelectedMasterPK;
+    if (заказ == null)
+      return;
+
     ctrlЗаказ.MasterViewName = Заказ.Views.ЗаказL.Name;

     var lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(СтрокаЗаказа), СтрокаЗаказа.Views.СтрокаЗаказаE);
     lcs.LimitFunction = FunctionBuilder.BuildEquals<СтрокаЗаказа>(x => x.Заказ, заказ);
-    IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
+    IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
     IDataService ds = mainUnityContainer.Resolve<IDataService>();
-    var строкиЗаказа = ds.LoadObjects(lcs);
+    try
+    {
+      var строкиЗаказа = ds.LoadObjects(lcs);
 
-    foreach (var s in строкиЗаказа)
-    {
-      var строкаЗаказа = (СтрокаЗаказа)s;
-      DataObject.ЗаписьВНакладной.Add(new ЗаписьВНакладной { Количество = строкаЗаказа.Количество, Товар = строкаЗаказа.Товар });
+      foreach (var s in строкиЗаказа)
+      {
+        var строкаЗаказа = (СтрокаЗаказа)s;
+        DataObject.ЗаписьВНакладной.Add(new ЗаписьВНакладной { Количество = строкаЗаказа.Количество, Товар = строкаЗаказа.Товар });
+      }
+    }
+    catch (Exception ex)
+    {
+      LogService.LogError("Ошибка при загрузке строк заказа", ex);
+      throw;
     }
   }
 }
📝 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.

  if (IsPostBack && (DataObject == null || DataObject.GetStatus(true) == ObjectStatus.Created))
    {
      var заказ = ctrlЗаказ.SelectedMasterPK;
      if (заказ == null)
        return;

      ctrlЗаказ.MasterViewName = Заказ.Views.ЗаказL.Name;

      var lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(СтрокаЗаказа), СтрокаЗаказа.Views.СтрокаЗаказаE);
      lcs.LimitFunction = FunctionBuilder.BuildEquals<СтрокаЗаказа>(x => x.Заказ, заказ);
      IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
      IDataService ds = mainUnityContainer.Resolve<IDataService>();
      try
      {
        var строкиЗаказа = ds.LoadObjects(lcs);

        foreach (var s in строкиЗаказа)
        {
          var строкаЗаказа = (СтрокаЗаказа)s;
          DataObject.ЗаписьВНакладной.Add(new ЗаписьВНакладной { Количество = строкаЗаказа.Количество, Товар = строкаЗаказа.Товар });
        }
      }
      catch (Exception ex)
      {
        LogService.LogError("Ошибка при загрузке строк заказа", ex);
        throw;
      }
    }
pages/guides/practical-guides/flexberry-asp-net/gpg_auto-get-data-from-lookup.en.md (2)

41-43: ⚠️ Potential issue

Необходимо реализовать корректное получение Unity контейнера

Текущая реализация содержит незавершенный код с комментарием. Для production-ready решения необходимо правильно получить Unity контейнер.

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

- IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
+ IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
📝 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.

  IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
  IDataService ds = mainUnityContainer.Resolve<IDataService>();
  var строкиЗаказа = ds.LoadObjects(lcs);

34-50: 🛠️ Refactor suggestion

Рекомендуется добавить обработку ошибок и проверки на null

Текущая реализация не содержит обработку исключений при загрузке данных и проверки на null для загруженных объектов.

Предлагаемое улучшение:

 protected override void PreApplyToControls()
 {
   if (IsPostBack && (DataObject == null || DataObject.GetStatus(true) == ObjectStatus.Created))
   {
     var заказ = ctrlЗаказ.SelectedMasterPK;
+    if (заказ == null) return;
     
     ctrlЗаказ.MasterViewName = Заказ.Views.ЗаказL.Name;
     
     var lcs = LoadingCustomizationStruct.GetSimpleStruct(typeof(СтрокаЗаказа), СтрокаЗаказа.Views.СтрокаЗаказаE);
     lcs.LimitFunction = FunctionBuilder.BuildEquals<СтрокаЗаказа>(x => x.Заказ, заказ);
     
     try {
       IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
       IDataService ds = mainUnityContainer.Resolve<IDataService>();
       var строкиЗаказа = ds.LoadObjects(lcs);
       
       if (строкиЗаказа != null)
       {
         foreach (var s in строкиЗаказа)
         {
           var строкаЗаказа = (СтрокаЗаказа)s;
           if (строкаЗаказа?.Товар != null)
           {
             DataObject.ЗаписьВНакладной.Add(new ЗаписьВНакладной { 
               Количество = строкаЗаказа.Количество, 
               Товар = строкаЗаказа.Товар 
             });
           }
         }
       }
     }
     catch (Exception ex)
     {
       LogService.LogError("Ошибка при загрузке данных заказа", ex);
       throw;
     }
   }
 }

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-orm/data-object/fo_create-multiple-details.ru.md (2)

50-72: ⚠️ Potential issue

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

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

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

 internal void GenDetails(D dobj, int qtyInEach)
 {
+    if (qtyInEach < 0 || qtyInEach > 1000)
+    {
+        throw new ArgumentOutOfRangeException(nameof(qtyInEach), "Количество детейлов должно быть в диапазоне от 0 до 1000");
+    }
+
     RandomStringGenerator rsg = new RandomStringGenerator();
     dobj.Name = rsg.Generate(200);
     dobj.S1 = rsg.Generate(200);
     dobj.S2 = rsg.Generate(200);
     dobj.S3 = rsg.Generate(200);
     dobj.S4 = rsg.Generate(200);
     dobj.S5 = rsg.Generate(200);

-    string[] detprops = Information.GetPropertyNamesByType(dobj.GetType(), typeof(DetailArray));
+    // Кэшируем результаты рефлексии для типа
+    var type = dobj.GetType();
+    if (!_propertyCache.TryGetValue(type, out var detprops))
+    {
+        detprops = Information.GetPropertyNamesByType(type, typeof(DetailArray));
+        _propertyCache[type] = detprops;
+    }

Также рекомендуется добавить в класс приватное поле для кэша:

private static readonly ConcurrentDictionary<Type, string[]> _propertyCache = 
    new ConcurrentDictionary<Type, string[]>();

39-41: 🛠️ Refactor suggestion

Улучшите пример получения контейнера Unity.

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

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

-IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer.Resolve<IDataService>();
-ds.UpdateObject(aggregator);
+// Получение контейнера Unity из UnityFactory
+IUnityContainer container = UnityFactory.GetContainer();
+try
+{
+    IDataService ds = container.Resolve<IDataService>();
+    ds.UpdateObject(aggregator);
+}
+catch (ResolutionFailedException ex)
+{
+    throw new InvalidOperationException("Не удалось получить экземпляр IDataService", ex);
+}
📝 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.

// Получение контейнера Unity из UnityFactory
IUnityContainer container = UnityFactory.GetContainer();
try
{
    IDataService ds = container.Resolve<IDataService>();
    ds.UpdateObject(aggregator);
}
catch (ResolutionFailedException ex)
{
    throw new InvalidOperationException("Не удалось получить экземпляр IDataService", ex);
}
pages/products/flexberry-orm/query-language/fo_limit-function-serialization.ru.md (1)

61-61: 🛠️ Refactor suggestion

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

Текущая реализация не обрабатывает возможные исключения при сериализации/десериализации. Рекомендуется добавить try-catch блоки для обработки потенциальных ошибок.

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

        if (binary)
        {
+           try {
                serializedFn = ToolBinarySerializer.ObjectToString(languageDef.FunctionToSimpleStruct(fn));
+           }
+           catch (Exception ex) {
+               throw new InvalidOperationException("Ошибка при бинарной сериализации", ex);
+           }
        }
        else
        {
+           try {
                serializedFn = ToolXML.ObjectToString(languageDef.FunctionToSimpleStruct(fn));
+           }
+           catch (Exception ex) {
+               throw new InvalidOperationException("Ошибка при XML сериализации", ex);
+           }
        }

Also applies to: 65-65, 72-72, 76-76

pages/products/flexberry-winforms/subsystems/limits/fw_limit-function-insert-parameters-values.ru.md (1)

20-28: 🛠️ Refactor suggestion

Рекомендуется добавить обработку ошибок при работе с Unity контейнером

Текущая реализация не включает обработку потенциальных ошибок при разрешении зависимостей через Unity контейнер.

Предлагаю добавить обработку исключений:

 IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer.Resolve<IDataService>();
+IDataService ds;
+try {
+    ds = mainUnityContainer.Resolve<IDataService>();
+} catch (ResolutionFailedException ex) {
+    throw new InvalidOperationException("Не удалось получить экземпляр IDataService", ex);
+}

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-aspnet/controls/lookup/fa_lookup-limit-web.ru.md (2)

52-52: ⚠️ Potential issue

Исправьте опечатку

В слове "испльзуя" пропущена буква.

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

-1.Построить ограничения, испльзуя LINQ-провайдер:
+1.Построить ограничения, используя LINQ-провайдер:
📝 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.

1.Построить ограничения, используя LINQ-провайдер:

46-46: ⚠️ Potential issue

Исправьте грамматическую ошибку

В предложении "наложить ограничение на мастер мастера" некорректно использован предлог "на" с существительным.

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

-необходимо наложить ограничение на мастер мастера
+необходимо наложить ограничение на мастеровое свойство

Committable suggestion was skipped due to low confidence.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~46-~46: Предлог «на» предполагает употребление существительного в винительном или предложном падежах.
Context: ...бразом, необходимо наложить ограничение на мастер мастера:

![kredit-diagramm](/images/...

(PREP_Na_And_Noun)

pages/products/flexberry-orm/data-service/fo_sql-query.ru.md (1)

43-60: ⚠️ Potential issue

Необходимо улучшить управление ресурсами в примере кода

Текущая реализация может привести к утечке ресурсов. Рекомендуется следующие улучшения:

  1. Использовать конструкцию using для автоматического освобождения ресурсов
  2. Добавить обработку исключений
  3. Корректно освобождать все ресурсы ADO.NET

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

 IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
 IDataService ds = mainUnityContainer.Resolve<IDataService>();
-var connection = (SqlConnection)((SQLDataService)ds).GetConnection(); // Получение подключения.
-var command = new SqlCommand("SELECT SUM(purchase.\"Сумма\") "+
-  " FROM \"Покупатель\" customer join \"Покупка\" purchase on customer.\"primaryKey\" = purchase.\"Покупатель\" "+
-  " WHERE purchase.\"Покупатель\"=@Customer AND  purchase.\"Статус\" = \'Оплачено\' ", connection);
-var parameter = new SqlParameter("@Customer", SqlDbType.UniqueIdentifier);
-parameter.Value = ((KeyGuid)this.__PrimaryKey).Guid;
-command.Parameters.Add(parameter);
-
-try
-{
-  connection.Open();
-  var value = (decimal)command.ExecuteScalar();
-}
-finally
-{
-  connection.Close();
-}
+decimal value;
+using (var connection = (SqlConnection)((SQLDataService)ds).GetConnection())
+using (var command = new SqlCommand(
+    "SELECT SUM(purchase.\"Сумма\") " +
+    "FROM \"Покупатель\" customer " +
+    "JOIN \"Покупка\" purchase ON customer.\"primaryKey\" = purchase.\"Покупатель\" " +
+    "WHERE purchase.\"Покупатель\"=@Customer AND purchase.\"Статус\" = 'Оплачено'",
+    connection))
+{
+    try
+    {
+        command.Parameters.Add(new SqlParameter("@Customer", SqlDbType.UniqueIdentifier)
+        {
+            Value = ((KeyGuid)this.__PrimaryKey).Guid
+        });
+        
+        connection.Open();
+        var result = command.ExecuteScalar();
+        value = result != DBNull.Value ? Convert.ToDecimal(result) : 0m;
+    }
+    catch (SqlException ex)
+    {
+        // Логирование ошибки
+        throw new InvalidOperationException("Ошибка при выполнении SQL-запроса", ex);
+    }
+}
📝 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.

IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
IDataService ds = mainUnityContainer.Resolve<IDataService>();
decimal value;
using (var connection = (SqlConnection)((SQLDataService)ds).GetConnection())
using (var command = new SqlCommand(
    "SELECT SUM(purchase.\"Сумма\") " +
    "FROM \"Покупатель\" customer " +
    "JOIN \"Покупка\" purchase ON customer.\"primaryKey\" = purchase.\"Покупатель\" " +
    "WHERE purchase.\"Покупатель\"=@Customer AND purchase.\"Статус\" = 'Оплачено'",
    connection))
{
    try
    {
        command.Parameters.Add(new SqlParameter("@Customer", SqlDbType.UniqueIdentifier)
        {
            Value = ((KeyGuid)this.__PrimaryKey).Guid
        });
        
        connection.Open();
        var result = command.ExecuteScalar();
        value = result != DBNull.Value ? Convert.ToDecimal(result) : 0m;
    }
    catch (SqlException ex)
    {
        // Логирование ошибки
        throw new InvalidOperationException("Ошибка при выполнении SQL-запроса", ex);
    }
}
pages/products/flexberry-orm/query-language/fo_load-limitation-example.ru.md (1)

46-48: ⚠️ Potential issue

Необходимо добавить пример инициализации Unity-контейнера

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

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

-IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
+// Пример инициализации Unity-контейнера
+IUnityContainer mainUnityContainer = new UnityContainer();
+mainUnityContainer.RegisterType<IDataService, PostgresDataService>();

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-orm/dependency-injection/fo_ds-provider.ru.md (2)

13-13: ⚠️ Potential issue

Исправить опечатку в имени файла конфигурации

В тексте присутствует опечатка: App.cobfig вместо App.config

-`IDataService` - это [сервис данных](fo_data-service.html), который инициализируется на основании параметров, заданных в файле конфигурации (`App.cobfig` или `Web.config`).
+`IDataService` - это [сервис данных](fo_data-service.html), который инициализируется на основании параметров, заданных в файле конфигурации (`App.config` или `Web.config`).
📝 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.

`IDataService` - это [сервис данных](fo_data-service.html), который инициализируется на основании параметров, заданных в файле конфигурации (`App.config` или `Web.config`). Таким образом, `IDataService` является [сервисом данных](fo_data-service.html) по умолчанию.

10-11: ⚠️ Potential issue

Необходимо уточнить получение Unity контейнера

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

Предлагаю дополнить пример конкретным способом получения контейнера:

-IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
+// Получение основного контейнера для работы с Unity
+IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
📝 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.

// Получение основного контейнера для работы с Unity
IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
IDataService ds = mainUnityContainer.Resolve<IDataService>();
pages/products/flexberry-aspnet/subsystems/security/fa_membership-provider.ru.md (1)

20-22: ⚠️ Potential issue

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

В примере строки подключения содержатся реальные учетные данные. Рекомендуется использовать placeholder'ы вместо настоящих значений.

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

-    <add name="CaseberrySecurity" connectionString="Data Source=SQL2008R2;Initial Catalog=Test;Integrated Security=False;USER ID=editor;Password=123456;" providerName="ICSSoft.STORMNET.Business.MSSQLDataService, ICSSoft.STORMNET.Business.MSSQLDataService, Version=1.0.0.1, Culture=neutral, PublicKeyToken=49b42003269a4a66"/>
+    <add name="CaseberrySecurity" connectionString="Data Source=<SQL_SERVER>;Initial Catalog=<DATABASE>;Integrated Security=False;USER ID=<USERNAME>;Password=<PASSWORD>;" providerName="ICSSoft.STORMNET.Business.MSSQLDataService, ICSSoft.STORMNET.Business.MSSQLDataService, Version=1.0.0.1, Culture=neutral, PublicKeyToken=49b42003269a4a66"/>
📝 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.

<connectionStrings>
    <add name="CaseberrySecurity" connectionString="Data Source=<SQL_SERVER>;Initial Catalog=<DATABASE>;Integrated Security=False;USER ID=<USERNAME>;Password=<PASSWORD>;" providerName="ICSSoft.STORMNET.Business.MSSQLDataService, ICSSoft.STORMNET.Business.MSSQLDataService, Version=1.0.0.1, Culture=neutral, PublicKeyToken=49b42003269a4a66"/>
</connectionStrings>
pages/products/flexberry-orm/data-service/fo_instantiate-persist-objects.ru.md (1)

62-80: 🛠️ Refactor suggestion

Рекомендация по оптимизации создания списка объектов.

Можно оптимизировать создание списка, указав начальную ёмкость коллекции, так как количество элементов известно заранее.

-List<ICSSoft.STORMNET.DataObject> objectsToUpdate = new List<ICSSoft.STORMNET.DataObject>();
+List<ICSSoft.STORMNET.DataObject> objectsToUpdate = new List<ICSSoft.STORMNET.DataObject>(14); // 5 DVD + 9 других объектов
📝 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.

// Объекты данных, которые нужно сохранить, добавим в список.
List<ICSSoft.STORMNET.DataObject> objectsToUpdate = new List<ICSSoft.STORMNET.DataObject>(14); // 5 DVD + 9 других объектов

for (int i = 0; i < 5; i++)
{
    DVD dvd = new DVD();
    dvd.Publisher = publisher1;
    dvd.Name = string.Format("Movie {0}", i);
    dvd.Capacity = i * 100;
    dvd.Price = new Dollar(2, 66);
    objectsToUpdate.Add(dvd);
}

// Добавление всех объектов, которые нужно обновить, в список для обновления.
objectsToUpdate.AddRange(new ICSSoft.STORMNET.DataObject[]
{
    country1, country2, country3, person1, person2, publisher1, publisher2, cdda, cddd
});
pages/products/flexberry-orm/data-service/fo_loading-customization-struct.ru.md (1)

56-56: ⚠️ Potential issue

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

В инициализации массива типов присутствует опечатка.

-lcs.LoadingTypes=new Type[) {typeof(Кредит)};
+lcs.LoadingTypes = new Type[] {typeof(Кредит)};
📝 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.

lcs.LoadingTypes = new Type[] {typeof(Кредит)};
pages/products/flexberry-orm/authority-audit/efs_AuditWinService.ru.md (3)

16-17: ⚠️ Potential issue

Необходимо исправить структуру заголовков

Для улучшения структуры документа рекомендуется использовать иерархию заголовков, начиная с одного заголовка первого уровня:

-# Сервис Аудита
+## Сервис Аудита

-# Подключение к сервису аудита
+## Подключение к сервису аудита

Also applies to: 20-21

🧰 Tools
🪛 Markdownlint

16-16: null
Multiple top-level headings in the same document

(MD025, single-title, single-h1)


66-66: ⚠️ Potential issue

Пропущена запятая перед "то"

Согласно правилам пунктуации, в условных предложениях перед "то" необходима запятая.

-Если `IsAuditDatabaseLocal = false`, то в конфиге сервиса будет искаться строка подключения, задаваемая параметром `AuditConnectionStringName` (то есть в данном случае - "`AuditConnString`").
+Если `IsAuditDatabaseLocal = false`, то в конфиге сервиса будет искаться строка подключения, задаваемая параметром `AuditConnectionStringName` (то есть, в данном случае - "`AuditConnString`").
📝 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.

Если `IsAuditDatabaseLocal = false`, то в конфиге сервиса будет искаться строка подключения, задаваемая параметром `AuditConnectionStringName` (то есть, в данном случае - "`AuditConnString`").
🧰 Tools
🪛 LanguageTool

[uncategorized] ~66-~66: Нужна запятая или тире: «, то» или « – то»
Context: ...параметром AuditConnectionStringName (то есть в данном случае - "`AuditConnStrin...

(ESLI_TO)


85-85: ⚠️ Potential issue

Исправить повтор слова "имени"

В тексте присутствует случайный повтор слова.

-Если `IsAuditDatabaseLocal = true`, то получение имени имени строки соединения происходит по особой схеме
+Если `IsAuditDatabaseLocal = true`, то получение имени строки соединения происходит по особой схеме
📝 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.

Если `IsAuditDatabaseLocal = true`, то получение имени строки соединения происходит по особой схеме: имя ищется среди [AuditDSSettings](fa_audit-web.html). Имя сервиса по умолчанию определено как `<esc><</esc>AppNameForAudit<esc>></esc>_<esc><</esc>AuditConnectionStringName<esc>></esc>` (в нашем случае - это "`TestFS_AuditConnString`").
🧰 Tools
🪛 LanguageTool

[duplication] ~85-~85: Возможная опечатка: повтор слова
Context: ...uditDatabaseLocal = true`, то получение имени имени строки соединения происходит по особой ...

(WORD_REPEAT_RULE)

pages/products/flexberry-orm/data-types/fo_using-custom-types-example.ru.md (1)

113-128: 🛠️ Refactor suggestion

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

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

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

 IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer.Resolve<IDataService>();
-OrmSample ormSample = new OrmSample(ds);
-object primaryKey = ormSample.GetSomeObjectPrimaryKey(typeof(CDDA));
+try
+{
+    IDataService ds = mainUnityContainer.Resolve<IDataService>();
+    using (ds as IDisposable)
+    {
+        OrmSample ormSample = new OrmSample(ds);
+        object primaryKey = ormSample.GetSomeObjectPrimaryKey(typeof(CDDA));
 
-CDDA cdda = new CDDA();
-cdda.SetExistObjectPrimaryKey(primaryKey);
+        CDDA cdda = new CDDA();
+        cdda.SetExistObjectPrimaryKey(primaryKey);
 
-// Загрузка объекта из БД по представлению CD_E.
-ds.LoadObject(CD.Views.CD_E, cdda);
+        // Загрузка объекта из БД по представлению CD_E.
+        ds.LoadObject(CD.Views.CD_E, cdda);
 
-// Изменим цену.
-cdda.Price = new Dollar(0, 55);
+        // Изменим цену.
+        cdda.Price = new Dollar(0, 55);
 
-// Сохраним объект в БД.
-ds.UpdateObject(cdda);
+        // Сохраним объект в БД.
+        ds.UpdateObject(cdda);
 
-Console.WriteLine(string.Format("'{0}' price is {1}", cdda.Name, cdda.Price));
+        Console.WriteLine(string.Format("'{0}' price is {1}", cdda.Name, cdda.Price));
+    }
+}
+catch (ResolutionFailedException ex)
+{
+    Console.WriteLine("Ошибка при получении IDataService: " + ex.Message);
+}
+catch (Exception ex)
+{
+    Console.WriteLine("Ошибка при работе с объектом: " + ex.Message);
+}

Улучшения включают:

  1. Обработку ошибок при разрешении зависимостей через Unity
  2. Корректное освобождение ресурсов IDataService
  3. Структурированную обработку исключений

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-orm/data-object/fo_features-dafault-value.ru.md (2)

98-103: 🛠️ Refactor suggestion

Добавьте проверку на null и логирование.

Рекомендуется добавить проверку на null и логирование действий:

if (businessServers == null || businessServers.Length == 0)
{
    LogService.Log.Warn("Бизнес-серверы не найдены для типа ЗаписьНаПриём");
    return;
}

var curBS = businessServers[0] as TestBS;
if (curBS == null)
{
    throw new InvalidOperationException("Неверный тип бизнес-сервера");
}

114-118: 🛠️ Refactor suggestion

Добавьте валидацию входных параметров.

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

public void InitializeRecord(IIS.BSTest.ЗаписьНаПриём recordToInitialize)
{
    if (recordToInitialize == null)
        throw new ArgumentNullException(nameof(recordToInitialize));

    recordToInitialize.Дата = new DateTime(2012,12,12);
}
pages/products/flexberry-orm/business-servers/fo_cascade-delete.ru.md (1)

82-90: 🛠️ Refactor suggestion

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

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

Предлагаю следующие изменения:

- var klients =
-   ds.Query<Клиент>(Клиент.Views.КлиентE)
-   .Where(k => k.Прописка.__PrimaryKey == UpdatedObject.__PrimaryKey);
- foreach (var k in klients)
- {
-   k.SetStatus(ObjectStatus.Deleted);
- }
- return klients.ToArray();
+ var klients = await ds.Query<Клиент>(Клиент.Views.КлиентE)
+   .Where(k => k.Прописка.__PrimaryKey == UpdatedObject.__PrimaryKey)
+   .ToListAsync();
+ 
+ if (klients?.Any() == true)
+ {
+   foreach (var k in klients)
+   {
+     k.SetStatus(ObjectStatus.Deleted);
+   }
+   return klients.ToArray();
+ }
+ return Array.Empty<Клиент>();

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-orm/query-language/fo_function-builder.ru.md (1)

72-72: 🛠️ Refactor suggestion

Предложение по расширению ссылок на ресурсы

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

  • Примерами типичных сценариев использования
  • Ссылками на связанные статьи по теме
  • Рекомендациями по отладке

Это поможет разработчикам быстрее освоить инструмент и избежать типичных ошибок.

pages/products/flexberry-orm/query-language/fo_linq-provider.ru.md (2)

67-71: 🛠️ Refactor suggestion

Улучшение примеров использования Unity Container.

Примеры кода демонстрируют правильный подход к внедрению зависимостей через Unity Container, что является хорошей практикой. Однако можно улучшить код, добавив обработку ошибок.

Предлагаю дополнить примеры кода обработкой возможных исключений:

 IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer.Resolve<IDataService>();
-SQLDataService sqldataservice = (SQLDataService)ds;
+IDataService ds;
+try 
+{
+    ds = mainUnityContainer.Resolve<IDataService>();
+    if (!(ds is SQLDataService sqldataservice))
+    {
+        throw new InvalidOperationException("Сервис данных должен быть типа SQLDataService");
+    }
+    // Дальнейший код с использованием sqldataservice
+}
+catch (Exception ex)
+{
+    // Логирование ошибки
+    throw;
+}

Also applies to: 80-84, 93-99, 105-110


99-99: ⚠️ Potential issue

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

В строках вывода данных присутствует синтаксическая ошибка в индексаторе массива.

Необходимо исправить:

-Console.WriteLine(data[0).Кличка);
+Console.WriteLine(data[0].Кличка);

Also applies to: 110-110

pages/products/flexberry-orm/authority-audit/efs_AuditWebApiExample.ru.md (3)

113-115: 🛠️ Refactor suggestion

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

В методе дважды происходит получение UnityContainer и разрешение AIAuditService, что может негативно влиять на производительность.

Предлагаю вынести получение сервиса в начало метода:

 public static Отчет СоздатьОтчетПоКлиенту(Клиент клиент)
 {
+    UnityContainer mainUnityContainer = UnityFactory.GetContainer();
+    AIAuditService auditService = mainUnityContainer.Resolve<AIAuditService>();
+
     // Занести данные о начале операции создания отчета в подсистему аудита
     var auditParams = new CustomAuditParameters
     {
         // ...
     };

-    UnityContainer mainUnityContainer = ...; 
-    AIAuditService audittservice = mainUnityContainer.Resolve<AIAuditService>();
-    Guid? auditOperationId = audittservice.WriteCustomAuditOperation(auditParams, true);
+    Guid? auditOperationId = auditService.WriteCustomAuditOperation(auditParams, true);

     // ... остальной код ...

     finally
     {
-        UnityContainer mainUnityContainer = ...;
-        AIAuditService audittservice = mainUnityContainer.Resolve<AIAuditService>();
-        audittservice.RatifyAuditOperation(
+        auditService.RatifyAuditOperation(

Also applies to: 134-136


150-154: 💡 Codebase verification

Изображения найдены, но путь к ним указан неверно

Изображения существуют в репозитории, но находятся по другому пути: images/pages/img/page/AuditWebApiExample/. В документации нужно обновить пути к изображениям:

  • /images/img/page/AuditWebApiExample/AuditWebApiWolv.PNG/images/pages/img/page/AuditWebApiExample/AuditWebApiWolv.PNG
  • /images/img/page/AuditWebApiExample/AuditWebApiE.PNG/images/pages/img/page/AuditWebApiExample/AuditWebApiE.PNG
🔗 Analysis chain

Проверить наличие изображений

В документации есть ссылки на изображения /images/img/page/AuditWebApiExample/AuditWebApiWolv.PNG и /images/img/page/AuditWebApiExample/AuditWebApiE.PNG.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if the referenced images exist
fd -e PNG -e png "AuditWebApiWolv.PNG|AuditWebApiE.PNG" images/

Length of output: 184


57-60: ⚠️ Potential issue

Необходимо добавить информацию о получении UnityContainer

В примере используется неполная конструкция получения UnityContainer. Строка с комментарием // Получение основного контейнера для работы с Unity не дает достаточной информации для реализации.

Предлагаю дополнить пример конкретным способом получения контейнера:

-UnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
+UnityContainer mainUnityContainer = UnityFactory.GetContainer();

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-orm/query-language/fo_function-list.ru.md (1)

59-62: 🛠️ Refactor suggestion

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

Текущие примеры показывают получение IUnityContainer через многоточие. Рекомендуется:

  1. Добавить комментарий о том, как правильно получить контейнер в разных контекстах (Web/Desktop)
  2. Использовать using для корректного освобождения ресурсов
-IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
+// Получение контейнера в Web-приложении:
+// var mainUnityContainer = (IUnityContainer)HttpContext.Current.Items["UnityContainer"];
+// 
+// Получение контейнера в Desktop-приложении:
+// var mainUnityContainer = Application.Container;
+
+using (var scope = mainUnityContainer.CreateChildContainer())
+{
+    var ds = scope.Resolve<IDataService>();
+    var languageDef = new ExternalLangDef(ds);
+    // ... остальной код
+}

Also applies to: 91-93, 103-105, 116-118

pages/products/flexberry-orm/query-language/fo_exist-details.ru.md (1)

32-49: ⚠️ Potential issue

Исправьте несоответствие в использовании сервиса данных

В строке 49 используется статическое обращение к ICSSoft.STORMNET.Business.ds, что противоречит принципу внедрения зависимостей, реализованному в остальной части кода.

Примените следующее исправление:

-ICSSoft.STORMNET.DataObject[] dobjsСервер = ICSSoft.STORMNET.Business.ds.LoadObjects(lcsСервер);
+ICSSoft.STORMNET.DataObject[] dobjsСервер = ds.LoadObjects(lcsСервер);
📝 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.

IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
IDataService ds = mainUnityContainer.Resolve<IDataService>();
ExternalLangDef languageDef = new ExternalLangDef(ds);
LoadingCustomizationStruct lcsСервер = LoadingCustomizationStruct.GetSimpleStruct(typeof (Репликации.Сервер), "СерверE");
lcsСервер.LoadingTypes = new Type[] {typeof (Репликации.Сервер)};
View view = Information.GetView("СерверПодразделенияE", typeof(Репликации.СерверПодразделения));
ICSSoft.STORMNET.Windows.Forms.DetailVariableDef dvd = new ICSSoft.STORMNET.Windows.Forms.DetailVariableDef();
dvd.ConnectMasterPorp = "Сервер";
dvd.OwnerConnectProp = new string[] { SQLWhereLanguageDef.StormMainObjectKey };
dvd.View = view;
dvd.Type = languageDef.GetObjectType("Details");
lcsСервер.LimitFunction = languageDef.GetFunction(languageDef.funcExist,
                                            dvd,
                                            languageDef.GetFunction(languageDef.funcEQ,
                                                            new VariableDef(languageDef.GuidType, "Подразделение"),
                                                            UpdatedObject.НаправленоИз.__PrimaryKey));
lcsСервер.ReturnTop = 1;
ICSSoft.STORMNET.DataObject[] dobjsСервер = ds.LoadObjects(lcsСервер);
pages/products/flexberry-orm/query-language/fo_variable-def.ru.md (2)

109-110: ⚠️ Potential issue

Обнаружено дублирование текста.

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

-Необходимо отфильтровать ОбразовательныеДокументы для СтрокиРекомендательногоСписка.
-При задании `DetailVariableDef` следует указать: `OwnerConnectProp` = ЗаявлениеАбитуриента.Личность, `ConnectMasterProp` = Личность.
📝 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.



125-141: ⚠️ Potential issue

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

В коде примера обнаружена синтаксическая ошибка:

-lcsДолгосрочныеКлиенты.LoadingTypes = new[) { typeof(Клиент) };
+lcsДолгосрочныеКлиенты.LoadingTypes = new[] { typeof(Клиент) };

Также обратите внимание на опечатку в имени свойства:

-    ConnectMasterPorp = "Клиент",
+    ConnectMasterProp = "Клиент",
📝 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.

IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
IDataService ds = mainUnityContainer.Resolve<IDataService>();
ExternalLangDef languageDef = new ExternalLangDef(ds);
LoadingCustomizationStruct lcsДолгосрочныеКлиенты = LoadingCustomizationStruct.GetSimpleStruct(typeof(Клиент), "КлиентE");
lcsДолгосрочныеКлиенты.LoadingTypes = new[] { typeof(Клиент) };
var view = Information.GetView("КредитE", typeof(Кредит));
var dvd = new DetailVariableDef
{
    ConnectMasterProp = "Клиент",
    OwnerConnectProp = new[] { SQLWhereLanguageDef.StormMainObjectKey },
    View = view,
    Type = languageDef.GetObjectType("Details")
};
lcsДолгосрочныеКлиенты.LimitFunction = languageDef.GetFunction(languageDef.funcExist, dvd,
                                                        languageDef.GetFunction(languageDef.funcGEQ, 
                                                        new VariableDef(languageDef.GuidType, "СрокКредита"), 15));
ICSSoft.STORMNET.DataObject[] dobjsДолгосрочныеКлиенты = ds.LoadObjects(lcsДолгосрочныеКлиенты);
pages/guides/practical-guides/flexberry-asp-net/gpg_business-server.ru.md (2)

60-148: 🛠️ Refactor suggestion

Улучшите структуру кода для повышения читаемости и поддерживаемости.

Рекомендуется:

  1. Разделить логику на отдельные методы для улучшения читаемости
  2. Добавить более информативные сообщения об ошибках
  3. Использовать современные конструкции C# для упрощения кода

Пример рефакторинга для проверки наличия товара:

private void ValidateProductAvailability(Заказ заказ, SortedList warehouseProducts)
{
    var errors = new List<string>();
    
    foreach (var orderLine in заказ.СтрокаЗаказа)
    {
        if (!warehouseProducts.ContainsKey(orderLine.Товар.__PrimaryKey))
        {
            errors.Add($"Товар \"{orderLine.Товар.Название}\" отсутствует на складе.");
            continue;
        }

        var totalAvailable = GetTotalAvailableQuantity(warehouseProducts[orderLine.Товар.__PrimaryKey] as ArrayList);
        if (totalAvailable < orderLine.Количество)
        {
            errors.Add($"Недостаточно товара \"{orderLine.Товар.Название}\": в наличии {totalAvailable}, требуется {orderLine.Количество}");
        }
    }

    if (errors.Any())
    {
        throw new InvalidOperationException(string.Join(Environment.NewLine, errors));
    }
}

private int GetTotalAvailableQuantity(ArrayList warehouses)
{
    return warehouses?.Cast<ТоварНаСкладе>().Sum(w => w.Количество) ?? 0;
}

79-81: ⚠️ Potential issue

Доработайте реализацию внедрения зависимостей.

Текущая реализация имеет следующие проблемы:

  1. Незавершенный код получения контейнера Unity
  2. Отсутствует проверка на null при использовании сервиса данных

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

-IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer.Resolve<IDataService>();
-ICSSoft.STORMNET.DataObject[] objs = ICSSoft.STORMNET.Business.ds.LoadObjects(lcs);
+IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
+IDataService ds = mainUnityContainer.Resolve<IDataService>();
+if (ds == null)
+{
+    throw new InvalidOperationException("Не удалось получить экземпляр IDataService");
+}
+ICSSoft.STORMNET.DataObject[] objs = ds.LoadObjects(lcs);
📝 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.

      IUnityContainer mainUnityContainer = UnityFactory.GetContainer();
      IDataService ds = mainUnityContainer.Resolve<IDataService>();
      if (ds == null)
      {
          throw new InvalidOperationException("Не удалось получить экземпляр IDataService");
      }
      ICSSoft.STORMNET.DataObject[] objs = ds.LoadObjects(lcs);
pages/products/flexberry-winforms/controls/lookup/fw_lookup-another-object.ru.md (1)

168-170: 🛠️ Refactor suggestion

Необходимо улучшить работу с Unity контейнером

Рекомендуется:

  1. Добавить обработку ошибок при разрешении зависимостей
  2. Убедиться в корректном освобождении ресурсов контейнера

Предлагается следующий вариант реализации:

-                IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-                IDataService ds = mainUnityContainer.Resolve<IDataService>();
-                ds.LoadObject("ДежурнаяГруппаE", ДежГр);
+                try
+                {
+                    using (var scope = mainUnityContainer.CreateChildContainer())
+                    {
+                        IDataService ds = scope.Resolve<IDataService>();
+                        ds.LoadObject("ДежурнаяГруппаE", ДежГр);
+                    }
+                }
+                catch (Exception ex)
+                {
+                    throw new InvalidOperationException("Ошибка при загрузке объекта ДежурнаяГруппа", ex);
+                }

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-winforms/forms/editform/fw_edit-objects-on-forms.ru.md (2)

120-121: ⚠️ Potential issue

Уточните способ получения Unity контейнера

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

Предлагаю дополнить пример кодом получения контейнера:

-    IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
+    IUnityContainer mainUnityContainer = ApplicationConfiguration.Container;
📝 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.

    IUnityContainer mainUnityContainer = ApplicationConfiguration.Container;
    IDataService ds = mainUnityContainer.Resolve<IDataService>();

120-121: 💡 Codebase verification

Based on the search results, I can see that there are two main patterns for obtaining IDataService in the documentation:

  1. Через Unity контейнер (основной способ):
IDataService ds = mainUnityContainer.Resolve<IDataService>();
  1. Через DataServiceProvider (используется реже):
IDataService dataService = DataServiceProvider.DataService;

В файле pages/products/flexberry-winforms/forms/editform/fw_edit-objects-on-forms.en.md используется второй способ:

IDataService ds = DataServiceProvider.DataService;

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

Рекомендуется использовать единообразный подход через Unity контейнер во всей документации, так как это:

  1. Является рекомендованным способом согласно документации
  2. Обеспечивает лучшую гибкость и управляемость зависимостями
  3. Используется в подавляющем большинстве примеров
🔗 Analysis chain

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

Убедитесь, что все примеры кода в документации согласованы в отношении получения IDataService через Unity контейнер.


Based on the search results, I can see that there are two main patterns for obtaining IDataService across the documentation:

  1. Through Unity container (most common):
IDataService ds = mainUnityContainer.Resolve<IDataService>();
  1. Through DataServiceProvider (less common):
IDataService dataService = DataServiceProvider.DataService;

Let me check if there are any other patterns by searching for direct instantiation or other ways:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других примеров использования IDataService в документации
rg "IDataService" --type md

Length of output: 38494


Script:

#!/bin/bash
# Search for other patterns of IDataService usage
rg -A 2 "new.*IDataService|=.*IDataService" --type md

Length of output: 52920

pages/products/flexberry-orm/authority-audit/efs_security-rights-objects.ru.md (3)

137-174: 🛠️ Refactor suggestion

Рекомендуется реорганизовать метод SaveObject

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

  1. Выделить валидацию в отдельный метод
  2. Создать отдельный метод для работы с правами доступа
  3. Улучшить обработку ошибок
private bool ValidateInput(string agentName, string accessTypeName, out tTypeAccess typeAccess)
{
    return !string.IsNullOrEmpty(agentName) && Enum.TryParse(accessTypeName, out typeAccess);
}

private void ManagePermission(CurrentUserService.IUser user, tTypeAccess access, Document document, bool isAdd)
{
    var securityManager = new SecurityManager(SecurityDataService, true, true, false);
    if (isAdd)
        securityManager.AddPermissionToObject(user, access, document);
    else
        securityManager.RemovePermissionToObject(user, access, document);
}

37-38: ⚠️ Potential issue

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

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

-    <add name="DefConnStr" connectionString="SERVER=rtc-storm.ics.perm.ru;Trusted_connection=yes;DATABASE=SecurityControlTest" />
+    <add name="DefConnStr" connectionString="SERVER=<your-server>;Trusted_connection=yes;DATABASE=<your-database>" />

[security]

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

    <add name="DefConnStr" connectionString="SERVER=<your-server>;Trusted_connection=yes;DATABASE=<your-database>" />
    <add name="CaseberrySecurity" connectionString="SERVER=<your-server>;Trusted_connection=yes;DATABASE=<your-database>" providerName="ICSSoft.STORMNET.Business.MSSQLDataService, ICSSoft.STORMNET.Business.MSSQLDataService, Version=1.0.0.1, Culture=neutral, PublicKeyToken=49b42003269a4a66" />

106-128: 🛠️ Refactor suggestion

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

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

  1. Использовать потокобезопасную инициализацию
  2. Добавить возможность сброса кэша
  3. Рассмотреть возможность внедрения зависимостей через конструктор
-private static IDataService _securityDataService = null;
+private static volatile IDataService _securityDataService;
+private static readonly object _lock = new object();

 private static IDataService SecurityDataService
 {
     get
     {
-        if (_securityDataService == null)
+        if (_securityDataService == null)
         {
+            lock (_lock)
+            {
+                if (_securityDataService == null)
+                {
                     IUnityContainer container = UnityFactory.GetContainer();
                     _securityDataService = container.Resolve<IDataService>("SecurityManagerDataService");
+                }
+            }
         }
         return _securityDataService;
     }
 }

Committable suggestion was skipped due to low confidence.

pages/products/flexberry-aspnet/controls/wolv/fa_wolv-add-button.ru.md (2)

239-241: 🛠️ Refactor suggestion

Устранить дублирование кода при работе с Unity

Код получения сервиса данных через Unity дублируется в обработчиках кнопок тулбара и строк.

Рекомендуется выделить этот код в отдельный вспомогательный метод:

private IDataService GetDataService()
{
    try 
    {
        var container = UnityFactory.GetContainer();
        return container.Resolve<IDataService>();
    }
    catch (ResolutionFailedException ex)
    {
        throw new InvalidOperationException("Ошибка при получении сервиса данных", ex);
    }
}

Тогда использование будет выглядеть так:

-        IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-        IDataService ds = mainUnityContainer.Resolve<IDataService>();
-        ds.LoadObjects(objects, Город.Views.ГородL, true);
+        var dataService = GetDataService();
+        dataService.LoadObjects(objects, Город.Views.ГородL, true);

84-86: 🛠️ Refactor suggestion

Улучшить пример работы с Unity контейнером

Рекомендуется:

  1. Добавить конкретный пример получения контейнера
  2. Обернуть работу с контейнером в try-catch для обработки возможных ошибок разрешения зависимостей

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

-        IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-        IDataService ds = mainUnityContainer.Resolve<IDataService>();
-        ds.LoadObjects(objects, Город.Views.ГородL, true);
+        try 
+        {
+            var mainUnityContainer = UnityFactory.GetContainer();
+            var dataService = mainUnityContainer.Resolve<IDataService>();
+            dataService.LoadObjects(objects, Город.Views.ГородL, true);
+        }
+        catch (ResolutionFailedException ex)
+        {
+            throw new InvalidOperationException("Ошибка при получении сервиса данных", ex);
+        }
📝 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.

        try 
        {
            var mainUnityContainer = UnityFactory.GetContainer();
            var dataService = mainUnityContainer.Resolve<IDataService>();
            dataService.LoadObjects(objects, Город.Views.ГородL, true);
        }
        catch (ResolutionFailedException ex)
        {
            throw new InvalidOperationException("Ошибка при получении сервиса данных", ex);
        }
pages/products/flexberry-orm/additional-features/fo_additional-loading.ru.md (1)

57-59: ⚠️ Potential issue

Добавьте обработку ошибок при работе с Unity-контейнером

При получении сервиса из контейнера следует добавить обработку возможных исключений и использовать блок try-catch.

-IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-IDataService ds = mainUnityContainer .Resolve<IDataService>();
-ICSSoft.STORMNET.Business.ds.LoadObject(view, dobj, false, false); // дочитка объекта данных
+IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
+try
+{
+    IDataService ds = mainUnityContainer.Resolve<IDataService>();
+    ds.LoadObject(view, dobj, false, false); // дочитка объекта данных
+}
+catch (ResolutionFailedException ex)
+{
+    throw new InvalidOperationException("Не удалось получить сервис данных из контейнера", ex);
+}
📝 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.

IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
try
{
    IDataService ds = mainUnityContainer.Resolve<IDataService>();
    ds.LoadObject(view, dobj, false, false); // дочитка объекта данных
}
catch (ResolutionFailedException ex)
{
    throw new InvalidOperationException("Не удалось получить сервис данных из контейнера", ex);
}
pages/products/flexberry-aspnet/controls/wolv/fa_wolv-events.ru.md (4)

111-112: ⚠️ Potential issue

Исправьте форматирование и опечатку в строке вызова сервиса данных

В строке вызова метода есть лишний пробел в ICSSoft.STORMNET.Business.ds и опечатка в имени переменной.

-        ICSSoft.STORMNET.Business.ds.UpdateObject(args.DataObj);
+        ds.UpdateObject(args.DataObj);
📝 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.

        IDataService ds = mainUnityContainer.Resolve<IDataService>();
        ds.UpdateObject(args.DataObj);

292-294: ⚠️ Potential issue

Добавьте обработку исключений при обновлении объектов

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

                 IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
                 IDataService ds = mainUnityContainer.Resolve<IDataService>();
-                ds.UpdateObjects(ref deletingAdreses);
+                try {
+                    ds.UpdateObjects(ref deletingAdreses);
+                } catch (Exception ex) {
+                    // Логирование ошибки
+                    throw new InvalidOperationException("Ошибка при каскадном удалении объектов", ex);
+                }
📝 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.

                IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
                IDataService ds = mainUnityContainer.Resolve<IDataService>();
                try {
                    ds.UpdateObjects(ref deletingAdreses);
                } catch (Exception ex) {
                    // Логирование ошибки
                    throw new InvalidOperationException("Ошибка при каскадном удалении объектов", ex);
                }

207-209: ⚠️ Potential issue

Добавьте обработку ошибок при парсинге JSON

Текущая реализация не обрабатывает возможные ошибки при парсинге JSON данных.

-            var deletingObjects = $.parseJSON("<%=DeletingObjects%>");
-            if (deletingObjects.length > 0) {
+            try {
+                var deletingObjects = $.parseJSON("<%=DeletingObjects%>");
+                if (deletingObjects && deletingObjects.length > 0) {
+            } catch (e) {
+                console.error("Ошибка при парсинге данных об удаляемых объектах:", e);
+                return;
+            }
📝 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.

            try {
                var deletingObjects = $.parseJSON("<%=DeletingObjects%>");
                if (deletingObjects && deletingObjects.length > 0) {
            } catch (e) {
                console.error("Ошибка при парсинге данных об удаляемых объектах:", e);
                return;
            }

154-158: 🛠️ Refactor suggestion

Оптимизируйте запрос к базе данных

Текущая реализация выполняет излишнюю материализацию данных через .ToArray(). Рекомендуется использовать .Any() для проверки наличия связанных объектов.

-        МедицинскоеУчреждение[] mil = ds.Query<МедицинскоеУчреждение>(МедицинскоеУчреждение.Views.MIG_МедицинскоеУчреждениеE)
-            .Where(o => o.Адрес.__PrimaryKey == UpdatedObject.__PrimaryKey)
-            .ToArray();
-        if (mil.Length > 0)
+        bool hasRelatedObjects = ds.Query<МедицинскоеУчреждение>(МедицинскоеУчреждение.Views.MIG_МедицинскоеУчреждениеE)
+            .Where(o => o.Адрес.__PrimaryKey == UpdatedObject.__PrimaryKey)
+            .Any();
+        if (hasRelatedObjects)
📝 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.

        IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
        IDataService ds = mainUnityContainer.Resolve<IDataService>();
        bool hasRelatedObjects = ds.Query<МедицинскоеУчреждение>(МедицинскоеУчреждение.Views.MIG_МедицинскоеУчреждениеE)
            .Where(o => o.Адрес.__PrimaryKey == UpdatedObject.__PrimaryKey)
            .Any();
        if (hasRelatedObjects)
pages/guides/practical-guides/flexberry-ember/gpg_server-logic-implementation.md (3)

345-351: ⚠️ Potential issue

Улучшение логики проверки ошибок

Текущая реализация проверки ошибок находится внутри цикла, что может привести к преждевременному выбросу исключения. Рекомендуется вынести проверку за пределы цикла:

-    // В случае, если чего-то не хватило, вывести сообщение.
-    if (errStr != string.Empty)
-    {
-        throw new Exception(errStr);
-    }

И добавить после цикла:

if (errStr.Length > 0)
{
    throw new InvalidOperationException(errStr.ToString());
}

295-299: 🛠️ Refactor suggestion

Оптимизация обработки ошибок

Рекомендуется использовать StringBuilder вместо string для формирования сообщения об ошибке, так как это более эффективно при множественных конкатенациях:

-    string errStr = string.Empty;
+    StringBuilder errStr = new StringBuilder();

И соответственно заменить конкатенацию на:

-    errStr += "Товар  \"" + ...
+    errStr.AppendLine($"Товар \"{order.OrderItem[i].Product.Name}\" в наличии отсутствует.");

Committable suggestion was skipped due to low confidence.


188-190: ⚠️ Potential issue

Необходимо добавить обработку ошибок при работе с Unity контейнером

Текущая реализация не обрабатывает возможные исключения при разрешении зависимостей. Рекомендуется добавить try-catch блок:

-    IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
-    IDataService ds = mainUnityContainer.Resolve<IDataService>();
+    IDataService ds;
+    try 
+    {
+        IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
+        ds = mainUnityContainer.Resolve<IDataService>();
+    }
+    catch (ResolutionFailedException ex)
+    {
+        throw new InvalidOperationException("Не удалось получить экземпляр IDataService", ex);
+    }
📝 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.

    IDataService ds;
    try 
    {
        IUnityContainer mainUnityContainer = ...; // Получение основного контейнера для работы с Unity.
        ds = mainUnityContainer.Resolve<IDataService>();
    }
    catch (ResolutionFailedException ex)
    {
        throw new InvalidOperationException("Не удалось получить экземпляр IDataService", ex);
    }
    DataObject[] objs = ds.LoadObjects(lcs);
pages/products/flexberry-orm/data-service/fo_sql-data-service.ru.md (2)

642-643: ⚠️ Potential issue

Исправьте грамматическую ошибку в описании поведения LoadObjects.

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

Примените следующие изменения:

-Т.е. последовательные LoadObjects будут выполнены в на разных `System.Data.IDbConnection`.
+Т.е. последовательные LoadObjects будут выполнены на разных `System.Data.IDbConnection`.
📝 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.

Также важно понимать, что при выполнении любой операции (чтение/обновление и т.д.) коннекция создаётся, а в конце закрывается. Т.е. последовательные LoadObjects будут выполнены на разных `System.Data.IDbConnection`.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~642-~642: Два предлога подряд: «в» или «на»
Context: ...довательные LoadObjects будут выполнены в на разных System.Data.IDbConnection.

...

(Two_PREP)


613-619: ⚠️ Potential issue

Исправьте форматирование таблицы.

Таблица не соответствует стандартам Markdown - отсутствует закрывающая вертикальная черта в заголовке.

Примените следующие изменения:

-|Событие|Описание|
-|:------|:------
+|Событие|Описание|
+|:------|:-------|

Committable suggestion was skipped due to low confidence.

🧰 Tools
🪛 Markdownlint

613-613: Expected: leading_and_trailing; Actual: leading_only; Missing trailing pipe
Table pipe style

(MD055, table-pipe-style)

pages/products/flexberry-orm/query-language/fo_using-languagedef.ru.md (4)

596-599: ⚠️ Potential issue

Добавьте проверку на null в метод RemoveFrameq.

Метод RemoveFrameq может вызвать NullReferenceException при передаче null. Рекомендуется добавить проверку входного параметра.

 public string RemoveFrameq(string ident)
 {
+    if (string.IsNullOrEmpty(ident))
+        return ident;
     return ident.TrimStart('"').TrimEnd('"');
 }
📝 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.

    public string RemoveFrameq(string ident)
    {
        if (string.IsNullOrEmpty(ident))
            return ident;
        return ident.TrimStart('"').TrimEnd('"');
    }

587-594: 🛠️ Refactor suggestion

Оптимизируйте метод q для улучшения производительности.

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

 public string q(string ident)
 {
-    string s = ident;
-    if (ident.IndexOf("\".\"") == -1 && ident.IndexOf(".") != 0)
-    {
-        s = ident.Replace(".", "\".\"");
-    }
-    return (DataService as SQLDataService).PutIdentifierIntoBrackets(s);
+    if (string.IsNullOrEmpty(ident))
+        return ident;
+    
+    var hasQuotedDot = ident.Contains("\".\"");
+    var startsWithDot = ident.StartsWith(".");
+    
+    if (!hasQuotedDot && !startsWithDot)
+    {
+        var sb = new StringBuilder(ident.Length + 2);
+        sb.Append(ident.Replace(".", "\".\""));
+        return (DataService as SQLDataService).PutIdentifierIntoBrackets(sb.ToString());
+    }
+    
+    return (DataService as SQLDataService).PutIdentifierIntoBrackets(ident);
 }

Committable suggestion was skipped due to low confidence.


326-334: 🛠️ Refactor suggestion

Используйте pattern matching для проверки типа DataService.

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

-if (this.DataService is ICSSoft.STORMNET.Business.MSSQLDataService)
+if (this.DataService is ICSSoft.STORMNET.Business.MSSQLDataService mssql)
 {
-    result = string.Format("CHARINDEX({0}, {1})", func.Parameters[0].ToString(), func.Parameters[1].ToString());
+    result = $"CHARINDEX({func.Parameters[0]}, {func.Parameters[1]})";
 }

Committable suggestion was skipped due to low confidence.


35-57: ⚠️ Potential issue

Рекомендуется добавить проверку на null для dataService.

В конструкторе класса ExportLanguage отсутствует проверка входного параметра dataService на null. Это может привести к NullReferenceException при использовании класса.

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

 public ExportLanguage(IDataService dataService)
 {
+    if (dataService == null)
+        throw new ArgumentNullException(nameof(dataService));
     DataService = dataService;
 }
📝 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.

using ICSSoft.STORMNET.UI;
using ICSSoft.STORMNET.Business;
using ICSSoft.STORMNET.FunctionalLanguage;
using ICSSoft.STORMNET.FunctionalLanguage.SQLWhere;
using System.Collections;
  
public class ExportLanguage
{
    /// <summary>
    /// DataService для конкретной СУБД.
    /// </summary>
    private IDataService DataService;
     
    /// <summary>
    /// Конструктор, котрый требует определения сервиса конкретной СУБД.
    /// </summary>
    /// <param name="dataService"></param>
    public ExportLanguage(IDataService dataService)
    {
        if (dataService == null)
            throw new ArgumentNullException(nameof(dataService));
        DataService = dataService;
    }
     

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

Successfully merging this pull request may close these issues.

2 participants