Простые радости жизни программиста 1С: выбор типа значения

13.01.18

Разработка - Инструментарий разработчика

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

Актуальные версии обработки:

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
EditType83(1.3)
.epf 189,38Kb ver:8.3.1.3
28
28 Скачать (1 SM) Купить за 1 850 руб.
EditType81(1.3)
.epf 97,02Kb ver:8.1.1.3
3
3 Скачать (1 SM) Купить за 1 850 руб.

Архив:

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
EditType83(1.2)
.epf 157,56Kb ver:8.3.1.2
17
17 Скачать (1 SM) Купить за 1 850 руб.
EditType81(1.2)
.epf 80,89Kb ver:8.1.1.2
7
7 Скачать (1 SM) Купить за 1 850 руб.
EditType83(1.1)
.epf 127,92Kb ver:8.3.1.1
4
4 Скачать (1 SM) Купить за 1 850 руб.
EditType83(1.0)
.epf 124,42Kb ver:8.3.1.0
8
8 Скачать (1 SM) Купить за 1 850 руб.

 

Красота, конечно, спасет мир, но, похоже, никто в этом мире не думает о спасении.

 

Версии обработки:

Версия 1.3 от 02.01.2018
 +  добавлен показ типа
"СписокЗначений" при показе дополнительных типов (вместе с типом "ДвоичныеДанные").
 +  в группу типов
"Системные перечисления" добавлен тип "СтатусСообщения".
 +  добавлен показ типов ключей записей регистров учета (сведений, накопления, бухгалтерии и расчета)
     (
Рис.19.1
, Рис.20.1, Рис.19.2, Рис.20.2 ).
 +  добавлен показ типов менеджеров констант, а также типов объектов встроенных отчетов и обработок
    (опция не имеет смысла для управляемой формы диалога из-за недоступности типов,
Рис.19.1
, Рис.20.1, Рис.19.2).
 +  добавлена возможность испоьзования кратких названий групп ссылочных типов
    (
"Справочники" вместо "СправочникСсылка").
 +  добавлена возможность указания заголовка диалога, отличного от выводимого по умолчанию.
 +  тип параметра открытия диалога
"ТипыВВидеДерева" , определяющий представление списка типов,
     изменен на числовой (с сохранением поведения для обратной совместимост
и):
          0 -
"список", 1 - "многоуровневое дерево", 2 - "одноуровневое дерево".
 +  добавлена смена представления списка типов в диалоге с возможностью сохранения
     выбранного значения в настройках формы-владельца, открывшей диалог (
Рис.19.3
, Рис.20.3 ).
 +  исправлены замеченные ошибки.

Версия 1.2 от 11.04.2016
 + поиск по строке в имени или синониме типа (Рис.18.1, Рис.18.4), ограничение поиска изначально отмеченными типами (Рис.18.2);
 + показ только отмеченных строк в списке типов (как особый режим поиска, Рис.18.3);
 + показ дополнительных типов "ХранилищеЗначения", "УникальныйИдентификатор" (в дополнение к "ДвоичныеДанные", Рис.18.5);


Версия 1.1 от 13.03.2016
 + в контекстное меню флага "Составной тип данных" добавлено два подменю:
    - "Выбрать тип характеристик"  (Рис.14.2, для установки в списке составного типа "Характеристика.ИмяПВХ")
    - "Выбрать определяемый тип"  (Рис.14.3, для установки в списке составного типа "ОпределяемыйТип.ИмяОТ")


Версия 1.0 от 17.02.2016 (Исходная)


Предыстория:

Здоровый консерватизм и врожденное стремление к прекрасному послужили причиной для появления данной разработки. Лично у меня (и думаю, что я не одинок) сравнение диалогов выбора типа в обычном и управляемом приложении всегда вызывает когнитивный диссонанс.

Примером для подражания и отправной точкой для работы послужила форма выбора типа объекта в известной обработке «Администратор 1С». К списку ссылочных типов формы были добавлены примитивные и прочие типы. Также были добавлены квалификаторы данных и режим редактирования составного типа. Общая функциональность и оформление формы были максимально приближены к системному диалогу (насколько это возможно при использовании стандартной библиотеки картинок).

Формы обработки:

  • "DemoОбычное"Основная форма для обычного приложения (Рис.1),
    служит для демонстрации использования альтернативного диалога выбора типа в режиме обычного приложения;
  • "DemoУправляемое" Основная форма для управляемого приложения (Рис.2),
    служит для демонстрации использования альтернативного диалога выбора типа в режиме управляемого приложения; 
  • "EditTypeОбычное" Служебная универсальная форма (Рис.3, Рис.4),
    реализует функционал системного диалога редактирования/выбора типа для обычного приложения;
  • "EditTypeУправляемое":  Служебная универсальная форма (Рис.5, Рис.6),
     реализует функционал системного диалога редактирования/выбора типа для управляемого приложения;


Возможности альтернативных диалогов выбора типа:

1. Формы альтернативных  диалогов максимально полно реализуют функциональность системного диалога редактирования/выбора типа обычного приложения (включая оформление).

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

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

4. Альтернативные диалоги редактирования/выбора типа поддерживают выбор основных типов данных, которые можно хранить в реквизитах объектов или форм и для которых есть штатные средства выбора значений (включая некоторые системные перечисления).

5. Также добавлена возможность (через параметры формы) включать в списке типов диалога показ типа "ДвоичныеДанные" (Рис.3, Рис.4, Рис.5, Рис.6). В настоящий момент эта возможность практической ценности не имеет (этот тип нельзя напрямую хранить в реквизитах объектов и форм). Возможность добавлена ради доступа к квалификаторам двоичных данных, которые появились у объекта "ОписаниеТипов" в платформе версии 8.3.

В диалоге при показе типа  "ДвоичныеДанные" в списке типов диалога, также отображаются некоторые другие типы данных ( Рис.18.5):

  • "ХранилищеЗначения"
  • "УникальныйИдентификатор"
  • "СписокЗначений"

6. Добавлена возможность (через параметры формы) включать в списке типов диалога показ
    типов менеджеров значений констант и типов ключей записей регистров учета
    ( Рис.19.2, Рис.20.2 ):

  • "КонстантаМенеджерЗначения.ИмяКонстанты"
  • "РегистрСведенийКлючЗаписи.ИмяРегистра"
  • "РегистрНакопленияКлючЗаписи.ИмяРегистра"
  • "РегистрБухгалтерииКлючЗаписи.ИмяРегистра"
  • "РегистрРасчетаКлючЗаписи.ИмяРегистра"

7. Формы диалогов могут работать как в режиме редактирования составного типа данных,
    так и в режиме выбора типа текущего значения реквизита (из списка возможных типов,
    определяемых описанием составного типа реквизита).

