ПланОбменаВыборка.<Имя плана обмена>.ПолучитьОбъект

Методы · GetObject

Получает объект для модификации и записи узла, на котором в данный момент спозиционирована выборка.

Синтаксис

ПолучитьОбъект()

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

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

ПланОбменаВыборка.<Имя плана обмена>.ПолучитьОбъект (ExchangePlanSelection.<Exchange plan name>.GetObject)

ПланОбменаВыборка.<Имя плана обмена> (ExchangePlanSelection.<Exchange plan name>)

ПолучитьОбъект (GetObject)

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

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

Получает объект для модификации и записи узла, на котором в данный момент спозиционирована выборка.

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

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

Пример:

Объект = Выборка.ПолучитьОбъект();

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

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

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

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

Прочитать паспорт узлов и не перепутать дату с фактом обмена

Обойдём свои L/A/B, сравним версии, номера и мобильную дату; локально изменённый объект не сохранится. Отдельно проверим поиск, ссылки и быстрый выбор 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. Код читает свои заранее сохранённые узлы; изменения имени полученного объекта и настройки нового черновика остаются в памяти. Нет Записать, регистрации/удаления изменений, создания сообщения, транзакций, сети, файлов и печати. Окна узлов урок формы не открывает.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойКонтекст();
    Свои = ПолучитьСвоюПодготовку();
    Менеджер = Свои.Менеджер;
    Если Менеджер.НайтиПоНаименованию("Учебный получатель B", Истина) <> Свои.B Тогда
        ВызватьИсключение "Точный поиск имени должен дать собственный B";
    КонецЕсли;
    Коды = Новый Структура("L,A,B", "00", "10", "20");
    Имена = Новый Структура("L,A,B", "Учебная локальная база", "Учебный получатель A", "Учебный получатель B");
    Ключи = Новый Массив;
    Выборка = Менеджер.Выбрать(, "Код Возр");
    Пока Выборка.Следующий() Цикл
        Ключ = Выборка.Уч85Ключ;
        ОжидаемыйКод = Неопределено;
        ОжидаемоеИмя = Неопределено;
        Если Не Коды.Свойство(Ключ, ОжидаемыйКод) Или Не Имена.Свойство(Ключ, ОжидаемоеИмя) Тогда
            ВызватьИсключение "Неизвестный собственный ключ выборки";
        КонецЕсли;
        Если Выборка.Код <> ОжидаемыйКод Или Выборка.Наименование <> ОжидаемоеИмя
            Или Выборка.ПометкаУдаления Или Выборка.Ссылка <> Свои[Ключ] Тогда
            ВызватьИсключение "Поля текущей строки должны совпасть с подготовкой";
        КонецЕсли;
        ВерсияДо = Выборка.ВерсияДанных;
        Если ТипЗнч(ВерсияДо) <> Тип("Строка") Или ТипЗнч(Выборка.ДатаОбмена) <> Тип("Дата")
            Или ТипЗнч(Выборка.НомерОтправленного) <> Тип("Число") Или ТипЗнч(Выборка.НомерПринятого) <> Тип("Число") Тогда
            ВызватьИсключение "Версия — строка, мобильная дата — Дата, номера сообщений — Число";
        КонецЕсли;
        Если Выборка.НомерОтправленного <> 0 Или Выборка.НомерПринятого <> 0 Тогда
            ВызватьИсключение "Нужен новый стенд, где сообщения ещё не создавались/не читались";
        КонецЕсли;
        Сообщить(СтрШаблон("Узел %1: отправлено №%2, принято №%3, дата мобильного автономного обмена %4; версия данных %5",
            Ключ, Выборка.НомерОтправленного, Выборка.НомерПринятого, Выборка.ДатаОбмена, ВерсияДо));
        ОбъектУзла = Выборка.ПолучитьОбъект();
        Если ОбъектУзла = Неопределено Тогда
            ВызватьИсключение "Запись узла исчезла; nullable-результат не выдаём за объект";
        КонецЕсли;
        ОбъектУзла.Наименование = "Локальный черновик " + Ключ;
        Повторная = Менеджер.Выбрать(Новый Структура("Уч85Ключ", Ключ));
        Если Не Повторная.Следующий() Тогда
            ВызватьИсключение "Собственная запись исчезла при повторном чтении";
        КонецЕсли;
        Если Повторная.Наименование <> ОжидаемоеИмя Или Повторная.ВерсияДанных <> ВерсияДо Тогда
            ВызватьИсключение "Изменение локального объекта не должно сохранить новое имя/версию узла";
        КонецЕсли;
        Если Повторная.Следующий() Тогда
            ВызватьИсключение "У собственного ключа не должно быть второй записи";
        КонецЕсли;
        ОбъектУзла.Наименование = ОжидаемоеИмя;
        Ключи.Добавить(Ключ);
    КонецЦикла;
    Если СтрСоединить(Ключи, ",") <> "L,A,B" Тогда
        ВызватьИсключение "Явная сортировка по коду должна дать 00,10,20";
    КонецЕсли;
    ИсточникСсылок = Новый Массив;
    ИсточникСсылок.Добавить(Свои.A);
    ИсточникСсылок.Добавить("не ссылка");
    ИсточникСсылок.Добавить(Менеджер.ПустаяСсылка());
    ИсточникСсылок.Добавить(Свои.B);
    ПоСсылкам = Менеджер.ВыбратьПоСсылкам(ИсточникСсылок);
    ПолученныеСсылки = Новый Массив;
    Пока ПоСсылкам.Следующий() Цикл
        Если (ПоСсылкам.Ссылка <> Свои.A И ПоСсылкам.Ссылка <> Свои.B)
            Или ПолученныеСсылки.Найти(ПоСсылкам.Ссылка) <> Неопределено Тогда
            ВызватьИсключение "Источник должен дать только свои A/B без повторов";
        КонецЕсли;
        ПолученныеСсылки.Добавить(ПоСсылкам.Ссылка);
    КонецЦикла;
    Если ПолученныеСсылки.Количество() <> 2 Тогда
        ВызватьИсключение "Нужны обе собственные ссылки A/B; порядок не обещается";
    КонецЕсли;
    Отбор = Новый Структура("Уч85Ключ", "B");
    ПараметрыВыбора = Новый Структура("Отбор,СтрокаПоиска", Отбор, Неопределено);
    ДанныеВыбора = Менеджер.ПолучитьДанныеВыбора(ПараметрыВыбора);
    Если ТипЗнч(ДанныеВыбора) <> Тип("СписокЗначений") Или ДанныеВыбора.Количество() <> 1 Тогда
        ВызватьИсключение "Быстрый выбор по своему индексированному ключу должен дать один B";
    КонецЕсли;
    Если ДанныеВыбора.Получить(0).Значение <> Свои.B Тогда
        ВызватьИсключение "Проверяется значение настоящего элемента списка, не его представление";
    КонецЕсли;
    Сообщить("Паспорт L,A,B прочитан. Новое имя не записано; выбор по ссылкам A/B и быстрый выбор B подтверждены.");
