Массив.Удалить

Методы · Delete

Удаляет значение из массива по указанному индексу.

Синтаксис

Удалить(<Индекс>)

Примеры платформы

Массив.Удалить(4);
Полное описание, параметры и ограничения

Массив.Удалить (Array.Delete)

Массив (Array)

Удалить (Delete)

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

Синтаксис:
Удалить(<Индекс>)
Параметры:

<Индекс> (обязательный)
Тип: Число.
Индекс удаляемого элемента.
Описание:

Удаляет значение из массива по указанному индексу.

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

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

Примечание:
Если указанный в параметре индекс больше, чем ВГраница, то никаких действий не производится и не выдается сообщение "Индекс находится за границами массива".
Пример:

Массив.Удалить(4);

Использование в версии:

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

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

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

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

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

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

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

Подготовка

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Самодостаточный серверный модуль отделяет десять событий от шести транзакций, обучает поиск ассоциаций, показывает реальные частые группы и правила ЕСЛИ/ТО, выгружает их в дерево и применяет созданную модель к отдельному источнику. Ни состав рекомендаций, ни количество строк выхода заранее не подставляются.

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

Полный серверный общий модуль УчебныеСвоиАссоциации85 собственной пустой конфигурации; подготовка, разбор и модель включены. Не запускался в 1С.

Подготовка

  1. НОВАЯ отдельная пустая файловая база точно 8.5.1.1343: конфигурация УчебныеСвоиАссоциации85, совместимость Не использовать, Русский. Без прикладных объектов, расширений, подписок, заданий и рабочих данных; модули конфигурации вручную пустые. Не использовать БП/КА2/УТ/УНФ.

  2. Общие → Общие модули → УчебныеСвоиАссоциации85: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить весь основной модуль. Будущая ручная подготовка: сохранить и обновить только свой стенд F7. Все функции подготовки и разбора включены.

  3. Создать собственную внешнюю обработку → управляемая Форма → команду/кнопку Выполнить с действием Выполнить. Весь отдельный модуль формы ниже вызывает только свой серверный общий модуль; на клиент возвращается текст, не объекты анализа.

  4. Таблица событий имеет Корзина/Товар. Четыре own-basket-1…4 содержат A+B, пятая только A, шестая только C: десять строк событий, шесть объектов, три различных вымышленных товара. Это не продажи, документы или рабочий справочник.

  5. Корзина — Объект, Товар — Элемент; обе колонки дискретные. ТипИсточникаДанных=Событийный. МинимальныйПроцентСлучаев=25 исключает одиночный C из частых сочетаний. МинимальнаяДостоверность/МинимальнаяЗначимость=0 специально не вводят дополнительный порог этих показателей в маленьком учебном опыте.

  6. ПоискПоИерархии=Ложь, ИгнорироватьНезаполненныеЗначения=Истина, ТипОтсеченияПравил=Избыточные. Числовые значения как товары не используются; настройки числовой интерпретации не придумываются. Достоверность вывода не переводится в проценты без подтвержденной единицы.

  7. Отдельный прогнозный источник создается заново: own-future-A содержит только A, own-future-C только C. Готовых следствий и вероятностей в источнике нет; для C отсутствие рекомендации допустимо.