8. Через параметры формы диалогов полноценно поддерживаются следующие представления списка типов в диалоге:

  • "Таблица значений" (Рис.7, Рис.8, только для управляемой формы диалога);
  • "Одноуровневое дерево значений" (Рис.9, Рис.10);
  • "Многоуровневое дерево значений" (Рис.11, Рис.12, действует по умолчанию);

    Установленное при открытии представление списка типов можно изменить
    из контекстного меню списка ( Рис.19.3, Рис.20.3 ).
    При этом установленное значение представления сохраняется в реквизите формы-владельца диалога
    (если через параметры формы диалога передано имя этого реквизита).

    Также при успешном сохранении выполняется оповещение формы-владельца диалога
    глобальным методом Оповестить() со следующими параметрами:
        ИмяСобытия = "EditType.ТипыВВидеДерева.Смена"
        Параметр     = [выбранное значение представления списка: 0, 1, 2]
        Источник     = [ссылка на форму-владельца диалога]
    Ответственность за дальнейшее сохранение/восстановление выбранного представления списка типов
    возлагается на форму-владельца диалога.

9. Формы диалогов при закрытии с подтверждением возвращают значение типа "ОписаниеТипов", которое соответствует
    отредактированному описанию типа или выбранному типу значения (с учетом квалификаторов данных).

При этом поддерживаются всевозможные режимы выбора значений в формах 1С
(определяется режимом открытия и установкой параметров формы диалога):

  • "Модальный выбор"
  • "Асинхронный выбор (обработка выбора)"
  • "Асинхронный выбор (оповещение о закрытии)"

Примечание:
При использовании режима  "Асинхронный выбор (обработка выбора)" в обработчике события "ОбработкаВыбора"
поля ввода может возникнуть неопределенная ситуация, если в составном типе реквизита использован тип "ОписаниеТипов".

А именно - как интерпретировать значение переменной ВыбранноеЗначение:
- Это выбрано ограничение типа реквизита (в диалоге выбора типа в режиме редактирования составного типа).
- Это выбран тип текущего значения реквизита (в диалоге выбора типа в режиме выбора типа).
- Это в поле ввода просто выбрано текущее значение реквизита типа "ОписаниеТипов".

В демонстрационных формах этой обработки считается:
- Если ВыбранноеЗначение - описание простого типа, то выбран тип текущего значения реквизита.
- Если ВыбранноеЗначение - описание составного типа, то выбрано текущее значение реквизита типа "ОписаниеТипов".


Дополнительные интерфейсные удобства:

  1. Во всех режимах выбора имеется возможность указания заголовка диалога
    отличного от того, что выводится по умолчанию.
  2. В режиме выбора типа значения:
    • Показ квалификаторов примитивных тиров данных (Рис.4, Рис.6) аналогично тому,
      как в режиме редактирования, но только для просмотра
      ;
  3. В режиме редактирования типа:
    • При редактировании составного типа в списке типов доступны для пометки узлы групп типов.
      При изменении пометки группы типов устанавливаются или снимаются метки со всех входящих в группу строк типов.
    • Пометка строки в списке типов для выбора (установки метки) при снятии флага "Составной тип данных" (Рис.13).
      Строка помечается двойным кликом при установленном флаге и выделяется подчеркиванием.
  4. Контекстное меню флага "Составной тип данных" (Рис.14.1, Рис.14.2, Рис.14.3), которое позволяет:
    • а. Отметить все строки в списке типов для выбора;
    • б. Сбросить метки выбора со всех строк списка типов;
    • в. Выбрать один из “предопределенных” составных типов конфигурации:
      • - Тип "ЛюбаяСсылка";
      • - Тип "ВсеСсылки" указанного типа прикладных объектов;
    • г. Выбрать составной тип одного из планов видов характеристик в конфигурации;
      д. Выбрать один из определяемых типов в конфигурации (содержащих только поддерживаемые диалогом типы);
      е. Восстановить исходное значение составного типа (переданное при открытии диалога);
  5. Контекстное меню списка типов диалога (Рис.15), которое позволяет:
    • Включить/выключить режим показа имен типов (объектов) вместо их синонимов
      (запоминаемая настройка диалога, по умолчанию - Истина);
    • Включить/выключить дополнительное оформление списка типов
      (запоминаемая настройка диалога, по умолчанию - Ложь):
      • Группы типов в списке выделяются светло-серым фоном;
      • В режиме редактирования типа (Рис.16):
        Изначально выбранные при открытии типы выделяются жирным шрифтом;
      • В режиме выбора типа (Рис.17):
        Переданное при открытии диалога текущее значение типа выделяется жирным шрифтом;
    • Сменить представление списка типов ( Рис.19.3, Рис.20.3 ):
      • "список", "многоуровневое дерево", "одноуровневое дерево";


Особенности поиска в списке типов в альтернативном диалоге:

В диалоге (начиная с версии 1.2) имеется два режима поиска:

  • Поиск по строке в имени или синониме типа - устанавливается при вводе символов в строке поиска над списком типов (Рис.18.1, Рис.18.4);
  • Показ отмеченных строк списка (с текущей пометкой) - переключается нажатием на гиперссылку картинки справа от строки поиска (Рис.18.3);

Оба режима поиска доступны как при редактировании составного типа (Рис.18.1), так и при выборе текущего типа значения (Рис.18.4).

Поиск по строке в имени или синониме типа реализован на запросе к временной таблице списка типов с условием
на поле поиска ПОДОБНО шаблону поиска. Поле поиска выбирается в соответствии с установленным режимом
показа имен типов (объектов) вместо их синонимов.

При этом шаблон поиска строится по строке поиска следующим образом:

  • В строке поиска слева и справа отсекаются конечные пробелы;
  • Внутренние пробелы заменяются на символы процента "%";
  • Двойные звездочки "**" заменяются на одинарные символы процента "%";
  • Все кратные символы процента "%" заменяются на одинарные;
  • Шаблон поиска дополняется слева и справа символами процента "%";

Специальные сочетания символов в строке поиска (вырезаются из шаблона и модифицируют условия поиска):

  • Символы "^%" в начале строки поиска - отменяют дополнение шаблона поиска слева символом "%" (поиск ПОДОБНО СЛЕВА, Рис.18.4);
  • Символы "^%" в конце строки поиска  - отменяют дополнение шаблона поиска справа символом "%" (поиск ПОДОБНО СПРАВА, Рис.18.6);
  • Символы "[]" ("пустой" диапазон символов) в любой части строки поиска - ограничивает поиск только изначально отмеченными строками списка (Рис.18.2);

Результаты поиска показываются в специальной таблице результатов поиска (в дереве значений).
Строки основного списка типов синхронизуются с таблицей результатов поиска при пометке и активизации его строк.

Быстрые клавиши, связанные с поиском в списке типов (Рис.18.6):

  • Ctrl+Alt+M    - активизировать строку поиска (также, как в системном диалоге);
  • Ctrl+Shift+1  - включить/выключить режим показа только отмеченных строк списка;
  • Ctrl+Shift+2  - очистить результаты поиска;


