ПланОбменаСписок.<Имя плана обмена>

Типы · <Exchange plan name>

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

Полное описание, параметры и ограничения

ПланОбменаСписок.<Имя плана обмена> (ExchangePlanList.<Exchange plan name>)

ПланОбменаСписок.<Имя плана обмена> (ExchangePlanList.<Exchange plan name>)

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

Свойства:
Колонки (Columns)
Отбор (Filter)
Порядок (Order)

Методы:
Обновить (Refresh)

Описание:

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

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

Сервер, толстый клиент, внешнее соединение.

См. также:
ПланОбменаСписок.<Имя плана обмена>, свойство Отбор

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

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

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

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

Список своих узлов: фильтр, порядок и два профиля интерфейса без обмена

На настоящих L/A/B покажем источник ПланОбменаСписок и расширение поля: только B, обратный порядок, доступность настроек и автообновление без отправки сообщений.

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

Полный модуль собственной обычной формы УчебнаяМаршрутизация85 → Обработки → УчебныйСписокУзлов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. Опыт читает собственные L/A/B и открывает только новое своё окно. Запись, обмен, создание сообщений, регистрация/удаление изменений, файлы, сеть и печать не вызываются. Автообновление — только перечитывание локального списка.

  8. Обработка УчебныйСписокУзлов85 → обычная основная форма Список. Реквизит СписокРасчетов типа ПланОбменаСписок.Уч85Узлы; это имя реквизита для общей структуры опыта, не список расчётов. Поле Виды связано именно с этим источником, визуальные колонки Код/Наименование/Уч85Ключ с одноимёнными полями. ТолькоПросмотр=Да, команд записи/добавления/удаления нет.

  9. Кнопки ТолькоУзелB, ВсеПоУбыванию, Восстановить, Фиксированный, Настраиваемый, АвтоОбновление, Закрыть; назначьте одноимённые действия *Нажатие и событие ПриОткрытии. Оставьте стандартный диалог настройки списка в контекстном меню поля. Основной блок вставьте в форму списка, общий модуль запуска и Пульт отдельно.

Перем Подготовлено;

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

Процедура ПриОткрытии()
    Если Подготовлено <> Истина Тогда
        ВызватьИсключение "Открывайте этот список через собственный Пульт после подготовки";
    КонецЕсли;
    СписокРасчетов.Обновить();
    Сообщить("Проверьте три строки: 00/L, 10/A, 20/B. Порядок задан источнику, не массиву строк.");
КонецПроцедуры

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

Процедура ТолькоУзелBНажатие(Кнопка)
    ПроверитьСвойОткрытыйСписок();
    СписокРасчетов.Отбор.Сбросить();
    СписокРасчетов.Отбор.Уч85Ключ.Установить("B", Истина);
    СписокРасчетов.Обновить();
    Сообщить("Проверьте одну строку: код 20, Учебный получатель B, ключ B. L и A скрыты, но не удалены.");
КонецПроцедуры

Процедура ВсеПоУбываниюНажатие(Кнопка)
    ПроверитьСвойОткрытыйСписок();
    СписокРасчетов.Отбор.Сбросить();
    СписокРасчетов.Порядок.Установить("Код Убыв");
    СписокРасчетов.Обновить();
    Сообщить("Проверьте порядок трёх строк: 20/B, 10/A, 00/L. В базе те же записи.");
КонецПроцедуры

Процедура ВосстановитьНажатие(Кнопка)
    ПроверитьСвойОткрытыйСписок();
    СписокРасчетов.Отбор.Сбросить();
    СписокРасчетов.Порядок.Установить("Код Возр");
    СписокРасчетов.Обновить();
    Сообщить("Проверьте исходные 00/L, 10/A, 20/B. Обновить перечитал базу, не записывал её.");
КонецПроцедуры

Процедура ЗакрытьНажатие(Кнопка)
    ПроверитьСвойОткрытыйСписок();
    ЭлементыФормы.Виды.АвтоОбновление = Ложь;
    ЭтаФорма.Закрыть();
КонецПроцедуры

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

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

Процедура НастраиваемыйНажатие(Кнопка)
    ПроверитьСвойОткрытыйСписок();
    НастроитьПоле(Истина);
    Сообщить("Откройте стандартный диалог настройки списка: отбор по ключу, порядок кода и настройки автообновления доступны. Запись строк по-прежнему запрещена настройкой ТолькоПросмотр.");
КонецПроцедуры

Процедура ФиксированныйНажатие(Кнопка)
    ПроверитьСвойОткрытыйСписок();
    НастроитьПоле(Ложь);
    ВосстановитьНажатие(Неопределено);
    Сообщить("Фиксированный профиль восстановлен. Программный отбор кнопкой ТолькоУзелB работает независимо от запрета его интерактивного изменения.");
КонецПроцедуры

