Массив.Найти

Методы · Find

Выполняет поиск элемента в массиве.

Синтаксис

Найти(<Значение>)
Полное описание, параметры и ограничения

Массив.Найти (Array.Find)

Массив (Array)

Найти (Find)

Доступен, начиная с версии 8.1.

Синтаксис:
Найти(<Значение>)
Параметры:

<Значение> (обязательный)
Тип: Произвольный.
Искомое значение.
Возвращаемое значение:
Тип: Число, Неопределено.
Если элемент найден, возвращается его индекс. Если элемент не найден, возвращается Неопределено.
Описание:

Выполняет поиск элемента в массиве.

Доступность:

Тонкий клиент, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.

Примечание:
Метод эффективно использовать для поиска уникальных значений.
Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Удалить товар из массива, только если он найден

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

Где и как запускать

Фрагмент внутри учебной процедуры; массив существует только в памяти.

Подготовка

  1. Поместите код в тело учебной команды или процедуры.

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

Товары = Новый Массив;
Товары.Добавить("Книга");
Товары.Добавить("Тетрадь");
Индекс = Товары.Найти("Книга");
Если Индекс <> Неопределено Тогда
    Товары.Удалить(Индекс);
КонецЕсли;
Сообщить(Товары.Количество());
Сообщить(Товары[0]);
Товары.Очистить();
Сообщить(Товары.Количество());

Разбор по шагам

  1. Создаём массив из двух товаров.

  2. Найти возвращает индекс 0 для книги. Ноль здесь является правильным результатом.

  3. При наличии индекса удаляем элемент; оставшаяся тетрадь получает индекс 0.

  4. Выводим количество и оставшееся значение, затем очищаем массив целиком.

  5. После Очистить сам объект массива остаётся доступен, но элементов в нём нет.

Как проверить результат

  1. Ожидаемые сообщения: 1, Тетрадь, 0.

  2. Ищите Ручка вместо Книга: удаление не выполняется, до очистки остаются два товара.

  3. Поставьте точку останова на Если и проверьте значение индекса при успешном поиске первого элемента.

Ожидаемый результат

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

На что обратить внимание

  1. Не применяйте ЗначениеЗаполнено к результату Найти: для числа 0 получится Ложь.

  2. После удаления индексы последующих элементов сдвигаются. При удалении в цикле заранее выберите безопасный порядок обхода.

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

Разобрать назначения ключа и ограничения УЦ

У образца заданы Basic Constraints, Key Usage и Extended Key Usage. Сравниваем разобранные значения с исходными DER-расширениями и не путаем назначение с наличием закрытого ключа.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Используйте отдельную учебную базу. Фрагмент без директив вставьте в тело серверной процедуры ВыполнитьПример() Экспорт общего модуля УчебныеЗадачи.

  2. Все исходные байты создаются самим примером в памяти. Файлы, сеть, справочники и документы не нужны.

  3. Запускайте задачи отдельно. После закрытия ЧтениеДанных/ЗаписьДанных не используйте этот экземпляр повторно.

  4. В пример встроен отдельный публичный учебный X.509-сертификат Syntax Guide Training Only. Его закрытый ключ не сохранён, сертификат не установлен в хранилище ОС и не признан доверенным.

  5. Используйте Windows-клиент или Windows-сервер 1С 8.5.1.1343. Проверка других ОС, веб-клиента и расширений криптографии этим уроком не подтверждена.

  6. Не заменяйте учебный сертификат рабочим для первого запуска. Код ничего не подписывает, не импортирует в хранилища, не обращается к OCSP/CRL и не просит пароль.