Использование альтернативных диалогов выбора типа:

  1. Режим редактирования типа требуется сравнительно редко, например, когда в реквизите типа "ОписаниеТипов"
    задается дополнительное ограничение типа другого реквизита составного типа значения.

    Для открытия альтернативного диалога выбора типа в этом случае можно использовать следующие события элементов формы:
    • Событие "НачалоВыбора" поля ввода формы (если описание типов редактируется напрямую);
    • Событие "Нажатие" или процедура обработки команды формы (если описание типов редактируется кнопкой формы);
    • Событие "Выбор" табличного поля формы (если описание типа редактируется при клике
      по строке табличного поля в специально предусмотренной колонке)
      ;
  2. Режим выбора типа значения требуется значительно чаще (при редактировании в полях ввода реквизитов составного типа).

    Для открытия альтернативного диалога выбора типа в режиме выбора типа можно использовать событие "НачалоВыбора"
    поля ввода значения реквизита в форме, когда значение реквизита составного типа равно Неопределено
    (системный диалог выбора типа открывается именно в этом случае).

    Есть также другой удобный способ для программного открытия диалога выбора типа (Рис.1, Рис.2):
    В обработчике события "Очистка" поля ввода
    методами ЭтаФорма.ВыбратьИзСписка() или ЭтаФорма.ПоказатьВыборИзСписка()
    выводить меню в виде выпадающего списка,
    в котором  предлагать пользователю следующие возможности:
    • "Выбрать тип значения" (выбрать текущий тип в альтернативном диалоге выбора);
    • “Пустое значение” (установить реквизиту пустое значение текущего типа, если тип простой);
    • "Очистить" (присвоить реквизиту значение Неопределено);
       
  3. Примеры использования альтернативных диалогов выбора типа смотрите ниже в приложениях к работе,
    а также в исходном коде демонстрационных форм обработки.


Ограничения обратной совместимости:

  •  Под платформой 8.2 все формы этой обработки будут нормально работать в толстом и тонком клиентах.
     
  • При работе на Web-клиенте под 8.2 будет ошибка компиляции модуля формы "EditTypeУправляемое"
    из-за "открытого" использования  глобального асинхронного метода
    ПоказатьПредупреждение() ,
    появившегося только под платформой 8.3.

    Проблема решается закомментариванием строки с вызовом этого метода на стороне Web-клиенте,
    специально выделенной для этой цели инструкцией препроцессора.
     
  • Под платформой 8.3.7 и выше  в форме "EditTypeУправляемое"
    при изменении представления списка типов с многоуровневого на одноуровневый и наоборот,
    а также при включении/отключении режима показа только отмеченных строк в списке,
    наблюдается неприятный визуальный эффект:

    форма диалога "самостоятельно" увеличивает размер по вертикали и горизонтали.
     

Приложение 1 (Пример кода использования диалога в режиме обычного приложения):

Пояснения к примеру:
Объект – основной реквизит обработки;
ТестРеквизит – реквизит обработки составного типа (непосредственно редактируется в форме);
ТестРеквизитТип – дополнительное ограничение типа реквизита ТестРеквизит (непосредственно редактируется в форме);
Смысл остальных реквизитов ясен из их названия, пример ориентирован на платформу 8.3

// На клиенте обычного приложения
Процедура ТестРеквизитНачалоВыбора(Элемент, СтандартнаяОбработка)
    Перем
Оповещение;
    Перем
ПараметрыВыбора;

    Если
ТипЗнч(Объект.ТестРеквизит) = Тип("ОписаниеТипов") И Объект.СистемныйДиалог <> Истина Тогда
       
// выбираем значение описания типа в нашем красивом диалоге
       
СтандартнаяОбработка = Ложь;
       
ПараметрыВыбора = Новый Структура("Элемент,ЭтоРедактированиеТипаДанных",Элемент,Истина);
       
ТипОО = ТипIf("ОписаниеОповещения");

       
стПараметры = Новый Структура;
       
стПараметры.Вставить("ЗаголовокДиалога","");
       
стПараметры.Вставить("РежимВыбораТипаДанных",Ложь);
       
стПараметры.Вставить("ТипыВВидеДерева",Объект.ТипыВВидеДерева);
       
стПараметры.Вставить("ТипыВВидеДереваИмяРеквизита","Объект.ТипыВВидеДерева");
       
стПараметры.Вставить("ПоказыватьТипBD",Объект.ПоказыватьТипBD);
       
стПараметры.Вставить("ПоказыватьКонстанты",Объект.ПоказыватьКонстанты);
       
стПараметры.Вставить("ПоказыватьОтчетыОбработки",Объект.ПоказыватьОтчетыОбработки);
       
стПараметры.Вставить("ПоказыватьРегистры",Объект.ПоказыватьРегистры);
       
стПараметры.Вставить("КраткиеИменаГруппТипов",Объект.КраткиеИменаГруппТипов);
       
стПараметры.Вставить("ТипЗначения",Объект.ТестРеквизит);
       
стПараметры.Вставить("ТекущийТип",Неопределено);

        Если
Объект.РежимВыбораТипа = "МодальныйВыбор" Тогда
           
Диалог = ПолучитьФорму(ПутьКФорме+"EditTypeОбычное");
           
Диалог.ФормаВладелец = ЭтаФорма;
           
Диалог.ОписаниеОповещенияОЗакрытии = Неопределено;
           
Диалог.Параметры = стПараметры;;
           
ВыбранноеЗначение = Диалог.ОткрытьМодально(180);
            Если
ВыбранноеЗначение <> Неопределено Тогда
               
ТестРеквизитПриВыбореЗначения(ВыбранноеЗначение,ПараметрыВыбора);
            КонецЕсли;
        ИначеЕсли
Объект.РежимВыбораТипа = "ОбработкаВыбора" Тогда
           
Диалог = ПолучитьФорму(ПутьКФорме+"EditTypeОбычное",Элемент,ЭтаФорма);
           
Диалог.ФормаВладелец = ЭтаФорма;
           
Диалог.ОписаниеОповещенияОЗакрытии = Неопределено;
           
Диалог.Параметры = стПараметры;;
           
Диалог.Открыть();
        ИначеЕсли
Объект.РежимВыбораТипа = "ОповещениеОЗакрытии" И ТипОО <> Null Тогда
           
мсПараметры = Новый Массив;
           
мсПараметры.Добавить("ТестРеквизитПриВыбореЗначения");
           
мсПараметры.Добавить(ЭтаФорма);
           
мсПараметры.Добавить(ПараметрыВыбора);
           
Оповещение = Новый(ТипОО,мсПараметры);
           
Диалог = ПолучитьФорму(ПутьКФорме+"EditTypeОбычное",Неопределено,ЭтаФорма);
           
Диалог.ФормаВладелец = ЭтаФорма;
           
Диалог.ОписаниеОповещенияОЗакрытии = Оповещение;
           
Диалог.Параметры = стПараметры;;
           
Диалог.Открыть();
        КонецЕсли;
    ИначеЕсли
Объект.ТестРеквизит = Неопределено И Объект.СистемныйДиалог <> Истина Тогда
       
// по нажатию кнопки выбора типа - выбираем тип значения в поле ввода в нашем красивом диалоге
       
СтандартнаяОбработка = Ложь;
       
ТестРеквизитВыбратьТип(Элемент,Объект.ТестРеквизит,Объект.ТестРеквизитТип,Ложь);
    Иначе
    КонецЕсли;