Процедура АвтоОбновлениеНажатие(Кнопка)
    ПроверитьСвойОткрытыйСписок();
    Поле = ЭлементыФормы.Виды;
    Поле.ИзменятьАвтоОбновление = Ложь;
    Поле.ПериодАвтоОбновления = 10;
    Поле.АвтоОбновление = Не Поле.АвтоОбновление;
    Сообщить(СтрШаблон("АвтоОбновление=%1, период=%2 секунд, интерактивное изменение=%3",
        Поле.АвтоОбновление, Поле.ПериодАвтоОбновления, Поле.ИзменятьАвтоОбновление));
КонецПроцедуры
УчебныеПолучатели85.Пульт

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

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

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

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

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

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

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

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

  1. Используем настоящие сохранённые записи собственного стенда. Источник списка — реквизит обычной формы, Виды — визуальное поле. Само расширение появляется из типа связанного источника, его не создают через Новый. Здесь используется ПланОбменаСписок.Уч85Узлы с реальными текущим L и своими удалёнными A/B, не новые GUID без записей.

  2. Перед открытием общий модуль проверяет свою конфигурацию/записи, получает новую форму по уникальному ключу и вызывает ПодготовитьДоОткрытия. Код списка, общего модуля и Пульта представлен отдельными полными блоками.

  3. Фиксированный профиль устанавливает ТолькоПросмотр, выключает автообновление, задаёт 10 секунд, ВосстанавливатьТекущуюСтроку=Ложь. Последний флаг относится к позиции при открытии формы, не выполняет поиск строки и не является восстановлением данных базы.

  4. НастройкаОтбора и НастройкаПорядка — readonly коллекции управления UI. Найти может вернуть Неопределено: проверяем собственные Уч85Ключ и Код. Меняем их Доступность, а не заменяем коллекции и не изменяем через них значение фильтра.

  5. При фиксированном профиле интерактивная настройка этих двух полей запрещена, но программная кнопка отбора продолжает работать: СписокРасчетов.Отбор — другой объект. Это демонстрирует отличие политики интерфейса от данных фильтра.

  6. ИзменятьАвтоОбновление и ИзменятьСпособРедактирования управляют доступностью настройки пользователю. Они не запрещают программное присваивание соответствующих свойств и не являются правами на запись.

  7. Настраиваемый профиль включает интерактивные настройки. СпособРедактирования переключается ВДиалоге/ВСписке, но ТолькоПросмотр сохраняется: реальное редактирование/запись в этом опыте не выполняется.

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

  9. Кнопка АвтоОбновление программно включает/выключает перечитывание каждые 10 секунд даже при ИзменятьАвтоОбновление=Ложь. Минимум по справке 5 секунд. При отключённом АвтоОбновление сам по себе период не запускает таймер.

  10. Фиксированный возвращает учебный профиль, отключает таймер и восстанавливает исходный фильтр/порядок источника. Закрыть тоже выключает таймер. Опыт касается только собственного нового окна, не чужих форм или системных пользовательских настроек.

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

  1. Будущий тест: вставить три полных блока в указанные разные модули, назначить события/действия, F7, открыть через Пульт. Сверить реальные строки, не только сообщения. Начальные строки 00/L,10/A,20/B; обратные 20/B,10/A,00/L.

  2. Нажать Фиксированный и открыть стандартный диалог настройки списка: Уч85Ключ и Код недоступны для интерактивного изменения. Программная кнопка ТолькоУзелB показывает одну собственную B.

  3. Нажать Настраиваемый: доступность этих полей и настроек автообновления/режима меняется. Сам список остаётся ТолькоПросмотр; не сохранять и не добавлять строки.

  4. Кнопка АвтоОбновление: проверять выведенные фактические свойства Истина/Ложь и период 10. Ожидание нескольких обновлений — будущий ручной тест; неизменные строки не доказывают работу таймера.

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

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

Обычный список показывает собственные узлы L/A/B и фильтрует B; UI-профили меняют настройки поля. Обмен, регистрация изменений и запись узлов не выполняются.

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

  1. Это обычная форма толстого клиента, не расширение конфигурации и не ДинамическийСписок управляемой формы.

  2. Доступность интерактивного управления не блокирует программные операции. ТолькоПросмотр — политика поля, не система прав доступа к базе.

  3. Не заменяйте readonly НастройкаОтбора/НастройкаПорядка. Их элементы Доступность относятся к UI, а фактический фильтр хранится у источника списка.

  4. ВосстанавливатьТекущуюСтроку здесь осознанно выключен для нового независимого опыта. Урок не доказывает восстановление позиции после повторного открытия.

  5. При ТолькоПросмотр режимы редактирования и проверка новой строки показаны как настройки, не как выполненное редактирование и не как проверенные сообщения платформы.

  6. Автообновление перечитывает базу и создаёт нагрузку, но не делает обмен и не отправляет сообщения. Для настоящего обмена нужны другие API.

  7. Стенд/UI/таймер здесь не выполнялись: runtimeVerifiedScenarios=0. Сообщения ожидаемых строк не заменяют ручную проверку поля.

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

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

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

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

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