{"id":18931778,"url":"https://github.com/nixel2007/validate","last_synced_at":"2026-01-26T22:46:50.443Z","repository":{"id":187297830,"uuid":"675797611","full_name":"nixel2007/validate","owner":"nixel2007","description":null,"archived":false,"fork":false,"pushed_at":"2023-10-08T21:56:12.000Z","size":37,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-31T20:16:43.422Z","etag":null,"topics":["hacktoberfest"],"latest_commit_sha":null,"homepage":"","language":"1C Enterprise","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nixel2007.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null},"funding":{"github":"nixel2007"}},"created_at":"2023-08-07T18:43:43.000Z","updated_at":"2023-10-08T21:54:44.000Z","dependencies_parsed_at":"2023-08-09T19:59:53.043Z","dependency_job_id":null,"html_url":"https://github.com/nixel2007/validate","commit_stats":null,"previous_names":["nixel2007/validate"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixel2007%2Fvalidate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixel2007%2Fvalidate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixel2007%2Fvalidate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixel2007%2Fvalidate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nixel2007","download_url":"https://codeload.github.com/nixel2007/validate/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239930015,"owners_count":19720247,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hacktoberfest"],"created_at":"2024-11-08T11:46:40.368Z","updated_at":"2026-01-26T22:46:50.431Z","avatar_url":"https://github.com/nixel2007.png","language":"1C Enterprise","funding_links":["https://github.com/sponsors/nixel2007"],"categories":[],"sub_categories":[],"readme":"# validate\n\n[![Тестирование](https://github.com/nixel2007/validate/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/nixel2007/validate/actions/workflows/test.yml?query=branch%3Amaster)\n[![Quality Gate](https://sonar.openbsl.ru/api/project_badges/measure?project=validate\u0026metric=alert_status)](https://sonar.openbsl.ru/dashboard?id=validate)\n[![Coverage](https://sonar.openbsl.ru/api/project_badges/measure?project=validate\u0026metric=coverage)](https://sonar.openbsl.ru/dashboard?id=validate)\n\n\nВалидация объектов на основе правил-аннотаций для OneScript.\n\nБиблиотека позволяет описывать ограничения прямо на свойствах объектов через аннотации и выполнять проверку одним вызовом валидатора. Поддерживается проверка вложенных объектов, настраиваемые сообщения и простое расширение набора правил.\n\nДля навигации по коллекциям используйте переключающую аннотацию `\u0026ДляКаждого`:\n- `\u0026ДляКаждого(\"Значение\")` — переключает контекст на элементы коллекции (значение режима можно опустить)\n- `\u0026ДляКаждого(\"Ключ\")` — переключает контекст на ключи коллекции (только для коллекций, итерируемых как КлючИЗначение)\n\n## Требования\n\n- OneScript 1.9.2 или выше\n\n## Установка\n\n- Через OPM (OneScript Package Manager):\n\n```bash\nopm install validate\n```\n\n- Локально в проект: добавьте зависимость в ваш packagedef:\n\n```bsl\n    .ЗависитОт(\"validate\", \"0.1.0\")\n```\n\n## Быстрый старт\n\nОпишите ограничения аннотациями на полях вашего объекта:\n\n```bsl\n\u0026Заполнено(Сообщение = \"Произвольное сообщение\")\nПерем Поле1 Экспорт;\n\n\u0026Заполнено\nПерем Поле2 Экспорт;\n\n\u0026Минимум(-10)\n\u0026Максимум(10)\nПерем Поле3 Экспорт;\n\n\u0026Валидно\nПерем ВложенныйОбъект Экспорт;\n\n\u0026Тип(\"Число\")\nПерем Поле4 Экспорт;\n\n// Элементы массива — строки\n\u0026Тип(\"Массив\")\n\u0026ДляКаждого\n\u0026Тип(\"Строка\")\nПерем КоллекцияСтрок Экспорт;\n\n// Значения структуры — числа\n\u0026Тип(\"Структура\")\n\u0026ДляКаждого\n\u0026Тип(\"Число\")\nПерем СтруктураЧисел Экспорт;\n\n// Ключи соответствия — числа\n\u0026Тип(\"Соответствие\")\n\u0026ДляКаждого(\"Ключ\")\n\u0026Тип(\"Число\")\nПерем СоответствиеЧисловыхКлючей Экспорт;\n```\n\nВыполните валидацию и выведите ошибки:\n\n```bsl\nВалидатор = Новый Валидатор;\nОбъект = Новый ТестовыйОбъект; // ваш класс с аннотациями\n\nРезультат = Валидатор.Валидировать(Объект);\nЕсли Результат.Количество() \u003e 0 Тогда\n\t\tСообщить(Валидатор.ОписаниеОшибокВалидации(Результат));\nКонецЕсли;\n```\n\nПример строки в отчете об ошибках:\n\n```\n[filled]: Объект: \u003cТипОбъекта\u003e, Свойство: Поле2, Сообщение: Значение не заполнено\n```\n\n## Подробные примеры работы с Валидатором\n\n### Пример 1: Создание класса с аннотациями\n\nСоздайте класс с аннотациями валидации:\n\n```bsl\n// Класс ПользовательДанные.os\n\n\u0026Заполнено(Сообщение = \"Имя пользователя обязательно для заполнения\")\nПерем Имя Экспорт;\n\n\u0026Заполнено\n\u0026Минимум(18)\n\u0026Максимум(120)\nПерем Возраст Экспорт;\n\n\u0026Заполнено\nПерем Email Экспорт;\n\n\u0026Минимум(0)\n\u0026Максимум(100000)\nПерем Зарплата Экспорт;\n\n\u0026Истина\nПерем Активен Экспорт;\n```\n\n### Пример 2: Валидация данных (корректных и некорректных)\n\n```bsl\n// Создаем валидатор\nВалидатор = Новый Валидатор;\n\n// Сначала валидируем корректные данные\nПользователь = Новый ПользовательДанные;\nПользователь.Имя = \"Иван Иванов\";\nПользователь.Возраст = 30;\nПользователь.Email = \"ivan@example.com\";\nПользователь.Зарплата = 50000;\nПользователь.Активен = Истина;\n\nРезультатВалидации = Валидатор.Валидировать(Пользователь);\n\n// Проверяем результат - для корректных данных ошибок не будет\nЕсли РезультатВалидации.Количество() = 0 Тогда\n    Сообщить(\"Данные корректны! Валидация прошла успешно.\");\nИначе\n    Сообщить(\"Неожиданные ошибки при валидации корректных данных\");\nКонецЕсли;\n\n// Теперь валидируем некорректные данные\nНекорректныйПользователь = Новый ПользовательДанные;\nНекорректныйПользователь.Имя = \"\"; // Пустое имя\nНекорректныйПользователь.Возраст = 15; // Меньше минимума\nНекорректныйПользователь.Зарплата = 150000; // Больше максимума\nНекорректныйПользователь.Активен = Ложь; // Должно быть Истина\n\nРезультатВалидации = Валидатор.Валидировать(НекорректныйПользователь);\n\n// Выводим все ошибки\nЕсли РезультатВалидации.Количество() \u003e 0 Тогда\n    Сообщить(\"Найдено нарушений: \" + РезультатВалидации.Количество());\n    Сообщить(Валидатор.ОписаниеОшибокВалидации(РезультатВалидации));\nИначе\n    Сообщить(\"Ошибка: валидация должна была найти нарушения\");\nКонецЕсли;\n```\n\n### Пример 3: Обработка отдельных нарушений\n\n```bsl\n// Создаем объект с ошибками\nПользователь = Новый ПользовательДанные;\nПользователь.Возраст = 200; // Превышает максимум\n// Остальные поля не заполнены\n\nРезультатВалидации = Валидатор.Валидировать(Пользователь);\n\n// Обрабатываем каждое нарушение отдельно\nДля Каждого Нарушение Из РезультатВалидации Цикл\n    \n    ИмяСвойства = Нарушение.ИмяСвойства();\n    Сообщение = Нарушение.Сообщение();\n    КодОшибки = Нарушение.Код();\n    \n    // Можно обрабатывать разные типы ошибок по-разному\n    Если КодОшибки = \"filled\" Тогда\n        Сообщить(\"Поле не заполнено: \" + ИмяСвойства + \" - \" + Сообщение);\n    ИначеЕсли КодОшибки = \"max\" Тогда\n        Сообщить(\"Превышен максимум для поля: \" + ИмяСвойства + \" - \" + Сообщение);\n    ИначеЕсли КодОшибки = \"min\" Тогда\n        Сообщить(\"Значение меньше минимума для поля: \" + ИмяСвойства + \" - \" + Сообщение);\n    Иначе\n        Сообщить(\"Ошибка валидации [\" + КодОшибки + \"]: \" + ИмяСвойства + \" - \" + Сообщение);\n    КонецЕсли;\n    \nКонецЦикла;\n```\n\n### Пример 4: Валидация вложенных объектов\n\n```bsl\n// Класс ПользовательДанные.os (сокращенная версия)\n\u0026Заполнено\nПерем Имя Экспорт;\n\n\u0026Валидно  // Эта аннотация указывает, что нужно валидировать вложенный объект\nПерем Адрес Экспорт;\n\n// Класс Адрес.os\n\u0026Заполнено\nПерем Город Экспорт;\n\n\u0026Заполнено\n\u0026Минимум(100000)\n\u0026Максимум(999999)\nПерем Индекс Экспорт;\n\n// Создаем пользователя с адресом\nПользователь = Новый ПользовательДанные;\nПользователь.Имя = \"Петр Петров\";\n\n// Создаем адрес с ошибкой\nАдрес = Новый Адрес;\nАдрес.Город = \"Москва\";\nАдрес.Индекс = 12345; // Меньше минимума\n\nПользователь.Адрес = Адрес;\n\n// Валидация проверит и основной объект, и вложенный\n// благодаря аннотации \u0026Валидно у поля Адрес\nРезультатВалидации = Валидатор.Валидировать(Пользователь);\n\nЕсли РезультатВалидации.Количество() \u003e 0 Тогда\n    Сообщить(\"Ошибки валидации:\");\n    Сообщить(Валидатор.ОписаниеОшибокВалидации(РезультатВалидации));\nКонецЕсли;\n```\n\n## Поддерживаемые аннотации\n\n- `\u0026Заполнено(Сообщение = \"...\")` — значение поля должно быть заполнено. Код нарушения: `filled`.\n- `\u0026Истина` — булево значение должно быть Истина. Код нарушения: `true`.\n- `\u0026Ложь` — булево значение должно быть Ложь. Код нарушения: `false`.\n- `\u0026Минимум(\u003cчисло\u003e)` — значение не меньше минимума. Код нарушения: `min`.\n- `\u0026Максимум(\u003cчисло\u003e)` — значение не больше максимума. Код нарушения: `max`.\n- `\u0026Тип(\u003cстрока\u003e)` — значение должно иметь указанный тип. Код нарушения: `type`.\n- `\u0026Валидно` — рекурсивная проверка вложенного объекта. Код нарушения: `valid`.\n\nПереключение контекста коллекций задаётся аннотацией `\u0026ДляКаждого`; её можно указывать несколько раз для вложенных коллекций.\n\nСообщение об ошибке можно переопределить параметром аннотации `Сообщение`.\n\n### Примеры для коллекций\n\n- Элементы массива в диапазоне 0..10:\n\n```bsl\n\u0026Тип(\"Массив\")\n\u0026ДляКаждого\n\u0026Тип(\"Число\")\n\u0026Минимум(0)\n\u0026Максимум(10)\nПерем МассивЧиселСДиапазоном Экспорт;\n```\n\n- Ключи соответствия больше 5 (минимум 6):\n\n```bsl\n\u0026Тип(\"Соответствие\")\n\u0026ДляКаждого(\"Ключ\")\n\u0026Тип(\"Число\")\n\u0026Минимум(6)\nПерем СоответствиеКлючиБольше5 Экспорт;\n```\n\nПримечание: при `\u0026ДляКаждого(\"Ключ\")` для коллекций без ключей (например, `Массив`) будет выброшено исключение.\n\n## Расширение и кастомизация\n\n- Конструктор валидатора поддерживает подмену фабрики валидаций и контейнера аннотаций:\n\n```bsl\nВалидатор = Новый Валидатор(МояФабрикаВалидаций, МойКонтейнерАннотаций);\n```\n\n- По умолчанию используется `СтандартнаяФабрикаВалидаций`, где назначено соответствие аннотаций и классов валидаций (`ВалидацияОграниченияЗаполнено`, `...Минимум`, `...Максимум`, `...Истина`, `...Ложь`, `...Тип`, `...Валидно`).\n- Можно добавлять собственные аннотации в контейнер и свои реализации классов валидаций/ограничений.\n\n## Запуск тестов\n\nВ проект включены авто-тесты на 1testrunner. Запустить можно так:\n\n```bash\noscript tasks/test.os\n```\n\nРезультаты в формате JUnit сохраняются в каталоге `out`.\n\n### Покрытие кода\n\nДля прогона тестов со сбором покрытия используйте задачу из `tasks/coverage.os`:\n\n```bash\noscript tasks/coverage.os\n```\n\nСкрипт сохранит статистику в `out/stat.json` и сформирует отчеты:\n\n- `out/genericCoverage.xml` — Generic Coverage (используется Sonar)\n- `out/cobertura.xml` — отчет в формате Cobertura (используется плагином Coverage Gutters в VSCode)\n\n---\n\n## Лицензия\n\nЭтот проект лицензируется под лицензией MIT. Подробности см. в файле [LICENSE.md](./LICENSE.md).\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnixel2007%2Fvalidate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnixel2007%2Fvalidate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnixel2007%2Fvalidate/lists"}