Функция ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    События = СоздатьСвоиКорзины(Ложь);
    Анализатор = Новый АнализДанных;
    Анализатор.ТипАнализа = Тип("АнализДанныхПоискАссоциаций");
    Анализатор.ИсточникДанных = События;
    НастроитьСвоиРолиКорзины(Анализатор.НастройкаКолонок);
    НастроитьСвойПараметр(Анализатор.Параметры, "ТипИсточникаДанных", ТипИсточникаДанныхПоискаАссоциаций.Событийный);
    НастроитьСвойПараметр(Анализатор.Параметры, "МинимальныйПроцентСлучаев", 25);
    НастроитьСвойПараметр(Анализатор.Параметры, "МинимальнаяДостоверность", 0);
    НастроитьСвойПараметр(Анализатор.Параметры, "МинимальнаяЗначимость", 0);
    НастроитьСвойПараметр(Анализатор.Параметры, "ПоискПоИерархии", Ложь);
    НастроитьСвойПараметр(Анализатор.Параметры, "ИгнорироватьНезаполненныеЗначения", Истина);
    НастроитьСвойПараметр(Анализатор.Параметры, "ТипОтсеченияПравил", ТипОтсеченияПравилАссоциации.Избыточные);
    Результат = Анализатор.Выполнить();
    Если ТипЗнч(Результат) <> Тип("РезультатАнализаДанныхПоискАссоциаций") Или Результат.КоличествоОбъектов <> 6 Тогда
        ВызватьИсключение "Нужен настоящий результат по шести собственным корзинам, не по десяти строкам событий";
    КонецЕсли;
    НастроитьСвоиРолиКорзины(Результат.НастройкаКолонок, Истина);
    ПроверитьСвойПараметр(Результат.Параметры, "ТипИсточникаДанных", ТипИсточникаДанныхПоискаАссоциаций.Событийный);
    ПроверитьСвойПараметр(Результат.Параметры, "МинимальныйПроцентСлучаев", 25);
    ПроверитьСвойПараметр(Результат.Параметры, "МинимальнаяДостоверность", 0);
    Отчет = "СВОИ ВЫМЫШЛЕННЫЕ КОРЗИНЫ, НЕ РЕАЛЬНЫЕ РЕКОМЕНДАЦИИ" + Символы.ПС;
    Отчет = Отчет + "Строк событий=" + Строка(События.Количество()) + "; объектов-корзин=" + Строка(Результат.КоличествоОбъектов)
        + "; элементов по платформе=" + Строка(Результат.КоличествоЭлементов)
        + "; средний размер по платформе=" + Строка(Результат.СреднийРазмерОбъекта) + Символы.ПС;
    Группы = Результат.Группы;
    Если ТипЗнч(Группы) <> Тип("ФиксированныйМассив") Или Группы.Количество() > 128 Тогда
        ВызватьИсключение "Нужны настоящие небольшие группы собственного расчета";
    КонецЕсли;
    Отчет = Отчет + "Найдено групп=" + Строка(Группы.Количество()) + Символы.ПС;
    Для Каждого Группа Из Группы Цикл
        Если ТипЗнч(Группа) <> Тип("АссоциированнаяГруппа") Или Группа.КоличествоСлучаев < 0
            Или Группа.КоличествоСлучаев > 6 Или Группа.ПроцентСлучаев < 0 Или Группа.ПроцентСлучаев > 100 Тогда
            ВызватьИсключение "Некорректные случаи или процент настоящей своей группы";
        КонецЕсли;
        Отчет = Отчет + "Группа " + ОписатьСвойНаборТоваров(Группа.Элементы)
            + "; случаев=" + Строка(Группа.КоличествоСлучаев) + "; процент=" + Строка(Группа.ПроцентСлучаев) + Символы.ПС;
    КонецЦикла;
    Отчет = Отчет + ОписатьСвоиПравила(Результат.Правила);
    Дерево = Результат.ВыгрузитьПравила();
    Отчет = Отчет + ОписатьСвоеДеревоПравил(Дерево);
    Модель = Результат.СоздатьМодельПрогноза();
    Если ТипЗнч(Модель) <> Тип("МодельПрогнозаПоискАссоциаций") Тогда
        ВызватьИсключение "Не создана собственная настоящая модель ассоциаций";
    КонецЕсли;
    Отчет = Отчет + "ПРАВИЛА СОЗДАННОЙ МОДЕЛИ" + Символы.ПС + ОписатьСвоиПравила(Модель.Правила);
    НовыеКорзины = СоздатьСвоиКорзины(Истина);
    Модель.ИсточникДанных = НовыеКорзины;
    Если ТипЗнч(Модель.ИсточникДанных) <> Тип("ТаблицаЗначений") Или Модель.ИсточникДанных.Количество() <> 2 Тогда
        ВызватьИсключение "Нужен отдельный собственный источник двух новых одиночных корзин";
    КонецЕсли;
    Колонки = Модель.Колонки;
    Входы = Модель.НастройкаВходныхКолонок;
    Если ТипЗнч(Колонки) <> Тип("КолонкиМоделиПрогноза") Или ТипЗнч(Входы) <> Тип("НастройкаВходныхКолонокМоделиПрогноза")
        Или Входы.Количество() = 0 Или Входы.Количество() > 2 Тогда
        ВызватьИсключение "Нужны настоящие входные соответствия своей двухколоночной модели";
    КонецЕсли;
    Для Каждого Настройка Из Входы Цикл
        Имя = Настройка.КолонкаМоделиПрогноза.Имя;
        Если Имя <> "Корзина" И Имя <> "Товар" Тогда
            ВызватьИсключение "Модель требует непредусмотренное собственным источником поле " + Имя;
        КонецЕсли;
        СвязатьСвоюВходнуюКолонку(Входы, Колонки, Имя);
    КонецЦикла;
    Отчет = Отчет + ОписатьСвоиКолонки(Колонки);
    ИсточникКорзины = НайтиСвоюКолонку(Колонки, "Корзина", ТипКолонкиМоделиПрогноза.КолонкаИсточникаДанных);
    Следствие = НайтиСвоюКолонку(Колонки, "Следствие", ТипКолонкиМоделиПрогноза.Прогнозируемая);
    Достоверность = НайтиСвоюКолонку(Колонки, "Достоверность", ТипКолонкиМоделиПрогноза.Прогнозируемая);
    Выход = Модель.КолонкиРезультата;
    Если ТипЗнч(Выход) <> Тип("КолонкиРезультатаМоделиПрогноза") Тогда
        ВызватьИсключение "Нужна собственная реальная коллекция выхода ассоциаций";
    КонецЕсли;
    Выход.Очистить();
    КолонкаКорзины = Выход.Добавить(ИсточникКорзины);
    КолонкаКорзины.Имя = "УчебнаяКорзина";
    КолонкаСледствия = Выход.Добавить(Следствие);
    КолонкаСледствия.Имя = "УчебноеСледствие";
    КолонкаДостоверности = Выход.Добавить(Достоверность);
    КолонкаДостоверности.Имя = "УчебнаяДостоверность";
    Прогноз = Модель.Выполнить();
    Если ТипЗнч(Прогноз) <> Тип("ТаблицаЗначений") Или Прогноз.Количество() > 32 Или Прогноз.Колонки.Количество() <> 3 Тогда
        ВызватьИсключение "Нужна настоящая небольшая выходная таблица со своей схемой";
    КонецЕсли;
    Для Каждого Имя Из СтрРазделить("УчебнаяКорзина,УчебноеСледствие,УчебнаяДостоверность", ",") Цикл
        Если Прогноз.Колонки.Найти(Имя) = Неопределено Тогда
            ВызватьИсключение "Нет собственной выходной колонки " + Имя;
        КонецЕсли;
    КонецЦикла;
    Отчет = Отчет + "РЕКОМЕНДАЦИИ ПО ДВУМ НОВЫМ КОРЗИНАМ; строк=" + Строка(Прогноз.Количество()) + Символы.ПС;
    Для Каждого СтрокаПрогноза Из Прогноз Цикл
        Код = СтрокаПрогноза.УчебнаяКорзина;
        Если ТипЗнч(Код) <> Тип("Строка") Или НовыеКорзины.Найти(Код, "Корзина") = Неопределено Тогда
            ВызватьИсключение "Результат содержит чужую корзину";
        КонецЕсли;
        ЗначениеСледствия = СтрокаПрогноза.УчебноеСледствие;
        Если ТипЗнч(ЗначениеСледствия) = Тип("ОбъектАнализаДанных") Тогда
            ОписаниеСледствия = ОписатьСвойТовар(ЗначениеСледствия);
        Иначе
            ОписаниеСледствия = Строка(ЗначениеСледствия);
        КонецЕсли;
        Отчет = Отчет + Код + "; следствие=" + ОписаниеСледствия + "; тип следствия=" + Строка(ТипЗнч(ЗначениеСледствия))
            + "; достоверность как вернула платформа=" + Строка(СтрокаПрогноза.УчебнаяДостоверность)
            + "; тип достоверности=" + Строка(ТипЗнч(СтрокаПрогноза.УчебнаяДостоверность)) + Символы.ПС;
    КонецЦикла;
    Если События.Количество() <> 10 Или НовыеКорзины.Количество() <> 2 Тогда
        ВызватьИсключение "Изменились свои независимые таблицы памяти";
    КонецЕсли;
    Возврат Отчет + "Для C связь с другим товаром не заложена; отсутствие рекомендации допустимо. Не ожидается ровно две строки выхода";