ИсходныеДанные = Base64Значение("MIIC+jCCAeKgAwIBAgIBVTANBgkqhkiG9w0BAQsFADAlMSMwIQYDVQQDDBpTeW50YXggR3VpZGUgVHJhaW5pbmcgT25seTAeFw0yMDAxMDEwMDAwMDBaFw0zNTEyMzEwMDAwMDBaMCUxIzAhBgNVBAMMGlN5bnRheCBHdWlkZSBUcmFpbmluZyBPbmx5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkraGtF6mSMHQWI0lIdDxzNjLTB0VHmtLUYEIxXFFJepQtyMGWZ9rfpbTglFp8wpsw+Wc09FQyDFuKsNz3cBcBBx7fTmJVuYzfrXjhDECNqEoKMEf+Qrim3WsVKA/Qr8IMnzq1qdnA1pLgaaKyscfCJkw9W1yoTlLV3PmGs6h6gP1/KXwe+zKN5r3Jl0IVk8RXTLAeyqN01lCuyzaeSYm/v2YS88LdaJ/nkdFqy5QjRXfm7EOCW7eCZlCBwW0EvGhUarZxWlq04lPs9qu3aC3/6gY/scE2vY1jeZV2VpV0lLQpU5gVdjVGI4YQmfgkb8jYtV5U7FQ1KQ6Poji/ort6wIDAQABozUwMzAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEARoo1FJJKKkaZXyFl1tlYj8K7xvryXwhb+tCaFvdXuON27YC3/YIHLUT9sCF9o76VIT8dsVMpK0Qo+VV0FIvqRcB+u6SmyJ+Y7590mzd5P1CSt8Y/4BNV2LosYxhcdVczs26PWHL5GXyBMWRxtBjNsnTeMKh4/WIMrplAr0IOJCmjIeKhv0JbQacsNqhmpe7JdgtBYC4Rrn3ajdD99HZREmyLR/iJrh6W4IGqSN0MGT0xL/mLI0GsTp9JhHDF3o8bmC1yMDlLOoAZp7M072bzfDsKFPg4ATQp/hhbtsTdS/LXrd9cLehZ7ThH6ljL8y2JbALD+6HPnT6Sv+Mg0Wq0MA==");
Сертификат = Новый СертификатКриптографии(ИсходныеДанные);
Дополнения = Сертификат.ДополненияСертификата;
ОграниченияУЦ = Дополнения.Получить("2.5.29.19");
Если ТипЗнч(ОграниченияУЦ) <> Тип("Булево") Тогда
    ВызватьИсключение "У учебного образца не разобрано Basic Constraints";
КонецЕсли;
Сообщить(ОграниченияУЦ = Ложь);
Назначения = Дополнения.Получить("2.5.29.37");
Если Назначения = Неопределено Тогда
    ВызватьИсключение "В учебном образце нет Extended Key Usage";
КонецЕсли;
Сообщить(Назначения.Найти("1.3.6.1.5.5.7.3.2") <> Неопределено);
СырыеДополнения = Сертификат.ДополненияСертификатаКакИсходныеДанные;
СыройBasic = СырыеДополнения.Получить("2.5.29.19");
Если СыройBasic = Неопределено Тогда
    ВызватьИсключение "Нет исходных байтов учебного ограничения УЦ";
КонецЕсли;
Сообщить(ТипЗнч(СыройBasic) = Тип("ДвоичныеДанные"));
Сообщить(СыройBasic.Размер() > 0);
ДополнительныйEKU = Неопределено;
Если Сертификат.РасширенныеСвойства.Свойство("EKU", ДополнительныйEKU) Тогда
    Сообщить("EKU в расширенных свойствах: " + Строка(ДополнительныйEKU.Количество()));
Иначе
    Сообщить("EKU в расширенных свойствах не предоставлен");
КонецЕсли;
Сообщить("Назначение для подписи: " + Строка(Сертификат.ИспользоватьДляПодписи));
Сообщить("Назначение для шифрования: " + Строка(Сертификат.ИспользоватьДляШифрования));

Разбор по шагам

  1. OID 2.5.29.19 в разобранном Соответствие даёт Булево: у нашего образца Ложь, то есть это не сертификат УЦ.

  2. OID 2.5.29.37 даёт массив назначений; у образца есть назначение Client Authentication.

  3. В ДополненияСертификатаКакИсходныеДанные тот же OID даёт ДвоичныеДанные, а не готовое Булево.

  4. РасширенныеСвойства может содержать EKU; сначала проверяем наличие поля.

  5. ИспользоватьДляПодписи/Шифрования читаем как признаки назначения. Они не поставляют отсутствующий закрытый ключ и не устанавливают доверие.

Как проверить результат

  1. Четыре сравнения Истина; вывод признаков назначения и EKU диагностический.

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

Ожидаемый результат

Разобраны конкретные расширения публичного образца без обращения к хранилищам.

На что обратить внимание

  1. Двоичное DER-расширение нельзя напрямую использовать как логический признак.

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

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.