НаборУзлов.Очистить

Методы · Clear

Очищает набор узлов.

Синтаксис

Очистить()

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

Об.ОбменДанными.Получатели.Очистить();
Полное описание, параметры и ограничения

НаборУзлов.Очистить (NodeSet.Clear)

НаборУзлов (NodeSet)

Очистить (Clear)

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

Синтаксис:
Очистить()
Описание:

Очищает набор узлов.

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

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

Пример:

Об.ОбменДанными.Получатели.Очистить();

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

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

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

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

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

У нового собственного черновика создадим ручной набор A/B, проверим дубликаты, явное заполнение и момент действия автофлага; отправитель задаётся отдельно, без записи и отправки.

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

Полный обычный клиентский общий модуль УчебныеПолучатели85, только толстый клиент. Пульт отдельно ниже; не выполнялся.

Подготовка

  1. Создайте НОВУЮ отдельную файловую базу 8.5.1.1343, конфигурация УчебнаяМаршрутизация85, совместимость НеИспользовать, обычное приложение и толстый клиент. В свойствах корня конфигурации для поддерживаемых режимов запуска выберите Управляемое приложение и обычное приложение, а Основной режим запуска оставьте Обычное приложение: первый выбор делает видимым флаг Клиент (обычное приложение) общего модуля, второй определяет запуск нашего обычного Пульта. Не используйте рабочую УТ/КА/УНФ/БП. Стенд, UI и код здесь не запускались: runtimeVerifiedScenarios=0.

  2. План обмена Уч85Узлы: Распределённая информационная база=Нет, Код Строка(10), переменная длина, наименование 100, уникальность кодов включена. Дополнительный реквизит Уч85Ключ Строка(8), Индексировать. Модули менеджера/объекта пустые, расширений, разделителей, фонового обмена и других сеансов нет.

  3. Справочник Уч85Черновики: неиерархический, код Строка(10), наименование 100, без дополнительных реквизитов и обработчиков. В состав Уч85Узлы включите ТОЛЬКО этот справочник; АвтоРегистрация для него Разрешить. Других планов обмена в стенде нет. Элементы справочника не создавайте и не переносите из рабочих баз.

  4. В стандартном списке своего плана вручную подготовьте ровно три узла. Уже созданному текущему узлу базы задайте Код=00, Наименование=Учебная локальная база, Уч85Ключ=L. Создайте свои A: Код=10, Наименование=Учебный получатель A, ключ A; B: Код=20, Наименование=Учебный получатель B, ключ B. Сохраните только эту собственную подготовку, не выполняйте обмен. Все узлы без пометки удаления, номера сообщений ещё не изменялись.

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

  6. Обработка УчебныеПолучатели85 → обычная основная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие. Полный модуль формы дан отдельно. F7 и обновление только собственного стенда; откройте Пульт толстого клиента.

  7. Код читает свои заранее сохранённые узлы; изменения имени полученного объекта и настройки нового черновика остаются в памяти. Нет Записать, регистрации/удаления изменений, создания сообщения, транзакций, сети, файлов и печати. Окна узлов урок формы не открывает.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойКонтекст();
    Свои = ПолучитьСвоюПодготовку();
    Черновик = Справочники.Уч85Черновики.СоздатьЭлемент();
    Черновик.Наименование = "Учебный черновик маршрута — не записывать";
    Параметры = Черновик.ОбменДанными;
    Получатели = Параметры.Получатели;
    Если ТипЗнч(Получатели) <> Тип("НаборУзлов") Тогда
        ВызватьИсключение "Получатели — настоящий набор узлов плана, не массив и не XML DOM";
    КонецЕсли;
    Получатели.АвтоЗаполнение = Ложь;
    Получатели.Очистить();
    Если Получатели.АвтоЗаполнение Или Получатели.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен явный ручной режим собственной пустой коллекции";
    КонецЕсли;
    Получатели.Добавить(Свои.A);
    Получатели.Добавить(Свои.B);
    Получатели.Добавить(Свои.A);
    Если Получатели.Количество() <> 2 Или Не Получатели.Содержит(Свои.A) Или Не Получатели.Содержит(Свои.B) Тогда
        ВызватьИсключение "Повторное Добавить A не должно создать третий элемент";
    КонецЕсли;
    Получатели.Удалить(Свои.A);
    Если Получатели.Количество() <> 1 Или Получатели.Содержит(Свои.A) Или Не Получатели.Содержит(Свои.B) Тогда
        ВызватьИсключение "Удалить принимает ссылку на A и оставляет только B";
    КонецЕсли;
    Получатели.Очистить();
    Если Получатели.Количество() <> 0 Тогда
        ВызватьИсключение "Очистка касается только получателей собственного черновика";
    КонецЕсли;
    Получатели.Заполнить();
    Если Не Получатели.Содержит(Свои.A) Или Не Получатели.Содержит(Свои.B) Тогда
        ВызватьИсключение "Явное Заполнить должно включить собственные подготовленные удалённые A/B";
    КонецЕсли;
    ЧислоПриОбходе = 0;
    Для Каждого Узел Из Получатели Цикл
        Если Узел <> Свои.A И Узел <> Свои.B И Узел <> Свои.L Тогда
            ВызватьИсключение "Получатель не принадлежит единственному собственному плану";
        КонецЕсли;
        ЧислоПриОбходе = ЧислоПриОбходе + 1;
    КонецЦикла;
    Если ЧислоПриОбходе <> Получатели.Количество() Тогда
        ВызватьИсключение "Количество и реальный обход получателей должны совпасть";
    КонецЕсли;
    Сообщить(СтрШаблон("Явное Заполнить при АвтоЗаполнение=Ложь: %1 получателей; текущий L присутствует=%2. Порядок и включение L не зашиты.",
        Получатели.Количество(), Получатели.Содержит(Свои.L)));
    НачальныйОтправитель = Параметры.Отправитель;
    Если НачальныйОтправитель <> Неопределено Тогда
        ВызватьИсключение "Нужен свежий собственный черновик без уже назначенного отправителя";
    КонецЕсли;
    Параметры.Отправитель = Свои.A;
    Если Параметры.Отправитель <> Свои.A Тогда
        ВызватьИсключение "Отправитель задаётся настоящей ссылкой на собственный A";
    КонецЕсли;
    Получатели.Очистить();
    Получатели.Добавить(Свои.B);
    Получатели.АвтоЗаполнение = Истина;
    Если Не Получатели.АвтоЗаполнение Или Получатели.Количество() <> 1 Или Не Получатели.Содержит(Свои.B) Тогда
        ВызватьИсключение "Включение флага не является выполненным ПередЗаписью или немедленной отправкой";
    КонецЕсли;
    Получатели.АвтоЗаполнение = Ложь;
    Параметры.Отправитель = НачальныйОтправитель;
    Если Получатели.АвтоЗаполнение Или Параметры.Отправитель <> Неопределено Тогда
        ВызватьИсключение "Свой черновик возвращён в ручной режим без отправителя";
    КонецЕсли;
    Сообщить("Остался ручной маршрут B в незаписанном черновике. Отправитель A проверен и сброшен. Изменения не зарегистрированы, обмен не запускался.");