КонецФункции

Функция СоздатьСвоиКорзины(ДляПрогноза)
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Корзина", Новый ОписаниеТипов("Строка"));
    Таблица.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
    Если ДляПрогноза Тогда
        ДобавитьСвойТовар(Таблица, "own-future-A", "A");
        ДобавитьСвойТовар(Таблица, "own-future-C", "C");
        Ожидается = 2;
    Иначе
        Для Номер = 1 По 4 Цикл
            Код = "own-basket-" + Строка(Номер);
            ДобавитьСвойТовар(Таблица, Код, "A");
            ДобавитьСвойТовар(Таблица, Код, "B");
        КонецЦикла;
        ДобавитьСвойТовар(Таблица, "own-basket-5", "A");
        ДобавитьСвойТовар(Таблица, "own-basket-6", "C");
        Ожидается = 10;
    КонецЕсли;
    Если Таблица.Количество() <> Ожидается Или Таблица.Колонки.Количество() <> 2 Тогда
        ВызватьИсключение "Нарушен размер собственного списка событий";
    КонецЕсли;
    Возврат Таблица;
КонецФункции

Процедура ДобавитьСвойТовар(Таблица, Код, Товар)
    СтрокаКорзины = Таблица.Добавить();
    СтрокаКорзины.Корзина = Код;
    СтрокаКорзины.Товар = Товар;