КонецПроцедуры

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

  2. Выбрать(, "Код Возр") явно задаёт плоский порядок 00,10,20. Поля читаются только внутри успешного Следующий; исходная выборка не считается уже стоящей на первом узле.

  3. У каждой строки читаются Код, Наименование, ПометкаУдаления и Ссылка. Сверяем с подготовкой и отличаем current L от удалённых A/B; пустая ссылка и строковый код не заменяют запись.

  4. ВерсияДанных выборки — Строка, не Дата и не ДвоичныеДанные. Сохраняем её как контрольную строку для повторного чтения, не используем как время обмена или номер сообщения.

  5. НомерОтправленного и НомерПринятого — числовые номера сообщений. Для нового стенда оба должны оставаться нулевыми; это не количество объектов к отправке, не список получателей и не доказательство доставки.

  6. ДатаОбмена по справке относится к последнему обмену с мобильным клиентом с автономным режимом. В данном стенде такой обмен не запускался: читаем фактическую Дату, не подменяем её сегодняшней и не обещаем любую дату как универсальное время синхронизации.

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

  8. ВыбратьПоСсылкам получает массив настоящих A/B, заведомый текст и пустую ссылку. Неподходящие/несуществующие значения игнорируются по справке; результат проверяется как множество A/B, не по порядку массива.

  9. ПолучитьДанныеВыбора получает обязательные Отбор и СтрокаПоиска. Неопределено в строке поиска означает быстрый выбор; один собственный ключ B даёт СписокЗначений с одним реальным значением ссылки B, не просто похожим представлением.

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

  1. Будущий тест: F7, Выполнить. Общий обход L,A,B; коды 00,10,20, исходные имена и отсутствие пометки удаления совпадают с собственной подготовкой.

  2. Для нового стенда номера отправленного/принятого сообщений нулевые. Версия строковая, ДатаОбмена имеет тип Дата; непустая дата не объявляется временем произвольного обмена.

  3. После локального изменения имени повторная выборка требует прежние имя и версию. Стандартный список своего плана также должен остаться без новых имён.

  4. По ссылкам приходят ровно A/B. Не требуется порядок A,B; текст и пустая ссылка не превращаются в дополнительные узлы.

  5. Быстрый выбор содержит один элемент, Значение которого равно своей ссылке B. Если включили обработчик менеджера или изменили метаданные, это уже другой контракт — не подставляйте ожидаемый результат.

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

Будущий результат: паспорта собственных узлов, корректное толкование readonly-полей и подтверждённое отсутствие записи локального имени.

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

  1. ДатаОбмена — именно мобильный клиент с автономным режимом, не общая дата последнего РИБ/HTTP/файлового обмена. Вручную переприсваивать readonly-поле нельзя.

  2. Доступ к полям выборки до первого Следующий или после его Ложь не используется. Два значения отбора в Выбрать не добавляются: структура допускает только один элемент.

  3. Поиск при дубликатах может вернуть только один узел. Собственная подготовка проверяет уникальные ключи; этот пример не решает поиск всех совпадений произвольной рабочей базы.

  4. Вызов ПолучитьДанныеВыбора обращается к серверу и вызывает ОбработкаПолученияДанныхВыбора. В стенде прикладных обработчиков нет; запрет всей работы СУБД или всех внутренних сетевых обменов клиента не заявлен.

  5. Нет транзакции/блокировки и защиты от другой сессии. Два чтения подтверждают наблюдаемую неизменность на своём одиночном стенде, не изоляцию конкурентных изменений.

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

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

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

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

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