К основному контенту

ОткрытьФорму и "ничего не происходит"

Вводная

перешли с 8.3.11 на 8.3.12 после отключения совместимости фрагмент кода ниже перестал открывать требуемую форму из другой (справедливо для клиент-серверного варианта проверить файловый вариант ИБ не было возможности)

&НаКлиенте
Процедура СписокВидовДоговоровВыборЗначения(Элемент, Значение, СтандартнаяОбработка)
  
  // . . .
  
  ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаОбъекта", 
  ПараметрыФормыДоговора, ЭтаФорма.ВладелецФормы,,,,,РежимОткрытияОкнаФормы.Независимый);
  
  ЭтаФорма.Закрыть();
КонецПроцедуры

Теперь немного больше деталей.  


Для справочника ДоговорыКонтрагентов реализовано переопределение формы в обработчике получения формы

Процедура ОбработкаПолученияФормы(ВидФормы, 
Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
 
 Если ВидФормы = "ФормаОбъекта" Тогда
        // . . . 
 КонецЕсли;
 
КонецПроцедуры

Это требуется для того, чтобы в зависимости от данных заполнения или переданного ключа может быть открыта как форма элемента справочника, так и форма элемента подчиненного справочника. При интерактивном создании элементов справочника мы получим поведение аналогичное программному открытию формы

ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаОбъекта". . . );

 В случае если требуемые ключи не заданы - открываем диалог выбора требуемых значений для заполнения нового

ВыбраннаяФорма = 
"Справочник.ДоговорыКонтрагентов.Форма.ФормаВыбораТипаДоговораКонтрагента";


Но на какую конкретно форму, это уже не так важно.

Решение

ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаОбъекта", 
  ПараметрыФормыДоговора, ЭтаФорма.ВладелецФормы,Истина,,,,
  РежимОткрытияОкнаФормы.Независимый);

Включение в параметры Уникальность = Истина. Возвращает нас к исходному поведению (требуемая форма открывается).

 Дальше теории конспирологов (когда сколько бы ты не знал, это только догадки).

Что у нас произошло:

По умолчанию Уникальность = Ложь, те форма не уникальная и сначала попытаться найти среди открытых.

1. мы создали интерактивно новый элемент
2. платформа открывает для него форму по-умолчанию (Справочник.ДоговорыКонтрагентов.ФормаОбъекта, Владелец)
3. мы переопределяем форму в обработчике получения формы
4. платформа кеширует ФормаОбъекта+Владелец = форма из п.3 (точнее любая форма какую вернет сервер)
5. Мы программно открывает форму ФормаОбъекта+тот же Владелец - платформа нашла по этим ключам форму из п.2 (тот же набор ключей). Так как форма уже открыта, мы интерактивно не ощущаем каких либо изменений и считаем что открытие формы "не работает".

Ещё немного

Фрагмент справки 8.3.11.2954 идентичен фрагменту справки 8.3.12.1529, 8.3.12.1616