КонецПроцедуры

Процедура НастроитьСвоиРолиКорзины(Настройки, ТолькоПроверка = Ложь)
    Если ТипЗнч(Настройки) <> Тип("КолонкиАнализаДанных") Или Настройки.Количество() <> 2 Тогда
        ВызватьИсключение "Нужны две настоящие настройки Корзина и Товар";
    КонецЕсли;
    Корзина = Настройки.Найти("Корзина");
    Товар = Настройки.Найти("Товар");
    Если Корзина = Неопределено Или Товар = Неопределено Тогда
        ВызватьИсключение "Нет собственных настроек объект/элемент";
    КонецЕсли;
    Если Не ТолькоПроверка Тогда
        Корзина.ТипКолонки = ТипКолонкиАнализаДанныхПоискАссоциаций.Объект;
        Корзина.ВидДанных = ВидДанныхАнализа.Дискретные;
        Товар.ТипКолонки = ТипКолонкиАнализаДанныхПоискАссоциаций.Элемент;
        Товар.ВидДанных = ВидДанныхАнализа.Дискретные;
    КонецЕсли;
    Если Корзина.ТипКолонки <> ТипКолонкиАнализаДанныхПоискАссоциаций.Объект Или Товар.ТипКолонки <> ТипКолонкиАнализаДанныхПоискАссоциаций.Элемент
        Или Корзина.ВидДанных <> ВидДанныхАнализа.Дискретные Или Товар.ВидДанных <> ВидДанныхАнализа.Дискретные Тогда
        ВызватьИсключение "Перепутаны собственная корзина и товар события";
    КонецЕсли;
КонецПроцедуры

Функция ОписатьСвойТовар(Объект)
    Если ТипЗнч(Объект) <> Тип("ОбъектАнализаДанных") Тогда
        ВызватьИсключение "Нужен настоящий объект элемента группы или правила";
    КонецЕсли;
    Свойства = Новый Структура("Товар", Неопределено);
    ЗаполнитьЗначенияСвойств(Свойства, Объект);
    Описание = Свойства.Товар;
    Если ТипЗнч(Описание) <> Тип("СвойствоОбъектаАнализаДанных") Или Описание.Имя <> "Товар"
        Или Описание.ВидСравнения <> ВидСравнения.Равно Или ТипЗнч(Описание.Значение) <> Тип("Строка")
        Или (Описание.Значение <> "A" И Описание.Значение <> "B" И Описание.Значение <> "C") Тогда
        ВызватьИсключение "Элемент не описывает один из трех собственных товаров";
    КонецЕсли;
    Возврат Описание.Значение;
КонецФункции

Функция ОписатьСвойНаборТоваров(Элементы)
    Если ТипЗнч(Элементы) <> Тип("ФиксированныйМассив") Или Элементы.Количество() > 3 Тогда
        ВызватьИсключение "Нужен настоящий небольшой набор своих объектов анализа";
    КонецЕсли;
    Имена = Новый Массив;
    Для Каждого Элемент Из Элементы Цикл
        Имена.Добавить(ОписатьСвойТовар(Элемент));
    КонецЦикла;
    Возврат "[" + СтрСоединить(Имена, ", ") + "]";
КонецФункции