КонецПроцедуры

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

Процедура
ТестРеквизитОчистка(Элемент, СтандартнаяОбработка)
    Перем
Оповещение;
    Перем
ПараметрыОповещения;
   
СтандартнаяОбработка = Ложь;
   
ТипОО = ТипIf("ОписаниеОповещения");
   
ПараметрыОповещения = Новый Структура("Элемент",Элемент);
   
Меню = Новый СписокЗначений;
   
Меню.Добавить(1, НСтр("ru = 'Выбрать тип значения'; en = 'Select data type'"),,БиблиотекаКартинок.ВыбратьТип);
    Если (
Объект.ТестРеквизитТип.Типы().Количество()=1) Тогда
       
Меню.Добавить(2, НСтр("ru = 'Пустое значение'; en = 'Empty value'"),,БиблиотекаКартинок.Выбрать);
    КонецЕсли;
   
Выбор0 = Меню.Добавить(0, НСтр("ru = 'Очистить'; en = 'Clear'"),,БиблиотекаКартинок.Очистить);
    Если
Объект.РежимВыбораТипа <> "МодальныйВыбор" И ТипЗнч(ЭтаФорма) = ТипIf("УправляемаяФорма") И ТипОО <> Null Тогда
       
мсПараметры = Новый Массив;
       
мсПараметры.Добавить("ТестРеквизитОчисткаПродолжение");
       
мсПараметры.Добавить(ЭтаФорма);
       
мсПараметры.Добавить(ПараметрыОповещения);
       
Оповещение = Новый(ТипОО,мсПараметры);
       
ЭтаФорма.ПоказатьВыборИзСписка(Оповещение,Меню,Элемент,Выбор0);
    Иначе
       
Выбор = ЭтаФорма.ВыбратьИзСписка(Меню,Элемент,Выбор0);
       
ТестРеквизитОчисткаПродолжение(Выбор, ПараметрыОповещения);
    КонецЕсли;
КонецПроцедуры

Процедура
ТестРеквизитОчисткаПродолжение(Выбор, ПараметрыОповещения) Экспорт
    Перем
Элемент;
    Если
Выбор = Неопределено Тогда
        Возврат;
    КонецЕсли;
    Если
ТипЗнч(ПараметрыОповещения) = Тип("Структура") Тогда
       
ПараметрыОповещения.Свойство("Элемент",Элемент);
    КонецЕсли;
    Если
Выбор.Значение = 0 Тогда
       
Объект.ТестРеквизит = Неопределено;
       
ТестРеквизитПриИзменении(Элемент);
    ИначеЕсли
Выбор.Значение = 2 Тогда
       
Объект.ТестРеквизит = Объект.ТестРеквизитТип.ПривестиЗначение(Неопределено);
       
ТестРеквизитПриИзменении(Элемент);
    ИначеЕсли
Выбор.Значение = 1 Тогда
       
ТестРеквизитВыбратьТип(Элемент,Объект.ТестРеквизит,Объект.ТестРеквизитТип,Ложь);
    КонецЕсли;
КонецПроцедуры

Процедура
ТестРеквизитВыбратьТип(Элемент,Значение,ТипЗначения,ЭтоРедактированиеТипаДанных)
    Перем
Оповещение;
    Перем
ПараметрыВыбора;

   
ПараметрыВыбора = Новый Структура("Элемент,ЭтоРедактированиеТипаДанных",Элемент,ЭтоРедактированиеТипаДанных);
   
ТипОО = ТипIf("ОписаниеОповещения");
    Если
ТипЗнч(ТипЗначения.ПривестиЗначение(Значение)) = ТипЗнч(Значение) Тогда
       
ТекущийТип = ТипЗнч(Значение);
    Иначе
// для простых типов "двоичные данные", "хранилище значения" и "ключ записи регистра учета"
          // - результат приведения значения почему-то строковое значение
       
ТекущийТип = ТипЗнч(Неопределено);
    КонецЕсли;

   
// установка параметров диалога
   
стПараметры = Новый Структура;
   
// 1. Заголовок диалога редактирования/выбора типа
    //    по умолчанию: "Редактирование типа данных"/"Выбор типа данных"
   
стПараметры.Вставить("ЗаголовокДиалога","");
   
// 2. Режим работы диалога редактирования/выбора типа (обязателен!)
   
стПараметры.Вставить("РежимВыбораТипаДанных",(ЭтоРедактированиеТипаДанных <> Истина));
   
// 3. Представление списка типов в диалоге (по умолчанию - многоуровневое "ДеревоЗначений")
   
стПараметры.Вставить("ТипыВВидеДерева",Объект.ТипыВВидеДерева);
   
// 4. Путь в данных формы для сохранения измененного в диалоге представления списка типов
   
стПараметры.Вставить("ТипыВВидеДереваИмяРеквизита","Объект.ТипыВВидеДерева");
   
// 5. Признак показа в диалоге дополнительных типов "ДвоичныеДанные", "СписокЗначений" и т.п.
    //    (параметр добавлен для доступа к квалификаторам двоичных данных)
   
стПараметры.Вставить("ПоказыватьТипBD",Объект.ПоказыватьТипBD);
   
// 6. Признак показа в диалоге типов менелжеров записи значений констант
    //    (недоступно на клиенте в управляемом приложения!)
   
стПараметры.Вставить("ПоказыватьКонстанты",Объект.ПоказыватьКонстанты);
   
// 7. Признак показа в диалоге типов объектов отчетов и обработок
    //    (недоступно на клиенте в управляемом приложения!)
   
стПараметры.Вставить("ПоказыватьОтчетыОбработки",Объект.ПоказыватьОтчетыОбработки);
   
// 8. Признак показа в диалоге типов ключей записей регистров учета
   
стПараметры.Вставить("ПоказыватьРегистры",Объект.ПоказыватьРегистры);
   
// 9. Признак показа кратких имен групп ссылочных типов данных
    //    (например, "Справочник" вместо "СправочникСсылка")
   
стПараметры.Вставить("КраткиеИменаГруппТипов",Объект.КраткиеИменаГруппТипов);
   
//10. Составной тип данных для редактирования или для выбора текущего типа значения реквизита
    //    (обязателен!)
   
стПараметры.Вставить("ТипЗначения",ТипЗначения);
   
//11. Тип, определяющий текущую строку в списке типов при открытии
    //    (в режиме редактирования типа можно не указывать)
   
стПараметры.Вставить("ТекущийТип",ТекущийТип);

    Если
Объект.РежимВыбораТипа = "МодальныйВыбор" Тогда
       
Диалог = ПолучитьФорму(ПутьКФорме+"EditTypeОбычное");
       
//12. Параметр для имитации блокировки окна владельца диалога
       
Диалог.ФормаВладелец = ЭтаФорма;
       
//13. Параметр для имитации оповещения о закрытии диалога
       
Диалог.ОписаниеОповещенияОЗакрытии = Неопределено;
       
Диалог.Параметры = стПараметры;;
       