КонецПроцедуры

Процедура ПроверитьСвойКонтекст()
    Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
        ВызватьИсключение "Нужен собственный стенд УчебнаяМаршрутизация85 платформы 8.5.1.1343";
    КонецЕсли;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
    КонецЕсли;
КонецПроцедуры

Функция ПолучитьСвоюПодготовку()
    Менеджер = ПланыОбмена.Уч85Узлы;
    Если Метаданные.ПланыОбмена.Количество() <> 1 Тогда
        ВызватьИсключение "В новом стенде должен быть только собственный Уч85Узлы";
    КонецЕсли;
    Состав = Метаданные.ПланыОбмена.Уч85Узлы.Состав;
    ЭлементСостава = Состав.Найти(Метаданные.Справочники.Уч85Черновики);
    Если Состав.Количество() <> 1 Или ЭлементСостава = Неопределено Тогда
        ВызватьИсключение "В составе своего плана должен быть только Уч85Черновики";
    КонецЕсли;
    Если ЭлементСостава.АвтоРегистрация <> АвтоРегистрацияИзменений.Разрешить Тогда
        ВызватьИсключение "Для собственной проверки Заполнить требуется разрешённая авторегистрация";
    КонецЕсли;
    Текущий = Менеджер.ЭтотУзел();
    A = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "A");
    B = Менеджер.НайтиПоРеквизиту("Уч85Ключ", "B");
    Если Текущий.Пустая() Или A.Пустая() Или B.Пустая() Или A = B Или A = Текущий Или B = Текущий Тогда
        ВызватьИсключение "Нужны три разные настоящие ссылки своего плана";
    КонецЕсли;
    Если Текущий.Уч85Ключ <> "L" Или Текущий.Код <> "00" Или Текущий.Наименование <> "Учебная локальная база"
        Или A.Код <> "10" Или A.Наименование <> "Учебный получатель A"
        Или B.Код <> "20" Или B.Наименование <> "Учебный получатель B" Тогда
        ВызватьИсключение "Не совпала собственная подготовка узлов L,A,B";
    КонецЕсли;
    Выборка = Менеджер.Выбрать();
    Ссылки = Новый Массив;
    Пока Выборка.Следующий() Цикл
        Если Выборка.ПометкаУдаления Или (Выборка.Ссылка <> Текущий И Выборка.Ссылка <> A И Выборка.Ссылка <> B)
            Или Ссылки.Найти(Выборка.Ссылка) <> Неопределено Тогда
            ВызватьИсключение "Лишний, помеченный или повторный узел нового стенда";
        КонецЕсли;
        Ссылки.Добавить(Выборка.Ссылка);
    КонецЦикла;
    Если Ссылки.Количество() <> 3 Тогда
        ВызватьИсключение "В своём плане должны существовать только L,A,B";
    КонецЕсли;
    Возврат Новый Структура("Менеджер,L,A,B", Менеджер, Текущий, A, B);