Функция ОписатьСвоиПравила(Правила)
    Если ТипЗнч(Правила) <> Тип("ФиксированныйМассив") Или Правила.Количество() > 128 Тогда
        ВызватьИсключение "Нужен настоящий небольшой набор своих правил";
    КонецЕсли;
    Отчет = "Найдено правил=" + Строка(Правила.Количество()) + Символы.ПС;
    Для Каждого Правило Из Правила Цикл
        Если ТипЗнч(Правило) <> Тип("ПравилоАссоциации") Или Правило.КоличествоСлучаев < 0 Или Правило.КоличествоСлучаев > 6
            Или Правило.ПроцентСлучаев < 0 Или Правило.ПроцентСлучаев > 100 Тогда
            ВызватьИсключение "Нужны настоящие правила по своим шести корзинам";
        КонецЕсли;
        Отчет = Отчет + "ЕСЛИ " + ОписатьСвойНаборТоваров(Правило.Предпосылка) + " ТО " + ОписатьСвойНаборТоваров(Правило.Следствие)
            + "; случаев=" + Строка(Правило.КоличествоСлучаев) + "; процент=" + Строка(Правило.ПроцентСлучаев)
            + "; достоверность=" + Строка(Правило.Достоверность) + "; значимость=" + Строка(Правило.Значимость) + Символы.ПС;
    КонецЦикла;
    Возврат Отчет;
КонецФункции

Функция ОписатьСвоеДеревоПравил(Дерево)
    Если ТипЗнч(Дерево) <> Тип("ДеревоЗначений") Или Дерево.Строки.Количество() > 128 Или Дерево.Колонки.Количество() > 32 Тогда
        ВызватьИсключение "Нужна настоящая небольшая выгрузка правил в дерево";
    КонецЕсли;
    Отчет = "ВЫГРУЗКА ПРАВИЛ: корневых строк=" + Строка(Дерево.Строки.Количество()) + Символы.ПС;
    Для Каждого Колонка Из Дерево.Колонки Цикл
        Отчет = Отчет + "Колонка выгрузки=" + Колонка.Имя + Символы.ПС;
    КонецЦикла;
    Для Каждого СтрокаДерева Из Дерево.Строки Цикл
        Для Каждого Колонка Из Дерево.Колонки Цикл
            Отчет = Отчет + Колонка.Имя + "=" + Строка(СтрокаДерева[Колонка.Имя]) + "; ";
        КонецЦикла;
        Отчет = Отчет + "дочерних строк=" + Строка(СтрокаДерева.Строки.Количество()) + Символы.ПС;
    КонецЦикла;
    Возврат Отчет;
КонецФункции

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

Процедура НастроитьСвойПараметр(Параметры, Имя, Значение)
    Параметр = НайтиСвойПараметр(Параметры, Имя);
    Если Не Параметр.ТипЗначения.СодержитТип(ТипЗнч(Значение)) Тогда
        ВызватьИсключение "Тип значения не разрешен реальным параметром " + Имя;
    КонецЕсли;
    Параметр.Значение = Значение;
    ПроверитьСвойПараметр(Параметры, Имя, Значение);
КонецПроцедуры

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

Функция НайтиСвоюКолонку(Колонки, Имя, Вид)
    Колонка = Колонки.Найти(Имя, Вид);
    Если Колонка = Неопределено Или ТипЗнч(Колонка) <> Тип("КолонкаМоделиПрогноза") Тогда
        ВызватьИсключение "Нет настоящей колонки модели: " + Имя + "; вид=" + Строка(Вид);
    КонецЕсли;
    Если Колонка.Имя <> Имя Или Колонка.ТипКолонки <> Вид Тогда
        ВызватьИсключение "Найдена колонка с другим именем или ролью";
    КонецЕсли;
    Индекс = Колонки.Индекс(Колонка);
    Если Индекс < 0 Или Индекс >= Колонки.Количество() Тогда
        ВызватьИсключение "Индекс найденной колонки вне реальной коллекции";
    КонецЕсли;
    ПоИндексу = Колонки.Получить(Индекс);
    Если ПоИндексу.Имя <> Имя Тогда
        ВызватьИсключение "По индексу получено другое имя колонки";
    КонецЕсли;
    Возврат Колонка;
КонецФункции