ВыбранноеЗначение = Диалог.ОткрытьМодально(180);
       
ТестРеквизитПриВыбореТипаЗначения(ВыбранноеЗначение,ПараметрыВыбора);
    ИначеЕсли
Объект.РежимВыбораТипа = "ОбработкаВыбора" Тогда
       
Диалог = ПолучитьФорму(ПутьКФорме+"EditTypeОбычное",Элемент,ЭтаФорма);
       
//12. Параметр для имитации блокировки окна владельца диалога
       
Диалог.ФормаВладелец = ЭтаФорма;
       
//13. Параметр для имитации оповещения о закрытии диалога
       
Диалог.Параметры = стПараметры;;
       
Диалог.Открыть();
    ИначеЕсли
Объект.РежимВыбораТипа = "ОповещениеОЗакрытии" И ТипОО <> Null Тогда
       
мсПараметры = Новый Массив;
       
мсПараметры.Добавить("ТестРеквизитПриВыбореТипаЗначения");
       
мсПараметры.Добавить(ЭтаФорма);
       
мсПараметры.Добавить(ПараметрыВыбора);
       
Оповещение = Новый(ТипОО,мсПараметры);
       
Диалог = ПолучитьФорму(ПутьКФорме+"EditTypeОбычное",Неопределено,ЭтаФорма);
       
//12. Параметр для имитации блокировки окна владельца диалога
       
Диалог.ФормаВладелец = ЭтаФорма;
       
//12. Параметр для имитации оповещения о закрытии диалога
       
Диалог.ОписаниеОповещенияОЗакрытии = Оповещение;
       
Диалог.Параметры = стПараметры;;
       
Диалог.Открыть();
    КонецЕсли;

КонецПроцедуры

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

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

Процедура
ТестРеквизитПриИзменении(Элемент)
   
ПолеФормыКонтрольТипЗначения(Элемент,Объект.ТестРеквизитТип,Объект.ТестРеквизит);
КонецПроцедуры

Процедура
ПолеФормыКонтрольТипЗначения(Элемент,ТипЗначения,Значение)
   
СтрФорматЧ = "";
   
ПЧ = Неопределено;
    Если
ТипЗначения.СодержитТип(Тип("Число")) Тогда
       
ДЛ = ТипЗначения.КвалификаторыЧисла.Разрядность;
       
ТЧ = ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти;
       
ПЧ = (ТипЗначения.КвалификаторыЧисла.ДопустимыйЗнак = ДопустимыйЗнак.Неотрицательный);
       
СтрФорматЧ = "ЧЦ="+Формат(ДЛ,"ЧДЦ=; ЧН=; ЧГ=0")+"; ЧДЦ="+Формат(ТЧ,"ЧДЦ=; ЧН=; ЧГ=0");
    КонецЕсли;
   
СтрФорматД = "";
    Если
ТипЗначения.СодержитТип(Тип("Дата")) Тогда
       
ТЧ = ТипЗначения.КвалификаторыДаты.ЧастиДаты;
        Если
ТЧ = ЧастиДаты.Дата Тогда
           
СтрФорматД = "ДЛФ=D";
        ИначеЕсли
ТЧ = ЧастиДаты.Время Тогда
           
СтрФорматД = "ДЛФ=T";
        КонецЕсли;
    КонецЕсли;
   
СтрФормат = СтрФорматЧ +
    ?(
ЗначениеЗаполнено(СтрФорматЧ) И ЗначениеЗаполнено(СтрФорматД),"; ","") + СтрФорматД;
    Попытка
       
Элемент.Формат = СтрФормат;
    Исключение
    КонецПопытки;
    Если
ТипЗнч(Значение) = Тип("Число") И ПЧ = Истина И Значение < 0 Тогда
       
// контроль положительности числа по ограничениям в типе данных
       
Значение = -Значение;
    КонецЕсли;
    Если
ТипЗнч(Значение) = Тип("Число") ИЛИ ТипЗнч(Значение) = Тип("Строка")
    ИЛИ
ТипЗнч(Значение) = Тип("Дата")   ИЛИ ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
       
// контроль длины и точности значения по ограничениям в типе данных
       
Значение = ТипЗначения.ПривестиЗначение(Значение);
    КонецЕсли;
   
Элемент.ВыбиратьТип = (Значение = Неопределено);
КонецПроцедуры

 

Приложение 2 (пример кода использования диалога в режиме управляемого приложения):

Пояснения к примеру:
Объект – основной реквизит обработки;
ТестРеквизит – реквизит обработки составного типа (непосредственно редактируется в форме);
ТестРеквизитТип – дополнительное ограничение типа реквизита ТестРеквизит (непосредственно редактируется в форме);
Смысл остальных реквизитов ясен из их названия, пример ориентирован на платформу 8.3.

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

    Если
ТипЗнч(Объект.ТестРеквизит) = Тип("ОписаниеТипов") И Объект.СистемныйДиалог <> Истина Тогда
       
// выбираем значение описания типа в нашем красивом диалоге
       
СтандартнаяОбработка = Ложь;
       
ПараметрыВыбора = Новый Структура("Элемент,ЭтоРедактированиеТипаДанных",Элемент,Истина);
       
ТипОО = ТипIf("ОписаниеОповещения");

       
стПараметры = Новый Структура;
       
стПараметры.Вставить("ЗаголовокДиалога","");
       
стПараметры.Вставить("РежимВыбораТипаДанных",Ложь);
       
стПараметры.Вставить("ТипыВВидеДерева",Объект.ТипыВВидеДерева);
       
стПараметры.Вставить("ТипыВВидеДереваИмяРеквизита","Объект.ТипыВВидеДерева");
       
стПараметры.Вставить("ПоказыватьТипBD",Объект.ПоказыватьТипBD);
       
стПараметры.Вставить("ПоказыватьКонстанты",Объект.ПоказыватьКонстанты);
       
стПараметры.Вставить("ПоказыватьОтчетыОбработки",Объект.ПоказыватьОтчетыОбработки);
       
стПараметры.Вставить("ПоказыватьРегистры",Объект.ПоказыватьРегистры);
       
стПараметры.Вставить("КраткиеИменаГруппТипов",Объект.КраткиеИменаГруппТипов);
       
стПараметры.Вставить("ТипЗначения",Объект.ТестРеквизит);
       
стПараметры.Вставить("ТекущийТип",Неопределено);

        Если
Объект.РежимВыбораТипа = "МодальныйВыбор" Тогда
           
ВыбранноеЗначение = ОткрытьФормуМодально(ПутьКФорме+"EditTypeУправляемое",стПараметры);
            Если
ВыбранноеЗначение <> Неопределено Тогда
               
ТестРеквизитПриВыбореЗначения(ВыбранноеЗначение,ПараметрыВыбора);
            КонецЕсли;
        ИначеЕсли
Объект.РежимВыбораТипа = "ОбработкаВыбора" Тогда
           
ОткрытьФорму(ПутьКФорме+"EditTypeУправляемое",стПараметры,Элемент,ЭтаФорма);
        ИначеЕсли
