Сначала сделали определяемый тип. А потом выяснилось, что некоторые типы метаданных из этого определяемого типа в некоторых документах не нужны. Да, ошибка планирования. Но время ушло.
Можно ли в некоторых документах ограничить реквизит определяемого типа только некоторыми типами метаданных из состава типов определяемого типа данных?
---
```1c
    Процедура МоёПоле_НачалоВыбора(Элемент, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

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

    НачалоВыбораЗначенияДокументаСоставногоТипа(ЭтотОбъект, ЭтаФорма, Элемент, СтандартнаяОбработка, Отбор, "СчетаФактуры", ОграничениеТипов);

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

    Процедура НачалоВыбораЗначенияДокументаСоставногоТипа(ДокументОбъект, ФормаДокумента, ЭлементФормы,
    СтандартнаяОбработка, СтруктураОтбора, ИмяТабличнойЧасти,ОграничениеТипов = Неопределено)

    СтандартнаяОбработка = Ложь;

    // Заполним возможный список типов документов, которые могут быть в этом реквизите.
    СписокТипов = Новый СписокЗначений;

    Если ПустаяСтрока(ИмяТабличнойЧасти) Тогда // Шапка документа
    МассивТипов = ДокументОбъект.Метаданные().Реквизиты[ЭлементФормы.Данные].Тип.Типы();
    Иначе // Табличная часть
    ИмяКолонки = ФормаДокумента.ЭлементыФормы[ИмяТабличнойЧасти].ТекущаяКолонка.Имя;
    МассивТипов = ДокументОбъект.Метаданные().ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты[ИмяКолонки].Тип.Типы();
    КонецЕсли;

    Если МассивТипов.Количество() = 1 Тогда
    ОбъектОписанияМетаданных = Метаданные.НайтиПоТипу(МассивТипов[0]);
    ВыбранныйТип = ОбъектОписанияМетаданных.Имя;
    Иначе

    Для каждого ЭлементМассива Из МассивТипов Цикл

    Если не ОграничениеТипов = Неопределено Тогда
    Если ОграничениеТипов.Найти(ЭлементМассива) = Неопределено Тогда
    // Тип не вписывается в полученные ограничения
    Продолжить;
    КонецЕсли;
    КонецЕсли;

    ПустоеЗначение = Новый(ЭлементМассива);
    ОбъектОписанияМетаданных = ПустоеЗначение.Метаданные();
    СписокТипов.Добавить(ОбъектОписанияМетаданных.Имя, ОбъектОписанияМетаданных.Представление());

    КонецЦикла;

    СписокТипов.СортироватьПоПредставлению();

    ВыбранныйЭлемент = ФормаДокумента.ВыбратьИзСписка(СписокТипов, ЭлементФормы);

    Если ВыбранныйЭлемент = Неопределено Тогда // Отказ от выбора
    Возврат;
    КонецЕсли;

    ВыбранныйТип = ВыбранныйЭлемент.Значение;

    КонецЕсли;

    Если ТипЗнч(ЭлементФормы.Значение) <> Тип("ДокументСсылка." + ВыбранныйТип) Тогда
    ЭлементФормы.Значение = Документы[ВыбранныйТип].ПустаяСсылка();
    КонецЕсли;

    ФормаВыбора = Документы[ВыбранныйТип].ПолучитьФормуВыбора(,ЭлементФормы,);
    Если ЗначениеЗаполнено(ЭлементФормы.Значение) Тогда
    ФормаВыбора.ПараметрТекущаяСтрока = ЭлементФормы.Значение;
    КонецЕсли;

    ФормаВыбора.Открыть();

    КонецПроцедуры
```
---
исходите из того, что определяемый тип существует только в конфигураторе (еще доступен через метаданные, но не суть). По время работы вместо определяемого типа будут существовать (подставлены во время компиляции) только "обычные" типы в реквизитах документов, которые входят в определяемый тип. Т.е. работаете как обычно со списком доступных типов.
---
конечно можно. Проверяйте какой тип метаданных ввел пользователей и принимайте решение разрешено или нет.
---
Нет, ПОСЛЕ ввода - это уже не то. Мне нужно, чтобы нельзя было выбрать запрещённые типы данных.
Там у нас в определяемом типа собраны банковские счета, кассы, сотрудники и физлица. Но в некоторых случаях нужно, чтобы нельзя было провалиться в справочники сотрудников/физлиц, а в других документах нельзя было провалиться в счета/кассы.
---
тоже можно.
---
Как?
---
для ОФ событие НачалоВыбора()
Указываем СтандартнаяОбработка = Ложь и рисуем свой код обработчика где задаем допустимый список типов метаданных для выбора.
---
Пробовал.
Какими методами можно ограничить тип?
---
покажите ваш код
---
Да нет пока кода. Не придумал ещё. Если бы придумал, было бы проще.
---
```1c
    Процедура МоёПоле_НачалоВыбора(Элемент, СтандартнаяОбработка)

    СтандартнаяОбработка = Ложь;

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

    НачалоВыбораЗначенияДокументаСоставногоТипа(ЭтотОбъект, ЭтаФорма, Элемент, СтандартнаяОбработка, Отбор, "СчетаФактуры", ОграничениеТипов);

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

    Процедура НачалоВыбораЗначенияДокументаСоставногоТипа(ДокументОбъект, ФормаДокумента, ЭлементФормы,
    СтандартнаяОбработка, СтруктураОтбора, ИмяТабличнойЧасти,ОграничениеТипов = Неопределено)

    СтандартнаяОбработка = Ложь;

    // Заполним возможный список типов документов, которые могут быть в этом реквизите.
    СписокТипов = Новый СписокЗначений;

    Если ПустаяСтрока(ИмяТабличнойЧасти) Тогда // Шапка документа
    МассивТипов = ДокументОбъект.Метаданные().Реквизиты[ЭлементФормы.Данные].Тип.Типы();
    Иначе // Табличная часть
    ИмяКолонки = ФормаДокумента.ЭлементыФормы[ИмяТабличнойЧасти].ТекущаяКолонка.Имя;
    МассивТипов = ДокументОбъект.Метаданные().ТабличныеЧасти[ИмяТабличнойЧасти].Реквизиты[ИмяКолонки].Тип.Типы();
    КонецЕсли;

    Если МассивТипов.Количество() = 1 Тогда
    ОбъектОписанияМетаданных = Метаданные.НайтиПоТипу(МассивТипов[0]);
    ВыбранныйТип = ОбъектОписанияМетаданных.Имя;
    Иначе

    Для каждого ЭлементМассива Из МассивТипов Цикл

    Если не ОграничениеТипов = Неопределено Тогда
    Если ОграничениеТипов.Найти(ЭлементМассива) = Неопределено Тогда
    // Тип не вписывается в полученные ограничения
    Продолжить;
    КонецЕсли;
    КонецЕсли;

    ПустоеЗначение = Новый(ЭлементМассива);
    ОбъектОписанияМетаданных = ПустоеЗначение.Метаданные();
    СписокТипов.Добавить(ОбъектОписанияМетаданных.Имя, ОбъектОписанияМетаданных.Представление());

    КонецЦикла;

    СписокТипов.СортироватьПоПредставлению();

    ВыбранныйЭлемент = ФормаДокумента.ВыбратьИзСписка(СписокТипов, ЭлементФормы);

    Если ВыбранныйЭлемент = Неопределено Тогда // Отказ от выбора
    Возврат;
    КонецЕсли;

    ВыбранныйТип = ВыбранныйЭлемент.Значение;

    КонецЕсли;

    Если ТипЗнч(ЭлементФормы.Значение) <> Тип("ДокументСсылка." + ВыбранныйТип) Тогда
    ЭлементФормы.Значение = Документы[ВыбранныйТип].ПустаяСсылка();
    КонецЕсли;

    ФормаВыбора = Документы[ВыбранныйТип].ПолучитьФормуВыбора(,ЭлементФормы,);
    Если ЗначениеЗаполнено(ЭлементФормы.Значение) Тогда
    ФормаВыбора.ПараметрТекущаяСтрока = ЭлементФормы.Значение;
    КонецЕсли;

    ФормаВыбора.Открыть();

    КонецПроцедуры
```
---
Насколько я понял, предлагается просто переопределить тип реквизита?
---
это вам для примера. Поправить код под свои нужды не составит труда.
---
Я думал есть возможность работать с самим определяемым типом. Не подумал, что можно переопределить тип самого элемента формы.
---
сам тип определяется на стадии конфигуратора.
---
исходите из того, что определяемый тип существует только в конфигураторе (еще доступен через метаданные, но не суть). По время работы вместо определяемого типа будут существовать (подставлены во время компиляции) только "обычные" типы в реквизитах документов, которые входят в определяемый тип. Т.е. работаете как обычно со списком доступных типов.