Предназначен для управления списком узлов, отображаемым в табличном поле.
Полное описание, параметры и ограничения
ПланОбменаСписок.<Имя плана обмена> (ExchangePlanList.<Exchange plan name>)
ПланОбменаСписок.<Имя плана обмена> (ExchangePlanList.<Exchange plan name>)
Доступен, начиная с версии 8.0.
Свойства:
Колонки (Columns)
Отбор (Filter)
Порядок (Order)
Методы:
Обновить (Refresh)
Описание:
Предназначен для управления списком узлов, отображаемым в табличном поле.
Доступность:
Сервер, толстый клиент, внешнее соединение.
См. также:
ПланОбменаСписок.<Имя плана обмена>, свойство Отбор
Использование в версии:
Доступен, начиная с версии 8.0.
Методическая информация
Практические примеры
Список своих узлов: фильтр, порядок и два профиля интерфейса без обмена
На настоящих L/A/B покажем источник ПланОбменаСписок и расширение поля: только B, обратный порядок, доступность настроек и автообновление без отправки сообщений.
Где и как запускать
Полный модуль собственной обычной формы УчебнаяМаршрутизация85 → Обработки → УчебныйСписокУзлов85 → Формы → Список. Общий модуль и Пульт ниже; не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую базу 8.5.1.1343, конфигурация УчебнаяМаршрутизация85, совместимость НеИспользовать, обычное приложение и толстый клиент. В свойствах корня конфигурации для поддерживаемых режимов запуска выберите Управляемое приложение и обычное приложение, а Основной режим запуска оставьте Обычное приложение: первый выбор делает видимым флаг Клиент (обычное приложение) общего модуля, второй определяет запуск нашего обычного Пульта. Не используйте рабочую УТ/КА/УНФ/БП. Стенд, UI и код здесь не запускались: runtimeVerifiedScenarios=0.
План обмена Уч85Узлы: Распределённая информационная база=Нет, Код Строка(10), переменная длина, наименование 100, уникальность кодов включена. Дополнительный реквизит Уч85Ключ Строка(8), Индексировать. Модули менеджера/объекта пустые, расширений, разделителей, фонового обмена и других сеансов нет.
Справочник Уч85Черновики: неиерархический, код Строка(10), наименование 100, без дополнительных реквизитов и обработчиков. В состав Уч85Узлы включите ТОЛЬКО этот справочник; АвтоРегистрация для него Разрешить. Других планов обмена в стенде нет. Элементы справочника не создавайте и не переносите из рабочих баз.
В стандартном списке своего плана вручную подготовьте ровно три узла. Уже созданному текущему узлу базы задайте Код=00, Наименование=Учебная локальная база, Уч85Ключ=L. Создайте свои A: Код=10, Наименование=Учебный получатель A, ключ A; B: Код=20, Наименование=Учебный получатель B, ключ B. Сохраните только эту собственную подготовку, не выполняйте обмен. Все узлы без пометки удаления, номера сообщений ещё не изменялись.
Общий модуль УчебныеПолучатели85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет. Вставьте отдельный полный общий модуль ниже. Основной блок этого урока — модуль формы списка, не общий модуль.
Обработка УчебныеПолучатели85 → обычная основная форма Пульт → кнопка Выполнить → действие ВыполнитьНажатие. Полный модуль формы дан отдельно. F7 и обновление только собственного стенда; откройте Пульт толстого клиента.
Опыт читает собственные L/A/B и открывает только новое своё окно. Запись, обмен, создание сообщений, регистрация/удаление изменений, файлы, сеть и печать не вызываются. Автообновление — только перечитывание локального списка.
Обработка УчебныйСписокУзлов85 → обычная основная форма Список. Реквизит СписокРасчетов типа ПланОбменаСписок.Уч85Узлы; это имя реквизита для общей структуры опыта, не список расчётов. Поле Виды связано именно с этим источником, визуальные колонки Код/Наименование/Уч85Ключ с одноимёнными полями. ТолькоПросмотр=Да, команд записи/добавления/удаления нет.
Кнопки ТолькоУзел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);
КонецФункцииРазбор по шагам
Используем настоящие сохранённые записи собственного стенда. Источник списка — реквизит обычной формы, Виды — визуальное поле. Само расширение появляется из типа связанного источника, его не создают через Новый. Здесь используется ПланОбменаСписок.Уч85Узлы с реальными текущим L и своими удалёнными A/B, не новые GUID без записей.
Перед открытием общий модуль проверяет свою конфигурацию/записи, получает новую форму по уникальному ключу и вызывает ПодготовитьДоОткрытия. Код списка, общего модуля и Пульта представлен отдельными полными блоками.
Фиксированный профиль устанавливает ТолькоПросмотр, выключает автообновление, задаёт 10 секунд, ВосстанавливатьТекущуюСтроку=Ложь. Последний флаг относится к позиции при открытии формы, не выполняет поиск строки и не является восстановлением данных базы.
НастройкаОтбора и НастройкаПорядка — readonly коллекции управления UI. Найти может вернуть Неопределено: проверяем собственные Уч85Ключ и Код. Меняем их Доступность, а не заменяем коллекции и не изменяем через них значение фильтра.
При фиксированном профиле интерактивная настройка этих двух полей запрещена, но программная кнопка отбора продолжает работать: СписокРасчетов.Отбор — другой объект. Это демонстрирует отличие политики интерфейса от данных фильтра.
ИзменятьАвтоОбновление и ИзменятьСпособРедактирования управляют доступностью настройки пользователю. Они не запрещают программное присваивание соответствующих свойств и не являются правами на запись.
Настраиваемый профиль включает интерактивные настройки. СпособРедактирования переключается ВДиалоге/ВСписке, но ТолькоПросмотр сохраняется: реальное редактирование/запись в этом опыте не выполняется.
ПроверкаОтображенияНовойСтроки переключается между двумя действительными значениями перечисления. СообщатьОНесоответствииОтбору применяется после ввода новой строки; здесь ввод выключен, поэтому подтверждаем настройку, но не выдаём опыт за тест такого сообщения.
Кнопка АвтоОбновление программно включает/выключает перечитывание каждые 10 секунд даже при ИзменятьАвтоОбновление=Ложь. Минимум по справке 5 секунд. При отключённом АвтоОбновление сам по себе период не запускает таймер.
Фиксированный возвращает учебный профиль, отключает таймер и восстанавливает исходный фильтр/порядок источника. Закрыть тоже выключает таймер. Опыт касается только собственного нового окна, не чужих форм или системных пользовательских настроек.
Как проверить результат
Будущий тест: вставить три полных блока в указанные разные модули, назначить события/действия, F7, открыть через Пульт. Сверить реальные строки, не только сообщения. Начальные строки 00/L,10/A,20/B; обратные 20/B,10/A,00/L.
Нажать Фиксированный и открыть стандартный диалог настройки списка: Уч85Ключ и Код недоступны для интерактивного изменения. Программная кнопка ТолькоУзелB показывает одну собственную B.
Нажать Настраиваемый: доступность этих полей и настроек автообновления/режима меняется. Сам список остаётся ТолькоПросмотр; не сохранять и не добавлять строки.
Кнопка АвтоОбновление: проверять выведенные фактические свойства Истина/Ложь и период 10. Ожидание нескольких обновлений — будущий ручной тест; неизменные строки не доказывают работу таймера.
Фиксированный возвращает исходные строки и режим, выключает таймер. Закрыть закрывает только свой список. Данные и связи учебного набора прежние.
Ожидаемый результат
Обычный список показывает собственные узлы L/A/B и фильтрует B; UI-профили меняют настройки поля. Обмен, регистрация изменений и запись узлов не выполняются.
На что обратить внимание
Это обычная форма толстого клиента, не расширение конфигурации и не ДинамическийСписок управляемой формы.
Доступность интерактивного управления не блокирует программные операции. ТолькоПросмотр — политика поля, не система прав доступа к базе.
Не заменяйте readonly НастройкаОтбора/НастройкаПорядка. Их элементы Доступность относятся к UI, а фактический фильтр хранится у источника списка.
ВосстанавливатьТекущуюСтроку здесь осознанно выключен для нового независимого опыта. Урок не доказывает восстановление позиции после повторного открытия.
При ТолькоПросмотр режимы редактирования и проверка новой строки показаны как настройки, не как выполненное редактирование и не как проверенные сообщения платформы.
Автообновление перечитывает базу и создаёт нагрузку, но не делает обмен и не отправляет сообщения. Для настоящего обмена нужны другие API.
Стенд/UI/таймер здесь не выполнялись: runtimeVerifiedScenarios=0. Сообщения ожидаемых строк не заменяют ручную проверку поля.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.