Объект.РежимВыбораТипа = "ОповещениеОЗакрытии" И ТипОО <> Null Тогда
           
мсПараметры = Новый Массив;
           
мсПараметры.Добавить("ТестРеквизитПриВыбореЗначения");
           
мсПараметры.Добавить(ЭтаФорма);
           
мсПараметры.Добавить(ПараметрыВыбора);
           
Оповещение = Новый(ТипОО,мсПараметры);
           
#Если ВебКлиент Тогда
               
Диалог = Вычислить("ОткрытьФорму(ПутьКФорме+""EditTypeУправляемое"",стПараметры,Неопределено,ЭтаФорма,,,Оповещение)");
           
#Иначе
               
Выполнить("ОткрытьФорму(ПутьКФорме+""EditTypeУправляемое"",стПараметры,Неопределено,ЭтаФорма,,,Оповещение)");
           
#КонецЕсли
       
КонецЕсли;
    ИначеЕсли
Объект.ТестРеквизит = Неопределено И Объект.СистемныйДиалог <> Истина Тогда
       
// при выборе типа - выбираем тип значения в поле ввода в нашем красивом диалоге
       
СтандартнаяОбработка = Ложь;
       
ТестРеквизитВыбратьТип(Элемент,Объект.ТестРеквизит,Объект.ТестРеквизитТип,Ложь);
    Иначе
    КонецЕсли;

КонецПроцедуры


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


&НаКлиенте
Процедура ТестРеквизитОчистка(Элемент, СтандартнаяОбработка)
    Перем
Оповещение;
    Перем
ПараметрыОповещения;
   
СтандартнаяОбработка = Ложь;
   
ТипОО = ТипIf("ОписаниеОповещения");
   
ПараметрыОповещения = Новый Структура("Элемент",Элемент);
   
Меню = Новый СписокЗначений;
   
Меню.Добавить(1, НСтр("ru = 'Выбрать тип значения'; en = 'Select data type'"),,БиблиотекаКартинок.ВыбратьТип);
    Если (
Объект.ТестРеквизитТип.Типы().Количество()=1) Тогда
       
Меню.Добавить(2, НСтр("ru = 'Пустое значение'; en = 'Empty value'"),,БиблиотекаКартинок.Выбрать);
    КонецЕсли;
   
Выбор0 = Меню.Добавить(0, НСтр("ru = 'Очистить'; en = 'Clear'"),,БиблиотекаКартинок.Очистить);
    Если
Объект.РежимВыбораТипа <> "МодальныйВыбор" И ТипЗнч(ЭтаФорма) = ТипIf("УправляемаяФорма") И ТипОО <> Null Тогда
       
мсПараметры = Новый Массив;
       
мсПараметры.Добавить("ТестРеквизитОчисткаПродолжение");
       
мсПараметры.Добавить(ЭтаФорма);
       
мсПараметры.Добавить(ПараметрыОповещения);
       
Оповещение = Новый(ТипОО,мсПараметры);
       
ЭтаФорма.ПоказатьВыборИзСписка(Оповещение,Меню,Элемент,Выбор0);
    Иначе
       
Выбор = ЭтаФорма.ВыбратьИзСписка(Меню,Элемент,Выбор0);
       
ТестРеквизитОчисткаПродолжение(Выбор, ПараметрыОповещения);
    КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура ТестРеквизитОчисткаПродолжение(Выбор, ПараметрыОповещения) Экспорт
    Перем
Элемент;
    Если
Выбор = Неопределено Тогда
        Возврат;
    КонецЕсли;
    Если
ТипЗнч(ПараметрыОповещения) = Тип("Структура") Тогда
       
ПараметрыОповещения.Свойство("Элемент",Элемент);
    КонецЕсли;
    Если
Выбор.Значение = 0 Тогда
       
Объект.ТестРеквизит = Неопределено;
       
ТестРеквизитПриИзменении(Элемент);
    ИначеЕсли
Выбор.Значение = 2 Тогда
       
Объект.ТестРеквизит = Объект.ТестРеквизитТип.ПривестиЗначение(Неопределено);
       
ТестРеквизитПриИзменении(Элемент);
    ИначеЕсли
Выбор.Значение = 1 Тогда
       
ТестРеквизитВыбратьТип(Элемент,Объект.ТестРеквизит,Объект.ТестРеквизитТип,Ложь);
    КонецЕсли;
КонецПроцедуры


&НаКлиенте
Процедура ТестРеквизитВыбратьТип(Элемент,Значение,ТипЗначения,ЭтоРедактированиеТипаДанных)
    Перем
Оповещение;
    Перем
ПараметрыВыбора;

   
ПараметрыВыбора = Новый Структура("Элемент,ЭтоРедактированиеТипаДанных",Элемент,ЭтоРедактированиеТипаДанных);
   
ТипОО = ТипIf("ОписаниеОповещения");
    Если
ТипЗнч(ТипЗначения.ПривестиЗначение(Значение)) = ТипЗнч(Значение) Тогда
       
ТекущийТип = ТипЗнч(Значение);
    Иначе
// для простых типов "двоичные данные", "хранилище значения" и "ключ записи регистра учета"
          // - результат приведения значения почему-то строковое значение
       
ТекущийТип = ТипЗнч(Неопределено);
    КонецЕсли;

   
// установка параметров диалога
   
стПараметры = Новый Структура;
   
// 1. Заголовок диалога редактирования/выбора типа
    //    по умолчанию: "Редактирование типа данных"/"Выбор типа данных"
   
стПараметры.Вставить("ЗаголовокДиалога","");
   
// 2. Режим работы диалога редактирования/выбора типа (обязателен!)
   
стПараметры.Вставить("РежимВыбораТипаДанных",(ЭтоРедактированиеТипаДанных <> Истина));
   
// 3. Представление списка типов в диалоге (по умолчанию - многоуровневое "ДеревоЗначений")
   
стПараметры.Вставить("ТипыВВидеДерева",Объект.ТипыВВидеДерева);
   
// 4. Путь в данных формы для сохранения измененного в диалоге представления списка типов
   
стПараметры.Вставить("ТипыВВидеДереваИмяРеквизита","Объект.ТипыВВидеДерева");
   
// 5. Признак показа в диалоге дополнительных типов "ДвоичныеДанные", "СписокЗначений" и т.п.
    //    (параметр добавлен для доступа к квалификаторам двоичных данных)
   
стПараметры.Вставить("ПоказыватьТипBD",Объект.ПоказыватьТипBD);
   
// 6. Признак показа в диалоге типов менелжеров записи значений констант
    //    (недоступно на клиенте в управляемом приложения!)
   
стПараметры.Вставить("ПоказыватьКонстанты",Объект.ПоказыватьКонстанты);
   
// 7. Признак показа в диалоге типов объектов отчетов и обработок
    //    (недоступно на клиенте в управляемом приложения!)
   
стПараметры.Вставить("ПоказыватьОтчетыОбработки",Объект.ПоказыватьОтчетыОбработки);
   
// 8. Признак показа в диалоге типов ключей записей регистров учета
   
