Возвращает признак того, что пользователь может увидеть элемент без настройки формы, но путем переключения закладок и полос прокрутки. Если объект является колонкой таблицы и таблица не находится в режиме редактирования, при вызове метода генерируется исключение.
Синтаксис
ТекущаяВидимость()Полное описание, параметры и ограничения
ТестируемоеПолеФормы.ТекущаяВидимость (TestedFormField.CurrentVisible)
ТестируемоеПолеФормы (TestedFormField)
ТекущаяВидимость (CurrentVisible)
Доступен, начиная с версии 8.3.3.
Синтаксис:
ТекущаяВидимость()
Возвращаемое значение:
Тип: Булево.
Истина - объект видимый; Ложь в противном случае.
Описание:
Возвращает признак того, что пользователь может увидеть элемент без настройки формы, но путем переключения закладок и полос прокрутки.
Если объект является колонкой таблицы и таблица не находится в режиме редактирования, при вызове метода генерируется исключение.
Доступность:
Тонкий клиент, толстый клиент.
Использование в версии:
Доступен, начиная с версии 8.3.3.
Методическая информация
Практические примеры
Проверить своё поле ввода и кнопку: реальные состояния, ввод текста, пометка и восстановление
Полный UI-тест отдельного поля строки и кнопки собственной командной панели. Контролируются реальная идентичность, вид, заголовок, родители, подсказка и видимость; после ввода свой обработчик переключает ТолькоПросмотр и пометку, затем собственные данные и режим восстанавливаются.
Где и как запускать
Полный модуль управляемой формы МенеджерПолей85.Пульт: имя своей конфигурации возвращает серверная функция без контекста, UI выполняется в своём тонком /TESTMANAGER-клиенте8.5.1.1343; новый тонкий /TESTCLIENT той же пустой базы УчебныеПоляТестирования85 на вручную проверенном порту15382, Такси.
Подготовка
Создайте с нуля отдельную пустую конфигурацию УчебныеПоляТестирования85 на платформе8.5.1.1343; Управляемое приложение, Такси. Без прикладных объектов, общих реквизитов-разделителей, расширений, подписок и чужих обработчиков. В рабочей базе тесты не запускайте.
Общие формы → УчебныеПоля85, тип Управляемая. Вставьте полный дополнительный модуль fixture ниже и назначьте ПриСозданииНаСервере(Отказ, СтандартнаяОбработка). Не заменяйте реквизиты этой формы данными справочника или документа.
Добавьте реквизиты МеткаСеанса типа Строка, УчебныйТекст85 типа Строка длиной100 и РежимПросмотра типа Булево. РежимПросмотра не показывайте пользователю; он меняется только собственным обработчиком кнопки.
Добавьте группу ГруппаДанных85 обычного вертикального вида, заголовок Данные опыта. Внутри неё два отдельных поля ввода: МеткаСеанса только для просмотра и УчебныйТекст85 с заголовком Учебный текст, видимым заголовком и доступным редактированием. Это не колонки таблицы.
Добавьте отдельную группу ПанельРежима85 вида Командная панель. Внутри неё кнопку РежимПросмотра85 вида КнопкаКоманднойПанели, заголовок Только просмотр, Пометка=Ложь. Не заменяйте её обычной кнопкой вне панели: свойство Пометка предназначено для командной панели.
Создайте команду ПереключитьРежимПросмотра85 с одноимённым действием и свяжите с кнопкой РежимПросмотра85. Создайте команду СброситьСвойОпыт85 с одноимённым действием и кнопку именно СброситьСвойОпыт85. Обе команды ИзменяетСохраняемыеДанные=Ложь.
Создайте единственную учебную подсистему и общую команду ОткрытьУчебныеПоля85, без параметра, с модулем запуска ниже. Включите её в подсистему и покажите её кнопку; она открывает только свою ОбщаяФорма.УчебныеПоля85.
Обработки → МенеджерПолей85 → управляемая форма Пульт. Добавьте Согласие типа Булево, МеткаСеанса типа Строка, Итог типа Строка неограниченной длины, команду и кнопку ВыполнитьСвойТест с одноимённым действием. Основной код урока — полный модуль именно менеджера.
Назначьте менеджеру ПриОткрытии(Отказ). Покажите флажок согласия, поле ввода фактической метки и многострочный Итог только для просмотра. Никаких неизвестных входных объектов урок не требует.
Нажмите F7 и обновите только стенд. runtimeVerifiedScenarios=0: здесь 1С, приложение, тестируемые окна и соединения не запускались. Статическая проверка не доказывает фактическое отображение элементов.
Вручную запустите один тонкий клиент этой новой базы с /TESTCLIENT -TPort15382, другой с /TESTMANAGER. Администратор заранее выделяет этот собственный свободный локальный порт и убеждается, что его не занимает чужой клиент. Код ничего не запускает автоматически.
В тестируемом клиенте откройте свою форму. Исходно видны Книга, выключенная пометка кнопки и разрешённое редактирование. Скопируйте реальную метку из поля в менеджер; не генерируйте UUID в менеджере вместо собственного источника.
Установите согласие и выполните тест. На промежуточном шаге свой текст Учебная книга должен сохраниться при ТолькоПросмотр=Истина и пометке=Истина; повторное нажатие возвращает редактируемое состояние.
В завершении отдельная собственная кнопка сбрасывает только данные этой формы к Книга и исходному режиму. При ошибке очистки нажмите СброситьСвойОпыт85 вручную именно в своей форме. Клиент и форма не закрываются, документы, регистры и файлы не записываются.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Согласие = Ложь;
МеткаСеанса = "";
Итог = "Подготовьте свою форму в собственном клиенте /TESTCLIENT";
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойСтенд()
Если Не Согласие Тогда
ВызватьИсключение "Подтвердите UI-тест только собственной формы в памяти";
КонецЕсли;
UUIDМетки = Новый УникальныйИдентификатор(МеткаСеанса);
Если Строка(UUIDМетки) <> МеткаСеанса Тогда
ВызватьИсключение "Скопируйте фактический UUID из своей формы, не создавайте метку в менеджере";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьСвоюФорму(Приложение)
Заголовок = "Учебные поля85 " + МеткаСеанса;
Формы = Приложение.НайтиОбъекты(Тип("ТестируемаяФорма"), Заголовок, , 10);
Если ТипЗнч(Формы) <> Тип("ФиксированныйМассив") Или Формы.Количество() <> 1 Тогда
ВызватьИсключение "Нужна ровно одна реально подготовленная своя форма этого сеанса";
КонецЕсли;
Форма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), Заголовок, , 10);
Метка = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "МеткаСеанса", 10);
Если Метка.ПолучитьПредставлениеДанных() <> МеткаСеанса Тогда
ВызватьИсключение "Форма не подтвердила настоящую метку сеанса";
КонецЕсли;
Возврат Форма;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвоиЭлементы(Поле, Кнопка)
Если ТипЗнч(Поле) <> Тип("ТестируемоеПолеФормы") Или Поле.Имя <> "УчебныйТекст85"
Или Поле.Вид <> ВидПоляФормы.ПолеВвода Или Поле.ТекстЗаголовка <> "Учебный текст" Тогда
ВызватьИсключение "Нужно именно собственное отдельное поле ввода, не колонка рабочей таблицы";
КонецЕсли;
Если Не Поле.ТекущаяВидимость() Или Не Поле.ТекущаяДоступность() Или Не Поле.ЗаголовокОтображается() Тогда
ВызватьИсключение "Собственное поле должно быть видимым, доступным и с видимым заголовком";
КонецЕсли;
Если Поле.ПолучитьТекстПодсказки() <> "Введите только учебный текст без записи базы" Тогда
ВызватьИсключение "Подсказка не совпала с собственным fixture";
КонецЕсли;
Если ТипЗнч(Кнопка) <> Тип("ТестируемаяКнопкаФормы") Или Кнопка.Имя <> "РежимПросмотра85"
Или Кнопка.Вид <> ВидКнопкиФормы.КнопкаКоманднойПанели Или Кнопка.ТекстЗаголовка <> "Только просмотр" Тогда
ВызватьИсключение "Нужна своя кнопка командной панели, поддерживающая пометку";
КонецЕсли;
Если Не Кнопка.ТекущаяВидимость() Или Не Кнопка.ТекущаяДоступность() Тогда
ВызватьИсключение "Собственная кнопка должна быть видимой и доступной";
КонецЕсли;
РодительПоля = Поле.ПолучитьРодителя();
Если ТипЗнч(РодительПоля) <> Тип("ТестируемаяГруппаФормы") Или РодительПоля.Имя <> "ГруппаДанных85" Тогда
ВызватьИсключение "У поля не подтвердился фактический собственный родитель";
КонецЕсли;
РодительКнопки = Кнопка.ПолучитьРодителя();
Если ТипЗнч(РодительКнопки) <> Тип("ТестируемаяГруппаФормы") Или РодительКнопки.Имя <> "ПанельРежима85" Тогда
ВызватьИсключение "У кнопки не подтвердился фактический собственный родитель";
КонецЕсли;
ДочерниеПоля = Поле.ПолучитьПодчиненныеОбъекты();
ДочерниеКнопки = Кнопка.ПолучитьПодчиненныеОбъекты();
Если ТипЗнч(ДочерниеПоля) <> Тип("ФиксированныйМассив") Или ТипЗнч(ДочерниеКнопки) <> Тип("ФиксированныйМассив") Тогда
ВызватьИсключение "Нужны настоящие коллекции подчинённых объектов, не придуманные элементы";
КонецЕсли;
Сообщить("Фактические подчинённые: поле=" + Строка(ДочерниеПоля.Количество()) + "; кнопка=" + Строка(ДочерниеКнопки.Количество()));
КонецПроцедуры
&НаКлиенте
Функция ЗавершитьСвойТест(Приложение, Форма, ИсходныйЛимит)
Ошибки = "";
Если Форма <> Неопределено Тогда
Попытка
Сброс = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "СброситьСвойОпыт85", 10);
Сброс.Нажать();
Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "УчебныйТекст85", 10);
Кнопка = Форма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "РежимПросмотра85", 10);
Если Поле.ПолучитьПредставлениеДанных() <> "Книга" Или Поле.ТекущееТолькоПросмотр() Или Кнопка.ТекущееПометка() Тогда
ВызватьИсключение "Свои исходные данные и режим ещё не восстановлены";
КонецЕсли;
Исключение
Ошибки = "Не восстановлен свой опыт: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если ТипЗнч(ИсходныйЛимит) = Тип("Число") Тогда
Попытка
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(ИсходныйЛимит);
Исключение
Ошибки = Ошибки + " Не восстановлен фактический лимит: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Попытка
Приложение.РазорватьСоединение();
Исключение
Ошибки = Ошибки + " Разрыв соединения не подтверждён: " + ОписаниеОшибки();
КонецПопытки;
Возврат Ошибки;
КонецФункции
&НаКлиенте
Процедура ВыполнитьСвойТест(Команда)
ПроверитьСвойСтенд();
Приложение = Новый ТестируемоеПриложение("127.0.0.1", 15382);
СвояФорма = Неопределено;
ИсходныйЛимит = Неопределено;
ОшибкаТеста = "";
Итог = "Фактический результат ещё не получен";
Попытка
Приложение.УстановитьСоединение();
ИсходныйЛимит = Приложение.ПолучитьМаксимальноеВремяВыполненияДействия();
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(10);
СвояФорма = ПолучитьСвоюФорму(Приложение);
Поле = СвояФорма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "УчебныйТекст85", 10);
Кнопка = СвояФорма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "РежимПросмотра85", 10);
ПроверитьСвоиЭлементы(Поле, Кнопка);
Если Поле.ПолучитьПредставлениеДанных() <> "Книга" Или Поле.ТекущееТолькоПросмотр() Или Кнопка.ТекущееПометка() Тогда
ВызватьИсключение "Исходный собственный опыт уже изменён; сначала выполните свой сброс";
КонецЕсли;
Поле.Активизировать();
Поле.ВвестиТекст("Учебная книга");
Кнопка.Активизировать();
Если Поле.ПолучитьПредставлениеДанных() <> "Учебная книга" Тогда
ВызватьИсключение "Настоящее введённое значение не подтвердилось";
КонецЕсли;
Кнопка.Нажать();
Если Не Кнопка.ТекущееПометка() Или Не Поле.ТекущееТолькоПросмотр() Тогда
ВызватьИсключение "Пометка кнопки и отдельное состояние ТолькоПросмотр поля не подтвердились";
КонецЕсли;
Если Поле.ПолучитьПредставлениеДанных() <> "Учебная книга" Тогда
ВызватьИсключение "Переключение режима не должно стирать собственные данные";
КонецЕсли;
Если Не Кнопка.ТекущаяДоступность() Тогда
ВызватьИсключение "Свою доступную кнопку нужно сохранить для обратного переключения";
КонецЕсли;
Кнопка.Нажать();
Если Кнопка.ТекущееПометка() Или Поле.ТекущееТолькоПросмотр() Тогда
ВызватьИсключение "Возврат в редактируемое состояние ещё не подтвердился";
КонецЕсли;
Итог = "Введён собственный учебный текст; пометка и ТолькоПросмотр проверены в обоих состояниях";
Исключение
ОшибкаТеста = ОписаниеОшибки();
КонецПопытки;
ОшибкиЗавершения = ЗавершитьСвойТест(Приложение, СвояФорма, ИсходныйЛимит);
Если ОшибкаТеста <> "" Или ОшибкиЗавершения <> "" Тогда
Итог = "Тест не завершён успешно: " + ОшибкаТеста + " " + ОшибкиЗавершения;
ВызватьИсключение Итог;
КонецЕсли;
Итог = Итог + "; свой текст Книга и исходный режим восстановлены, реальный лимит восстановлен, соединение разорвано. Клиент не закрывался";
КонецПроцедуры
УчебныеПоля85
УчебныеПоляТестирования85 → Общие формы → УчебныеПоля85 → Модуль
Полный модуль собственной управляемой формы: серверное создание своих данных, два клиентских действия; данные только в памяти и настоящие собственные элементы формы.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Метаданные.ОбщиеРеквизиты.Количество() <> 0 Тогда
Отказ = Истина;
ВызватьИсключение "Только свой новый неразделённый стенд";
КонецЕсли;
ЭтотОбъект.АвтоЗаголовок = Ложь;
МеткаСеанса = Строка(Новый УникальныйИдентификатор);
ЭтотОбъект.Заголовок = "Учебные поля85 " + МеткаСеанса;
УчебныйТекст85 = "Книга";
РежимПросмотра = Ложь;
Элементы.УчебныйТекст85.Подсказка = "Введите только учебный текст без записи базы";
Элементы.УчебныйТекст85.ТолькоПросмотр = Ложь;
Элементы.РежимПросмотра85.Пометка = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура ПереключитьРежимПросмотра85(Команда)
РежимПросмотра = Не РежимПросмотра;
Элементы.УчебныйТекст85.ТолькоПросмотр = РежимПросмотра;
Элементы.РежимПросмотра85.Пометка = РежимПросмотра;
КонецПроцедуры
&НаКлиенте
Процедура СброситьСвойОпыт85(Команда)
УчебныйТекст85 = "Книга";
РежимПросмотра = Ложь;
Элементы.УчебныйТекст85.ТолькоПросмотр = Ложь;
Элементы.РежимПросмотра85.Пометка = Ложь;
КонецПроцедурыОткрытьУчебныеПоля85
УчебныеПоляТестирования85 → Общие команды → ОткрытьУчебныеПоля85 → Модуль
Полный модуль своей общей команды без параметра: серверная функция возвращает фактическое имя конфигурации, клиент проверяет строку и открывает собственную подготовленную форму.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("ОбщаяФорма.УчебныеПоля85");
КонецПроцедуры
Разбор по шагам
Пара объектов получается через настоящий ТестируемоеПриложение и одну конкретную форму с реальным UUID-заголовком. Поле метки отдельно подтверждает идентичность источника; отсутствующая или дублирующая форма вызывает отказ.
Поле проверяется по внутреннему имени, действительному виду ПолеВвода и видимому заголовку. Видимость, доступность, видимость заголовка и ТолькоПросмотр — разные состояния, не один универсальный getter.
Подсказка сравнивается с реальным значением, заданным собственным fixture. Представление данных должно быть Книга; это отображаемая строка, не универсальное преобразование числа или даты.
Родители поля и кнопки получаются native-методами и сверяются с реально созданными ГруппаДанных85 и ПанельРежима85. Подчинённые возвращаются действительными фиксированными массивами; число не угадывается и пустая коллекция не подменяется объектами.
Кнопка должна иметь вид КнопкаКоманднойПанели, точный заголовок, видимость и доступность. ТекущееПометка проверяет реальное визуальное состояние; readonly-свойства тестируемого объекта не заполняются вручную.
Ввод выполняется в отдельном реальном поле, затем фактическая кнопка активизируется и забирает фокус. ПолучитьПредставлениеДанных подтверждает отображаемое значение перед нажатием; несуществующий метод ЗакончитьРедактирование у поля не выдумывается. Серверной записи текста в каталог товаров нет.
Настоящее нажатие запускает только собственную команду. Она меняет РежимПросмотра, свойство исходного ПолеФормы.ТолькоПросмотр и пометку исходного КнопкаФормы; тестируемые объекты остаются readonly-представлениями.
Проверяется пара переходов: пометка и запрет редактирования включены, затем выключены. Данные после включения не должны исчезнуть, а кнопка должна оставаться доступной для возврата.
Очистка нажимает только свой сброс, повторно подтверждает Книга, ТолькоПросмотр=Ложь и пометку=Ложь, затем независимо восстанавливает реальный лимит и разрывает соединение. Ошибка любой части не скрывается.
Как проверить результат
При иной конфигурации, версии, чужом порту, отсутствии /TESTMANAGER, неверной фактической метке или нескольких формах тест должен отказаться. Не изменяйте защиту ради работы в production.
Исходное отдельное поле видно, доступно, имеет видимый заголовок Учебный текст и точную собственную подсказку. Кнопка находится внутри своей командной панели и имеет требуемый вид.
После ввода представление равно Учебная книга. После первого нажатия пометка=Истина, ТолькоПросмотр=Истина, текст тот же; доступность кнопки сохраняется.
После второго нажатия оба состояния Ложь. Если проверка даёт неправильное значение, код выбрасывает исключение, а не просто печатает Ложь и объявляет успех.
После завершения снова Книга, режим редактируемый, пометка снята, действительный исходный лимит восстановлен и соединение разорвано. Форма остаётся открытой.
В полях и кнопках не присваиваются свойства ТестируемоеПолеФормы/ТестируемаяКнопкаФормы. При ошибке собственный сброс и разрыв соединения всё равно предпринимаются независимо.
Ожидаемый результат
В разрешённом ручном UI-тесте введён свой учебный текст, дважды проверено согласованное переключение режима и пометки, реальные исходные данные восстановлены и соединение разорвано. Здесь выполнены только статические проверки.
На что обратить внимание
Тестируемое поле — абстракция; дополнительные методы зависят от фактического Вид. ВводТекста и окончание редактирования здесь применяются только после подтверждения ПолеВвода, не к календарю, картинке или диаграмме.
Для колонки таблицы некоторые getters вызывают исключение вне режима редактирования. Этот fixture содержит отдельное поле, а не колонку, поэтому эти ограничения не обходятся неизвестным объектом.
ТекущееТолькоПросмотр возвращает Истина при запрете редактирования. Текст описания справки может быть сформулирован неоднозначно; в уроке сверяются возвращаемое значение, реальный изменённый OnlyView и поведение собственного поля.
Пометка исходной кнопки управляет кнопкой командной панели, не любой обычной кнопкой. Для теста специально выбран корректный вид и реальная группа-панель.
Readonly-представление тестируемого объекта не равнозначно неизменяемости самой формы: собственный обработчик меняет свои исходные элементы и данные, а менеджер только наблюдает их и выполняет подтверждённые UI-действия.
Пустые подчинённые коллекции у простых элементов нормальны. Поиск дочерних объектов не выдумывается и не считается выполненным только от существования самих методов; он требует отдельного подходящего fixture.
В установленной справке кнопка содержит две страницы Активизировать и две ТекстЗаголовка с одинаковой семантикой. Экспорт сохранил отдельные ключи с суффиксом; один настоящий вызов и реальное чтение применимы к обеим страницам, а не являются двумя разными действиями.
Метаданные.Имя, UUID и заголовок — диагностические ограждения, не криптографическая аутентификация клиента. Принадлежность порта и отсутствие чужой базы проверяет администратор до подключения.
Сброс восстанавливает заданный исходный fixture, а не произвольные чужие изменения. Перед тестом не редактируйте эту форму вручную; любые связанные с базой обработчики меняют условия и риск.
Код не запускался, runtimeVerifiedScenarios=0. 1С, сеть тестирования, окна, рабочие базы, файлы, резервные копии и архивы не менялись.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Принять и отменить правку собственной ячейки через настоящий редактор
Полный тест своей текстовой R2C1: ввод Учебная книга принимается, ввод Не сохранять отменяется, затем своя таблица полностью восстанавливается кнопкой сброса.
Где и как запускать
Полный отдельный модуль формы менеджера тестирования собственного тонкого клиента и два полных supporting-модуля для создания/открытия своей таблицы. В1С не запускался.
Подготовка
НОВАЯ пустая отдельная конфигурация УчебнаяПравкаТаблицы85 на8.5.1.1343, совместимость Не использовать, Русский, интерфейс Такси. Нет рабочих справочников, документов, регистров, общих реквизитов, расширений, подписок и заданий. Только свои формы/команда этого урока; модули вручную пустые до вставки приведённого кода.
Конфигуратор → Общие формы → УчебнаяТаблицаТест85: реквизит МеткаСеанса Строка100, одиночное поле ввода МеткаСеанса с тем же путём и ТолькоПросмотр=Да; реквизит УчебныйДокумент типа ТабличныйДокумент, поле УчебнаяТаблица85 вида ПолеТабличногоДокумента с ПутьКДанным=УчебныйДокумент. Вставьте весь модуль fixture ниже; событие ПриСозданииНаСервере назначьте одноимённой процедуре.
Общая команда ОткрытьУчебнуюТаблицу85: модуль ниже полностью открывает ОбщаяФорма.УчебнаяТаблицаТест85. Включите команду в интерфейс своей подсистемы УчебныеТесты85. Не создавайте похожую команду для рабочего отчёта. Будущая ручная подготовка: сохранить конфигурацию, обновить базу F7.
Будущий ручной запуск ТОЛЬКО собственного стенда: первый отдельный тонкий клиент /TESTCLIENT -TPort15384, второй /TESTMANAGER. Собственный localhost-порт15384 заранее свободен и выделен только этому уроку; если выбран другой собственный порт, одинаково измените ручной ключ и конструктор. Здесь клиенты, порт и сетевое соединение не запускались.
В своём /TESTCLIENT откройте ровно одну собственную форму общей командой. Скопируйте реально показанный МеткаСеанса UUID. В таблице обычным щелчком выберите только R2C1, ячейку Книга; не выделяйте диапазон или объединённый заголовок.
Своя внешняя обработка УчебныйМенеджерТаблицы85 → новая управляемая Форма в /TESTMANAGER: реквизиты Согласие Булево, МеткаСеанса Строка100, Итог Строка1000. Видимые поля с этими путями, Итог ТолькоПросмотр=Да. Команда/кнопка ВыполнитьСвойТест, действие ВыполнитьСвойТест; ПриОткрытии назначьте одноимённой процедуре. Вставьте весь основной модуль, вставьте настоящую скопированную метку и подтвердите Согласие только своему тесту.
Для этого урока используйте ТОЛЬКО полный fixture ниже: он делает Документ.ТолькоПросмотр=Ложь и Редактирование=Истина, но Вывод остаётся Запретить. Не переносите запрет редактирования из предыдущего урока.
В общей форме УчебнаяТаблицаТест85 создайте собственную команду СброситьСвоиДанные85, действие СброситьСвоиДанные85, кнопку с внутренним именем СброситьСвоиДанные85 вне табличного поля. Весь обработчик и серверный сброс приведены в fixture; UUID при сбросе не меняется.
В менеджере остаются Согласие/МеткаСеанса/Итог и команда ВыполнитьСвойТест. Здесь Согласие разрешает только правку текста в памяти собственной таблицы и её восстановление; не запись базы, файла или печать. До запуска вручную выберите одиночную R2C1.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Согласие = Ложь;
МеткаСеанса = "";
Итог = "Сначала подготовьте свою таблицу и выберите только R2C1";
КонецПроцедуры
&НаКлиенте
Процедура ПроверитьСвойСтенд()
Если Не Согласие Тогда
ВызватьИсключение "Разрешите только правку собственной таблицы в памяти и её сброс без файлов, печати и записи базы";
КонецЕсли;
UUIDМетки = Новый УникальныйИдентификатор(МеткаСеанса);
Если Строка(UUIDМетки) <> МеткаСеанса Тогда
ВызватьИсключение "Скопируйте фактическую метку своего открытого клиента тестирования";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция НайтиСвоюТаблицу(Приложение)
Заголовок = "Учебная таблица85 " + МеткаСеанса;
Формы = Приложение.НайтиОбъекты(Тип("ТестируемаяФорма"), Заголовок, , 10);
Если ТипЗнч(Формы) <> Тип("ФиксированныйМассив") Или Формы.Количество() <> 1 Тогда
ВызватьИсключение "Должна быть одна фактически открытая собственная форма";
КонецЕсли;
Форма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), Заголовок, , 10);
Метка = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "МеткаСеанса", 10);
Если Метка.ПолучитьПредставлениеДанных() <> МеткаСеанса Тогда
ВызватьИсключение "Не подтверждена настоящая метка собственной таблицы";
КонецЕсли;
Поле = Форма.ПолучитьОбъект(Тип("ТестируемоеПолеФормы"), , "УчебнаяТаблица85", 10);
Если ТипЗнч(Поле) <> Тип("ТестируемоеПолеФормы") Или Поле.Имя <> "УчебнаяТаблица85"
Или Поле.Вид <> ВидПоляФормы.ПолеТабличногоДокумента Тогда
ВызватьИсключение "Нужно своё поле именно вида ПолеТабличногоДокумента";
КонецЕсли;
Если Не Поле.ТекущаяВидимость() Или Не Поле.ТекущаяДоступность() Тогда
ВызватьИсключение "Собственное поле должно быть видимым и доступным для выбора ячейки";
КонецЕсли;
Возврат Поле;
КонецФункции
&НаКлиенте
Процедура ПроверитьСвоюМатрицу(Поле, ИмяКниги = "Книга")
Если Поле.ПолучитьРазмерОбластиДанныхДокументаПоВертикали() <> 3
Или Поле.ПолучитьРазмерОбластиДанныхДокументаПоГоризонтали() <> 2 Тогда
ВызватьИсключение "Свой документ должен иметь последние данные в строке3 и колонке2";
КонецЕсли;
Если Поле.ПолучитьТекстОбласти("R1C1") <> "Учебная таблица85"
Или Поле.ПолучитьТекстОбласти("R2C1") <> ИмяКниги
Или Поле.ПолучитьТекстОбласти("R2C2") <> "3"
Или Поле.ПолучитьТекстОбласти("R3C1") <> "Ручка"
Или Поле.ПолучитьТекстОбласти("R3C2") <> "1" Тогда
ВызватьИсключение "Все пять текстов собственной таблицы должны совпасть полностью";
КонецЕсли;
Объединение = Поле.ВходитВОбъединеннуюОбласть("R1C1");
Если ТипЗнч(Объединение) <> Тип("Строка") Или Объединение <> "R1C1:R1C2" Тогда
ВызватьИсключение "Заголовок должен входить именно в собственную объединённую область";
КонецЕсли;
Если Поле.ВходитВОбъединеннуюОбласть("R2C1") <> Неопределено Тогда
ВызватьИсключение "Ячейка Книга не должна быть объединена";
КонецЕсли;
Если Поле.ТекущийРежимРедактирование() Тогда
ВызватьИсключение "Не начинайте редактировать собственную таблицу этого урока";
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьСвойТест(Команда)
ПроверитьСвойСтенд();
Приложение = Новый ТестируемоеПриложение("127.0.0.1", 15384);
Поле = Неопределено;
ИсходныйЛимит = Неопределено;
СвояОбластьПодтверждена = Ложь;
Сброс = Неопределено;
Ошибка = "";
Итог = "Проверка ещё не завершена";
Попытка
Приложение.УстановитьСоединение();
ИсходныйЛимит = Приложение.ПолучитьМаксимальноеВремяВыполненияДействия();
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(10);
Поле = НайтиСвоюТаблицу(Приложение);
ПроверитьСвоюМатрицу(Поле);
Если Поле.ПолучитьАдресТекущейОбласти() <> "R2C1" Тогда
ВызватьИсключение "До старта вручную выберите одну собственную ячейку Книга, R2C1";
КонецЕсли;
СвояОбластьПодтверждена = Истина;
СвояФорма = Приложение.ПолучитьОбъект(Тип("ТестируемаяФорма"), "Учебная таблица85 " + МеткаСеанса, , 10);
Сброс = СвояФорма.ПолучитьОбъект(Тип("ТестируемаяКнопкаФормы"), , "СброситьСвоиДанные85", 10);
Если ТипЗнч(Сброс) <> Тип("ТестируемаяКнопкаФормы") Или Сброс.Имя <> "СброситьСвоиДанные85"
Или Не Сброс.ТекущаяДоступность() Тогда
ВызватьИсключение "Нужна своя заранее подготовленная кнопка сброса";
КонецЕсли;
Поле.НачатьРедактированиеТекущейОбласти();
Если Не Поле.ТекущийРежимРедактирование() Тогда
ВызватьИсключение "Не началось редактирование только своей R2C1";
КонецЕсли;
Редактор = Поле.ПолучитьПолеТекущейОбласти();
Если ТипЗнч(Редактор) <> Тип("ТестируемоеПолеФормы")
Или Редактор.Вид <> ВидПоляФормы.ПолеВвода
Или Не Редактор.ТекущаяВидимость() Или Не Редактор.ТекущаяДоступность() Тогда
ВызватьИсключение "Нужен настоящий редактор своей текущей текстовой ячейки";
КонецЕсли;
Редактор.ВвестиТекст("Учебная книга");
Поле.ЗакончитьРедактированиеТекущейОбласти(Ложь);
Если Поле.ТекущийРежимРедактирование() Тогда
ВызватьИсключение "Приём изменений должен завершить режим редактирования";
КонецЕсли;
ПроверитьСвоюМатрицу(Поле, "Учебная книга");
Поле.НачатьРедактированиеТекущейОбласти();
РедакторОтмены = Поле.ПолучитьПолеТекущейОбласти();
Если ТипЗнч(РедакторОтмены) <> Тип("ТестируемоеПолеФормы") Или РедакторОтмены.Вид <> ВидПоляФормы.ПолеВвода Тогда
ВызватьИсключение "Второе изменение должно идти через настоящий редактор той же собственной ячейки";
КонецЕсли;
РедакторОтмены.ВвестиТекст("Не сохранять");
Поле.ЗакончитьРедактированиеТекущейОбласти(Истина);
Если Поле.ТекущийРежимРедактирование() Тогда
ВызватьИсключение "Отмена должна завершить режим редактирования";
КонецЕсли;
ПроверитьСвоюМатрицу(Поле, "Учебная книга");
Исключение
Ошибка = ОписаниеОшибки();
КонецПопытки;
Если СвояОбластьПодтверждена Тогда
Попытка
Если Поле.ТекущийРежимРедактирование() Тогда
Поле.ЗакончитьРедактированиеТекущейОбласти(Истина);
КонецЕсли;
Если Сброс <> Неопределено Тогда
Сброс.Нажать();
КонецЕсли;
Поле.УстановитьТекущуюОбласть("R2C1");
Если Поле.ПолучитьАдресТекущейОбласти() <> "R2C1" Тогда
ВызватьИсключение "Не восстановлена подтверждённая исходная ячейка";
КонецЕсли;
ПроверитьСвоюМатрицу(Поле);
Исключение
Ошибка = Ошибка + " Восстановление собственной области: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Если ТипЗнч(ИсходныйЛимит) = Тип("Число") Тогда
Попытка
Приложение.УстановитьМаксимальноеВремяВыполненияДействия(ИсходныйЛимит);
Исключение
Ошибка = Ошибка + " Восстановление фактического лимита: " + ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Попытка
Приложение.РазорватьСоединение();
Исключение
Ошибка = Ошибка + " Разрыв собственного соединения: " + ОписаниеОшибки();
КонецПопытки;
Если Ошибка <> "" Тогда
Итог = "Свой тест не завершён: " + Ошибка;
ВызватьИсключение Итог;
КонецЕсли;
Итог = "Приём и отмена своей правки проверены; исходная таблица, R2C1 и фактический лимит восстановлены; своё соединение разорвано";
КонецПроцедурыУчебнаяТаблицаТест85
Конфигуратор → Общие формы → УчебнаяТаблицаТест85 → Модуль
Полный самостоятельный модуль управляемой общей формы: создание собственной таблицы на сервере; не выполнялся.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверитьСвойПустойСтенд();
МеткаСеанса = Строка(Новый УникальныйИдентификатор);
ЭтотОбъект.АвтоЗаголовок = Ложь;
ЭтотОбъект.Заголовок = "Учебная таблица85 " + МеткаСеанса;
СоздатьСвоюТаблицуНаСервере();
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ПроверитьСвойПустойСтенд()
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура СоздатьСвоюТаблицуНаСервере()
ПроверитьСвойПустойСтенд();
Документ = Новый ТабличныйДокумент;
Заголовок = Документ.Область(1, 1, 1, 2);
Заголовок.Объединить();
Заголовок.Текст = "Учебная таблица85";
Документ.Область(2, 1).Текст = "Книга";
Документ.Область(2, 2).Текст = "3";
Документ.Область(3, 1).Текст = "Ручка";
Документ.Область(3, 2).Текст = "1";
Документ.Область(1, 1, 3, 2).ШиринаКолонки = 30;
Документ.ТолькоПросмотр = Ложь;
УчебныйДокумент = Документ;
Элементы.УчебнаяТаблица85.Редактирование = Истина;
Элементы.УчебнаяТаблица85.Вывод = ИспользованиеВывода.Запретить;
Элементы.УчебнаяТаблица85.РазрешитьНачалоПеретаскивания = Ложь;
Элементы.УчебнаяТаблица85.РазрешитьПеретаскивание = Ложь;
КонецПроцедуры
&НаКлиенте
Процедура СброситьСвоиДанные85(Команда)
СоздатьСвоюТаблицуНаСервере();
КонецПроцедурыОткрытьУчебнуюТаблицу85
Конфигуратор → Общие команды → ОткрытьУчебнуюТаблицу85 → Модуль
Полный модуль собственной общей команды с ОбработкаКоманды; не выполнялся.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("ОбщаяФорма.УчебнаяТаблицаТест85");
КонецПроцедурыРазбор по шагам
Источник — реальная собственная таблица3×2 с подтверждённым UUID и всеми пятью исходными текстами. При неподготовленной матрице изменения не начинаются.
НачатьРедактированиеТекущейОбласти работает над выбранной R2C1. ТекущийРежимРедактирование подтверждает настоящий режим, после чего ПолучитьПолеТекущейОбласти отдаёт отдельный ТестируемоеПолеФормы — редактор ячейки, не сам табличный документ.
У редактора проверяются реальный тип, вид ПолеВвода, видимость и доступность. ВвестиТекст вводит Учебная книга; ЗакончитьРедактированиеТекущейОбласти(Ложь) принимает изменение. Полная матрица проверяется с новой Книгой и прежними остальными четырьмя текстами.
Во второй попытке вводится Не сохранять, но ЗакончитьРедактированиеТекущейОбласти(Истина) отменяет только эту правку. В матрице остаётся ранее принятая Учебная книга, не исходная Книга и не Не сохранять.
На завершении при необходимости отменяется незаконченная правка, затем собственная кнопка заново строит исходную таблицу в памяти. Проверяются исходная R2C1 и все пять первоначальных текстов; фактический лимит и своё соединение восстанавливаются отдельно.
Как проверить результат
Будущий результат: после приёма R2C1=Учебная книга, после отмены второго ввода R2C1 по-прежнему Учебная книга. После собственного сброса R2C1=Книга и остальные данные/объединение восстановлены.
Будущий отрицательный контроль: в fixture временно установите Редактирование=Ложь и откройте новый собственный клиент/форму с новым UUID. Код не должен заявить успешный ввод. Верните полный fixture после опыта.
Проверьте сообщения ошибки, если свой редактор не появился. Не подменяйте его случайным полем формы или колонкой другой таблицы ради продолжения.
Ожидаемый результат
Приём и отмена своей правки проверены; исходная таблица, R2C1 и фактический лимит восстановлены; своё соединение разорвано
На что обратить внимание
runtimeVerifiedScenarios=0: BSL, UI, клиенты тестирования, соединения, файлы и печать здесь не запускались. Это полные исходники для будущего ручного опыта только на своём стенде.
Нужен новый отдельный /TESTCLIENT только этого урока, не рабочая конфигурация и не общий тестовый клиент. Настоящий UUID копируется из своей формы; ни похожие имена, ни новый выдуманный UUID не заменяют подтверждение источника.
У разных уроков одинаковые имена модулей/форм/процедур, но разные точные имена конфигураций. Каждый урок готовится отдельно; модули не склеивать.
Имя встроенного редактора может генерироваться платформой. Здесь не выдумывается его внутреннее имя: объект получается исключительно из своего текущего поля и проверяется по реальному типу/виду.
Отмена текущей правки не откатывает ранее принятое изменение. Собственный полный сброс — отдельное действие, не транзакция базы.
Таблица содержит текст, а не ссылки/числовые ячейки. Для числовых типов, формата, редактирования многострочных областей и рабочих печатных форм нужны отдельные условия.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.