Функция ОписатьСвоиКолонки(Колонки)
    Стек = Новый Массив;
    Для Каждого Колонка Из Колонки Цикл
        Стек.Добавить(Новый Структура("Колонка,Уровень", Колонка, 0));
    КонецЦикла;
    Обработано = 0;
    Отчет = "ДЕЙСТВИТЕЛЬНАЯ ИЕРАРХИЯ КОЛОНОК" + Символы.ПС;
    Пока Стек.Количество() > 0 Цикл
        Индекс = Стек.Количество() - 1;
        Кадр = Стек[Индекс];
        Стек.Удалить(Индекс);
        Если Кадр.Уровень > 16 Или Обработано >= 128 Тогда
            ВызватьИсключение "Своя диагностика превысила учебный предел 128 колонок или 16 уровней";
        КонецЕсли;
        Колонка = Кадр.Колонка;
        Если ТипЗнч(Колонка) <> Тип("КолонкаМоделиПрогноза") Тогда
            ВызватьИсключение "В иерархии нет настоящего описания колонки";
        КонецЕсли;
        Обработано = Обработано + 1;
        Отчет = Отчет + "Уровень=" + Строка(Кадр.Уровень) + "; имя=" + Колонка.Имя
            + "; путь=" + Колонка.ПутьКДанным + "; роль=" + Строка(Колонка.ТипКолонки)
            + "; тип дополнительных параметров=" + Строка(ТипЗнч(Колонка.ДополнительныеПараметры)) + Символы.ПС;
        Дети = Колонка.Колонки;
        Если ТипЗнч(Дети) <> Тип("ФиксированныйМассив") Тогда
            ВызватьИсключение "Вложенные описания должны быть настоящим фиксированным массивом";
        КонецЕсли;
        Для Каждого Дочерняя Из Дети Цикл
            Стек.Добавить(Новый Структура("Колонка,Уровень", Дочерняя, Кадр.Уровень + 1));
        КонецЦикла;
    КонецЦикла;
    Возврат Отчет;
КонецФункции

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

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры
УчебныеСвоиАссоциации85.Обработка.Форма

Собственная внешняя обработка → управляемая Форма → Модуль

Полный клиент-серверный модуль своей формы; клиент получает только текст серверного расчета.

&НаКлиенте
Процедура Выполнить(Команда)
    Отчет = ВыполнитьНаСервере();
    Сообщить(Отчет);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
    Возврат УчебныеСвоиАссоциации85.ВыполнитьПример();