стПараметры.Вставить("ПоказыватьРегистры",Объект.ПоказыватьРегистры);
   
// 9. Признак показа кратких имен групп ссылочных типов данных
    //    (например, "Справочник" вместо "СправочникСсылка")
   
стПараметры.Вставить("КраткиеИменаГруппТипов",Объект.КраткиеИменаГруппТипов);
   
//10. Составной тип данных для редактирования или для выбора текущего типа значения реквизита
    //    (обязателен!)
   
стПараметры.Вставить("ТипЗначения",ТипЗначения);
   
//11. Тип, определяющий текущую строку в списке типов при открытии
    //    (в режиме редактирования типа можно не указывать)
   
стПараметры.Вставить("ТекущийТип",ТекущийТип);

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


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


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


&НаКлиенте
Процедура ТестРеквизитПриИзменении(Элемент)
   
ПолеФормыКонтрольТипЗначения(Элемент,Объект.ТестРеквизитТип,Объект.ТестРеквизит);
КонецПроцедуры


&НаКлиенте
Процедура ПолеФормыКонтрольТипЗначения(Элемент,ТипЗначения,Значение)
   
СтрФорматЧ = "";
   
ПЧ = Неопределено;
    Если
ТипЗначения.СодержитТип(Тип("Число")) Тогда
       
ДЛ = ТипЗначения.КвалификаторыЧисла.Разрядность;
       
ТЧ = ТипЗначения.КвалификаторыЧисла.РазрядностьДробнойЧасти;
       
ПЧ = (ТипЗначения.КвалификаторыЧисла.ДопустимыйЗнак = ДопустимыйЗнак.Неотрицательный);
       
СтрФорматЧ = "ЧЦ="+Формат(ДЛ,"ЧДЦ=; ЧН=; ЧГ=0")+"; ЧДЦ="+Формат(ТЧ,"ЧДЦ=; ЧН=; ЧГ=0");
    КонецЕсли;
   
СтрФорматД = "";
    Если
ТипЗначения.СодержитТип(Тип("Дата")) Тогда
       
ТЧ = ТипЗначения.КвалификаторыДаты.ЧастиДаты;
        Если
ТЧ = ЧастиДаты.Дата Тогда
           
СтрФорматД = "ДЛФ=D";
        ИначеЕсли
ТЧ = ЧастиДаты.Время Тогда
           
СтрФорматД = "ДЛФ=T";
        КонецЕсли;
    КонецЕсли;
   
СтрФормат = СтрФорматЧ +
    ?(
ЗначениеЗаполнено(СтрФорматЧ) И ЗначениеЗаполнено(СтрФорматД),"; ","") + СтрФорматД;
    Попытка
       
Элемент.Формат = СтрФормат;
    Исключение
    КонецПопытки;
    Попытка
       
Элемент.ФорматРедактирования = СтрФормат;
    Исключение
    КонецПопытки;
    Если
ТипЗнч(Значение) = Тип("Число") И ПЧ = Истина И Значение < 0 Тогда
       
// контроль положительности числа по ограничениям в типе данных
       
Значение = -Значение;
    КонецЕсли;
    Если
ТипЗнч(Значение) = Тип("Число") ИЛИ ТипЗнч(Значение) = Тип("Строка")
    ИЛИ
ТипЗнч(Значение) = Тип("Дата")   ИЛИ ТипЗнч(Значение) = Тип("ДвоичныеДанные") Тогда
       
// контроль длины и точности значения по ограничениям в типе данных
       
Значение = ТипЗначения.ПривестиЗначение(Значение);
    КонецЕсли;
   
Элемент.ВыбиратьТип = (Значение = Неопределено);
КонецПроцедуры

 

выбор тип альтернативный

См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    171894    962    403    

924

Инструментарий разработчика Чистка данных Свертка базы Инструменты администратора БД Системный администратор Программист Руководитель проекта Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются серверные и файловые базы, управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя. Решение в Реестре отечественного ПО

8400 руб.

20.08.2024    14383    109    46    

108

Пакетная печать Печатные формы Инструментарий разработчика Программист Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

22200 руб.

06.10.2023    17314    43    15    

75

Инструментарий разработчика Программист Платформа 1С v8.3 1C:Бухгалтерия Платные (руб)

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    27305    96    48    

138

Инструменты администратора БД Инструментарий разработчика Роли и права Программист Платформа 1С v8.3 1C:Бухгалтерия Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

15000 руб.

10.11.2023    11917    45    27    

67

SALE! %

Инструментарий разработчика Инструменты администратора БД Системный администратор Программист Платформа 1С v8.3 Управляемые формы 1C:Бухгалтерия Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

4800 3840 руб.

14.01.2013    191284    1152    0    

920

Инструментарий разработчика Программист 8.3.14 Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

20000 руб.

07.10.2021    18101    7    32    

42

Инструментарий разработчика Платформа 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

Разработка Конструктор автоматизированных рабочих мест "Конструктор АРМ" реализована в виде расширения и является универсальным инструментом для создания АРМ любой сложности в пользовательском режиме.

3600 руб.

27.12.2024    1136    2    0    

5

Имеет ли практический смысл при разработке универсального функционала подобного этому создавать версию функционала для платформы 8.1


Да имеет, для нас это актуально. Есть рабочие базы, работающие под 8.1 (8.43%, 7 голосов)
8.43%
Вряд ли стоит делать "дангрейд" для платформы 8.1, поскольку она практически неиспользуется (44.58%, 37 голосов)
44.58%
Делать что-либо для 8.1 - это пустая трата времени. (46.99%, 39 голосов)
46.99%

Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. yuraos 1005 18.02.16 08:28 Сейчас в теме
Всем привет и доброго времени суток!

1. Версия для 8.1 пока не готова (сделаю быстрее, если будут особые пожелания).

2. В будущем в контекстное меню думаю вставить пару подменю:
- для выбора составного типа "Характеристика.ИмяПланаВидовХарактеристик
- для выбора составного типа "ОпределяемыйТип.ИмяОпределяемогоТипа"
2. ixijixi 1979 18.02.16 09:10 Сейчас в теме
Ну явно не хватает фильтра по типам
Прикрепленные файлы:
adhocprog; yuraos; +2 Ответить
3. yuraos 1005 18.02.16 10:30 Сейчас в теме
(2) the1,
да, увы, да не хватает
....
также не хватает в 1с поиска в таблицах по регулярным выражениям
(ну хотя бы по строке шаблона оператора ПОДОБНО).

А в дереве значений управляемой формы - вообще никакие поиски не работают
(приходится при необходимости их индексировать)!!!!!

вот когда 1С дорастет до выше сказанного - сделаю и отбор по строке в наименовании

;)
4. yuraos 1005 18.02.16 10:37 Сейчас в теме
(2)(3)
можно конечно извратиться с помощью запроса...
но делать серверный вызов для поиска в таблице на клиенте -
- это ЯВНЫЙ НЕ ФЭНШУЙ !!!!
5. ixijixi 1979 20.02.16 09:14 Сейчас в теме
6. yuraos 1005 20.02.16 12:25 Сейчас в теме
(5) the1,
понимаю что это можно сделать через запрос.
***
НО неохота делать это для управляемой формы:

