Расширение табличного поля списка узлов.ПроверкаОтображенияНовойСтроки

Свойства · NewRowShowCheck

Тип: ВариантПроверкиОтображенияНовойСтроки. Если данное свойство имеет значение СообщатьОНесоответствииОтбору, то после окончания ввода новой строки системой будет осуществлена проверка строки и, если строка будет не соответствовать установленному отбору, будет выдано сообщение.

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

Расширение табличного поля списка узлов.ПроверкаОтображенияНовойСтроки (Node list table box extension.NewRowShowCheck)

Расширение табличного поля списка узлов (Node list table box extension)

ПроверкаОтображенияНовойСтроки (NewRowShowCheck)

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

Использование:
Чтение и запись.
Описание:
Тип: ВариантПроверкиОтображенияНовойСтроки.
Если данное свойство имеет значение СообщатьОНесоответствииОтбору, то после окончания ввода новой строки системой будет осуществлена проверка строки и, если строка будет не соответствовать установленному отбору, будет выдано сообщение.
Доступность:

Толстый клиент.

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

Доступен, начиная с версии 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С» и не аффилирован с ней.