КонецФункции

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

  1. Собственный guard проверяет пустую конфигурацию до алгоритма. СоздатьСвоиКорзины строит типизированные таблицы только в памяти. Один объект-корзина состоит из нескольких событий: десять строк не означают десять транзакций.

  2. АнализДанных.ТипАнализа получает настоящий Тип("АнализДанныхПоискАссоциаций"). Роли Объект/Элемент и виды данных задаются реальным настройкам колонок. Параметры ищутся по установленным native-именам, тип значения проверяется до присваивания; ключевые настройки результата перечитываются.

  3. КоличествоОбъектов сопоставляется с шестью своими корзинами, КоличествоЭлементов и СреднийРазмерОбъекта выводятся фактически. В исходной таблице различны количество событий 10 и число товаров 3; неоднозначное слово «элементы» в короткой справке не заменяет проверку реального результата.

  4. Группы содержат настоящие АссоциированнаяГруппа. КоличествоСлучаев — число корзин, где группа встречается, а ПроцентСлучаев — процент. Элементы — фиксированный массив ОбъектАнализаДанных, не список готовых строк товара.

  5. ОписатьСвойТовар копирует пересечение имен в свою структуру и разбирает настоящее динамическое свойство Товар как СвойствоОбъектаАнализаДанных. Проверяются имя, сравнение Равно, строка и один из A/B/C. Объект источника readonly и не меняется.

  6. ПравилоАссоциации разделяет Предпосылка (ЕСЛИ) и Следствие (ТО); обе части — массивы объектов анализа. КоличествоСлучаев/ПроцентСлучаев показывают поддержку, Достоверность — условную вероятность, Значимость — отдельную native-характеристику. Последние два числа выводятся как вернула платформа, не объявляются автоматически процентами.

  7. ВыгрузитьПравила возвращает реальное ДеревоЗначений. Урок показывает действительные имена его колонок, значения корневых строк и количество детей, не угадывает схему выгрузки. Это текстовая диагностика дерева, не показ GUI и не запись файла.

  8. СоздатьМодельПрогноза вызывается у настоящего своего результата. Модель.Правила также разбирается тем же полным помощником; источник прогноза — отдельные новые корзины, не обучающая таблица.

  9. Существующие входные соответствия модели обходятся фактически. Допустимы только собственные Корзина/Товар; каждое реальное имя связывается с настоящими колонками Входная/КолонкаИсточникаДанных. Не создаем произвольную настройку или ожидаем безусловно два входа.

  10. Native-модель описывает прогнозируемые колонки Следствие и Достоверность. Их реальные дескрипторы и колонка источника Корзина добавляются в собственный выход: УчебнаяКорзина, УчебноеСледствие, УчебнаяДостоверность. Иерархия и пути выводятся фактически.

  11. Модель.Выполнить вызывается после настройки. Таблица выхода может иметь ноль, одну или несколько строк на собственную корзину: по правилам рекомендации отсутствуют или множественны. Не требуем одну строку на событие и не запрещаем повторный код корзины. Проверяем принадлежность каждого кода своему входу и свою схему колонок.

  12. Следствие разбирается как ОбъектАнализаДанных только при фактическом таком типе; иначе выводится значение и его реальный тип. Короткая модельная справка не объявляет точный тип ячейки. Достоверность также выводится с типом и без выдуманного коэффициента 100. Никаких заранее назначенных B или чисел вероятности нет.

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

  1. Будущий положительный опыт: отчет должен подтвердить шесть объектов и десять событий, реальные роли/параметры, найденные группы/правила, actual-дерево и actual-прогноз по двум новым кодам. Количество правил, порядок и строки рекомендаций не фиксируются статическими тестами.

  2. Ручной эталон собственной таблицы, не результат 1С: A встречается в 5 из 6 корзин, B в 4 из 6, C в 1 из 6, пара A+B в 4 из 6. Для направления A→B условная доля 4/5, для B→A 4/4. Это разные знаменатели; отсечение может убрать часть правил из конечного вывода.

  3. Будущий отрицательный контроль ролей: только присваивание Корзина.ТипКолонки заменить с Объект на Элемент. Независимая проверка ролей должна остановиться до анализа. Вернуть Объект.

  4. Будущий отрицательный контроль событий: только границу заполнения четырех корзин заменить с 4 на 3. Проверка собственной таблицы должна отвергнуть восемь вместо десяти событий до алгоритма. Вернуть 4.

  5. Будущий отрицательный контроль прогноза: сразу после Прогноз = Модель.Выполнить() временно присвоить Прогноз = Неопределено. Проверка типа должна остановиться до строк; затем вернуть полный исходник.

  6. runtimeVerifiedScenarios=0: 1С, BSL, алгоритм, модель, форма, база и прогноз здесь не запускались. Статические проверки не доказывают состав найденных правил и успешное выполнение native-модели. Все будущие ручные проверки — только собственный отдельный стенд.

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

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

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

  1. Ассоциация — наблюдаемая связь вымышленных товаров, а не причинность и не разрешение навязывать реальные покупки. Качество рекомендаций на реальных данных этим опытом не установлено.

  2. Поддержка пары и достоверность направленного правила имеют разные знаменатели. Число событий/число корзин/число уникальных товаров различны; не использовать один счетчик вместо всех трех.

  3. Нет обещания конкретного числа правил: пороги, отсечение и алгоритм влияют на результат. Пустой прогноз для корзины C допустим; результат не обязан повторять количество строк источника.

  4. У НастройкаВходныхКолонок проверяются реальные полученные имена. Если installed-модель потребует иное имя или роль, урок остановится с диагностикой до прогноза; это место требует будущей ручной проверки, а не заполнения неизвестных параметров.

  5. В native-описании модели не указан точный тип ячейки Следствие. Поэтому он не придумывается: факт типа проверяется, object-ветка разбирает descriptor, остальная ветка показывает значение/тип. Достоверность не масштабируется автоматически.

  6. Readonly свойства результатов, групп, правил и модели не присваиваются. Меняются только разрешенные настройки созданных объектов; источник, дерево и нормализованные карты не выдаются за рабочие данные.

  7. У КолонкиМоделиПрогноза.Получить противоречивый declared-тип; помощник использует только общее Имя возврата. Остальные свойства читаются у настоящего объекта Найти. Нет исправления native-справки на основании догадки.

  8. Нет запросов к конфигурациям пользователя, записей базы, файлов, сети, почты, печати и GUI расчетов. Собственная внешняя форма лишь получает текст своего сервера.

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

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

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

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

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