7. yuraos 1005 20.02.16 12:25 Сейчас в теме
(6)
1. так-как потребуется серверный вызов с неизбежными тормозами при поиске.
(наверное можно наверное извратиться с ВРЕМЕННЫМ ХРАНИЛИЩЕМ, чтобы сделать этот вызов ВНЕКОНТЕКСТНЫМ).
8. yuraos 1005 20.02.16 12:27 Сейчас в теме
(6)
2. после получения списка удовлетворяющих условиям поиска строк
придется установить для этих строк признак отбора и включить сам отбор строк в таблице формы по этому признаку.

Но в настоящий момент
реально отбор строк в таблице управляемой формы работает только для таблицы формы связанной с "ТаблицейЗначения"
ДЛЯ "ДЕРЕВА ЗНАЧЕНИЙ" В УПРАВЛЯЕМОЙ ФОРМЕ ОТБОР СТРОК НЕ РАБОТАЕТ !!!
(в дополнении с отсутствием обычного поиска строк)
9. yuraos 1005 20.02.16 12:36 Сейчас в теме
(6)(7)(8)
так что этот поиск в настоящий момент можно сделать только в одном частном случае
(в случае представления таблицы типов в виде "ТаблицыЗначений" в управляемой форме)
***
и думаю что делать это не стоит ...
... не хочется нарушать универсальность функциональности в разных режимах.
10. DrAku1a 1749 25.02.16 02:42 Сейчас в теме
(2) the1, Юзаем пока что "Ctrl+F" в дереве.
12. yuraos 1005 13.03.16 08:50 Сейчас в теме
ДАЛЬНЕЙШИЕ ПЛАНЫ:

1. По замечанию the1(2):
Таки сделаю поиск по строке, похожий на тот, что в системном диалоге.
Но сразу хочу сказать что получится довольно стремно -
- без выделения цветом вхождений строки поиска в таблице найденных строк.
(так как использовать тип "ФорматированнаяСтрока" в таблицах форм под 8.2 и 8.3 нельзя)
Может что-то изменится под 8.4 ...
Хотя на вряд ли, юзабилити у 1С - не в приоритете.

2. Судя по опросу, все-таки есть народ, который все еще варится на платформе 8.1.
И поскольку на моей новой работе тоже оказались базы под 8.1 -
- ДАУНГРЕЙДУ ДЛЯ 8.1 БЫТЬ !!!
...
но после добавления поиска по строке.
13. yuraos 1005 17.04.16 10:21 Сейчас в теме
Всем доброго времени суток!!!
Обновлены файлы поставки::

Опубликована версия 8.3.1.2 от 11.04.2016
Опубликована версия 8.1.1.2 от 11.04.2016 - обещанный даунгрэйд для платформы 1с-8.1

Новое в версиях:
- исполнено пожелание (2) the1
добавлен поиск по строке в имени/синониме типа с разными дополнительными опциями

(пришлось малость повозиться - но что не сделаешь для хорошего человека! ).

- добавлен показ только отмеченных строк в списке типов.


- добавлен показ типов "ХранилищеЗначений" и "УникальныйИдентификатор".
(особого смысла нет, но пусть будут - может у кого есть нештатные средства для редактирования этих типов)..

- подправлены кое какие мелкие косячки.
14. ixijixi 1979 16.08.16 15:11 Сейчас в теме
(13) от теперь полная крутотень!
11. yuraos 1005 13.03.16 08:36 Сейчас в теме
Всем доброго времени суток!
***
Обновлены файлы поставки::
Опубликована версия 1.1 от 13.03.2016
В контекстное меню флага "Составной тип данных" добавлено два подменю:
- "Выбрать тип характеристик" (Рис.14.2, для установки в списке составного типа "Характеристика.ИмяПВХ")
- "Выбрать определяемый тип" (Рис.14.3, для установки в списке составного типа "ОпределяемыйТип.ИмяОТ")
15. yuraos 1005 14.01.18 16:20 Сейчас в теме
Всем доброго времени суток!
***
Обновлены файлы поставки:
Опубликована версия 1.3 от 02.01.2018
+ добавлен показ типа "СписокЗначений" при показе дополнительных типов (вместе с типом "ДвоичныеДанные").
+ в группу типов "Системные перечисления" добавлен тип "СтатусСообщения".
+ добавлен показ типов ключей записей регистров учета (сведений, накопления, бухгалтерии и расчета).
+ добавлен показ типов менеджеров констант, а также типов объектов встроенных отчетов и обработок
(опция не имеет смысла для управляемой формы диалога из-за недоступности типов).
+ добавлена возможность испоьзования кратких названий групп ссылочных типов
("Справочники" вместо "СправочникСсылка").
+ добавлена возможность указания заголовка диалога, отличного от выводимого по умолчанию.
+ тип параметра открытия диалога "ТипыВВидеДерева" , определяющий представление списка типов,
изменен на числовой (с сохранением поведения для обратной совместимости):
0 - "список", 1 - "многоуровневое дерево", 2 - "одноуровневое дерево".
+ добавлена смена представления списка типов в диалоге с возможностью сохранения
выбранного значения в настройках формы-владельца, открывшей диалог.
+ исправлены замеченные ошибки.
16. yuraos 1005 14.01.18 16:23 Сейчас в теме
(15) Буду благодарен тем,
кто подскажет как обойти глюки в управляемой форме:

---------------------------------------------------------------------------------------------
Под платформой 8.3.7 и выше в форме "EditTypeУправляемое"
при изменении представления списка типов с многоуровневого на одноуровневый и наоборот,
а также при включении/отключении режима показа только отмеченных строк в списке,
наблюдается неприятный визуальный эффект:
форма диалога "самостоятельно" увеличивает размер по вертикали и горизонтали.

---------------------------------------------------------------------------------------------
17. yuraos 1005 17.01.18 05:47 Сейчас в теме
(15)

1. Показ менеджеров констант и ключей записей регистров в диалоге
добавлен в связи с возможностью его использования
для выбора типов объектов в универсальных обработках
массовой регистрации изменений данных в узлах планов обмена.

2. Показ объектов встроенных отчетов и обработок в диалоге
добавлен в связи с возможностью его использования
для выбора типов объектов в гибких механизмах
программного разграничения доступа.
18. yuraos 1005 05.02.21 07:05 Сейчас в теме
111.txt
Прикрепленные файлы:
111.txt
19. yuraos 1005 14.10.22 14:58 Сейчас в теме
!AAA.txt
Прикрепленные файлы:
!AAA.txt
20. AlexanderIvanov 89 25.07.24 20:00 Сейчас в теме
(EditType83(1.3) .epf 189,38Kb) - если кто планирует вставлять это в свои рабочие базы, обратите внимание на код модуля формы "EditTypeУправляемое" строка 2230. Есть ли что-то подобное - не знаю, всё не проверял.
21. yuraos 1005 28.07.24 08:23 Сейчас в теме
(20) представление списка типов по новому
Оставьте свое сообщение