КонецФункции
УчебныеПолучатели85.Пульт

УчебнаяМаршрутизация85 → Обработки → УчебныеПолучатели85 → Формы → Пульт → Модуль

Полный модуль собственной обычной формы, не выполнялся.

Процедура ВыполнитьНажатие(Кнопка)
    УчебныеПолучатели85.ВыполнитьПример();
КонецПроцедуры

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

  1. ЭтотУзел возвращает предопределённую ссылку именно своей базы. Она проверяется как L и отличается от своих сохранённых A/B; текущий узел не выдумывается новым UUID и не объявляется главным узлом РИБ.

  2. Проверяем состав единственного собственного плана и АвтоРегистрация=Разрешить у Уч85Черновики. СоздатьЭлемент создаёт настоящий новый объект справочника в памяти, но по справке не записывает его в базу.

  3. ОбменДанными и Получатели readonly-свойства: получаем настоящий изменяемый НаборУзлов, не переприсваиваем свойства и не вызываем несуществующий конструктор набора. Этот НаборУзлов относится к планам обмена, не к XML DOM.

  4. АвтоЗаполнение=Ложь выключает будущее автоматическое заполнение перед ПередЗаписью. Сначала очищаем только набор своего нового объекта; Добавить A/B/A даёт два получателя, потому что повтор не добавляется.

  5. Содержит проверяет вхождение настоящей ссылки. Удалить принимает ссылку A, не индекс 0; после удаления остаётся B. Очистить затем даёт ноль, не удаляя сами узлы плана.

  6. Явный Заполнить вызывается даже при АвтоЗаполнение=Ложь. Он использует узлы планов с авторегистрацией для этого объекта; проверяем свои A/B, допустимость всех ссылок и совпадение размера с реальным обходом. Наличие L и порядок не зашиваются — сообщаем фактическое состояние.

  7. Отправитель=ссылка A обозначает источник полученного изменения, а не клиентское приложение/логин. По справке при будущей записи это исключает обратную регистрацию отправителю. Здесь записи нет, поэтому исключение регистрации не выдаётся за испытанный результат.

  8. После явной ручной настройки только B ставим АвтоЗаполнение=Истина. Само присваивание не является вызовом ПередЗаписью или отправкой: состав ещё один B. Затем выключаем автофлаг и возвращаем прежний Неопределено у свежего отправителя.

  9. В конце существует только свой незаписанный черновик с ручным получателем B. Нет ЗарегистрироватьИзменения, сообщений обмена, соединений или удаления регистраций; закрытие Пульта не сохраняет этот локальный объект.

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

  1. Будущий тест: F7 → свой Пульт → Выполнить. Ручная последовательность размеров: 0, 2 после A/B/A, 1 после удаления A, 0 после очистки.

  2. Явное Заполнить при выключенном автофлаге должно включить подготовленные A/B; размер и присутствие L выводятся фактически, порядок не предполагается.

  3. Присваивание Отправитель=A возвращает именно свою ссылку A; после опыта снова Неопределено. Не проверяйте реальную регистрацию записью объекта в этом уроке.

  4. При включении автофлага ручной набор ещё содержит один B. Автоматический вызов перед записью не происходил, немедленная отправка не ожидается.

  5. Повторное нажатие создаёт новый объект и проходит те же контрольные точки. Список своего справочника должен оставаться пустым; здесь реальная база и UI ещё не проверены.

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

Будущий результат: полный жизненный цикл своего набора получателей, проверенные ручной/автофлаг и отправитель; ни записи черновика, ни обмена.

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

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

  2. АвтоЗаполнение управляет автоматическим вызовом Заполнить перед обработчиком ПередЗаписью. Ложь не запрещает явный вызов Заполнить, Истина не запускает сеть.

  3. В состав объекта могут входить несколько планов. Здесь намеренно один собственный план с одним собственным каталогом; чужая конфигурация этим стендом не моделируется.

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

  5. ЭтотУзел не равен ГлавныйУзел РИБ. План здесь не РИБ; текущая база и источник полученного сообщения также разные понятия.

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

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

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

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

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