<Уникальность> (необязательный)
Тип: Произвольный.
В данном параметре может быть задан некоторый ключ, значение которого будет использоваться для поиска уже открытых форм. Если будет найдена форма с таким же ключом уникальности, вместо открытия новой формы будет активизирована найденная форма.
Ложь - искать форму с ключом уникальности по умолчаниюИстина - не искать форму вообще, любое другое значение устанавливает ключ уникальности, по которому будет произведен поиск.
Значение по умолчанию: Ложь.
Описание:
Открывает и возвращает форму или управляемую форму. В тонком и веб-клиенте только управляемую форму. Перед открытием осуществляется поиск уже открытой такой же формы. Поиск осуществляется по типу формы, значениям ключевых параметров формы, владельцу формы, пользовательскому ключу уникальности.
Можно открывать уже полученную форму. В этом случае в параметрах передается уже полученная форма и окно, в котором открыть форму.
Можно открыть по имени формы. В этом случае в параметры передаются имя формы, параметры формы, владелец, ключ уникальности и окно, в котором должна быть открыта форма.
Доступность:
Тонкий клиент, веб-клиент, толстый клиент, мобильное приложение(клиент).
Вызов метода выполняет обращение к серверу.
Примечание:
Для варианта "По названию" параметры вызова аналогичны параметрам метода ПолучитьФорму.
Обычные формы внешних обработок не поддерживаются.
В управляемом приложении не следует выполнять программное открытие и закрытие одной и той же формы в одном вызове встроенного языка.
Если при открытии обычной формы в параметре <ИмяФормы> указано не стандартное имя формы, передаваемые параметры не обрабатываются.
В процессе выполнения может быть несколько обращений к серверу. Часть из них кэшируются. Как минимум одно обращение к серверу есть всегда и оно не кэшируется. Кэширование зависит от версии платформы и версии конфигурации в целом. Если установлена низкая скорость соединения и не указывается текущая строка, то кэшируется форма выбора. Очистка кэша осуществляется с периодичностью в 20 мин. Удаляются формы, которые не использовались в этот период времени
Из описания ОткрытьФорму() трудно сделать выводы об явном изменении в поведении платформы, скорее всего было исправлено\оптимизировано ранее существовавшее допущение. Скорее всего изменилась обработка Уникального пользовательского ключа и поиска формы по нему, в 8.3.11 пустое значение - не сопоставляется при поиске среди открытых форм, то в 8.3.12 - пустое значение, тоже значение. Напомню в режиме "совместимости с 8.3.11" в 8.3.12 - форма открывается и с Уникальность = Ложь (значение по умолчанию, если верить документации оно - Ложь).

Так же о многом говорит - ничего не говоря конкретно - расплывчатая формулировка "Кэширование зависит от версии платформы и версии конфигурации в целом."

Комментарии

Популярные сообщения из этого блога

СписокВыбора. Показать Представление вместо Значения

Вводная Если на форме есть элемент управления со списком выбора, в моем конкретном примере это Колонка Значение (Число (3,0)) с настроенным списком выбора. По умолчанию платформа отображает именно строковое значения, а не текст представления  из списка выбора (когда как при выборе значения из списка показываются именно представления). Решение Для Управляемых форм необходимо настроить правила условного оформления, для обычных форм - оформление ячеек при выводе данных.

Табличный Документ. Разная ширина колонки в строках

Когда нужно в макете (табличном документе) изменить ширину колонки  для конкретных строк: 1. Выделить всю строку (строки). Именно всю, фокус для выделенной области не работает. 2. Нажимаем и не отпускает Ctrl 3. С помощью мыши изменяют ширину любой из колонок - будет задан вопрос об создании нового формата строк - соглашаемся. Как же прекрасен мир, где для модификаций не достаточно просто использовать контекстное меню и диалог редактора свойств, где нужно знать заветные слова и таинства танца. 90ые, моё почтение. UPD Программно, тоже самое, можно сделать через ТабДок = Новый ТабличныйДокумент(); ТабДок.Область(1,,1,).СоздатьФорматСтрок(); ТабДок.Область(1,1).ШиринаКолонок = 70; ТабДок.Область(1,2).ШиринаКолонок = 30; ТабДок.Область(2,,2,).СоздатьФорматСтрок(); ТабДок.Область(2,1).ШиринаКолонок = 30; ТабДок.Область(2,2).ШиринаКолонок = 70; ТабДок.Показать();

Расширение конфигурации + Связанные документы (Режим совместимости 8.3.12)

Вводная: реализовать ввод Заказа поставщику на основании Заказа на Ремонт. решить через расширения конфигурации. Хочу обратить ваше внимание, не нужно добавлять в расширение критерий отбора, для 8.3.12 нам не доступно добавление\изменение состава критерия. Более того может зависать конфигуратор (столкнулся с последней версией 8.3.14 + ERP) Разработку рекомендую вести с применением хранилища и для расширения. Иначе устанете потом выгребать чего лишнего включили в расширение при добавлении таких или схожих обектов с составными типами и подобное. Все текущие типовые решения сейчас идут в режиме совместимости 8.3.12, в прочем и для 8.3.14 (и даже 8.3.15 ничего не поменялось). Что нам нужно было бы сделать при отказе от поддержки: 1) добавить наш документ в Критерий отбора (состав, реквизиты); 2) в раздел Ввод на основании целевого документа. И что с целью сохранения поддержки. Как сделать это же для расширения: 1) Добавить реквизит расширения Документы.ЗаказПоставщику._За