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

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

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

Нашел в модуле менеджера ОбработкаПолученияФормы. Казалось уже, что вот оно спасение, дописать логику там, но вот целительный параметр ВладелецФормы по умолчанию туда не передается. То есть понять, что работа идет в нетиповом механизме я не могу.

Что предложите, коллеги?
---
команды создания и копирования это один и тот же обработчик. А редактирование зачем?
И того только 2 обработчика. Выбор и ПередНачаломДобавления.
---
Надо отказаться от автозаполнения командной панели на вашей форме и создать нужные кнопки и написать процедуры открытия и копирования и создания документа с нужной вам формой. Ну и отработать действия выбора на текущей строке списка открытием документа с вашей формой.
---
Поясните, в каких случаях должна открываться типовая форма справочника?
---
в коде же все очевидно.
 когда мы не вошли в финальное условие, а почему не вошли указано в комментах

если совсем просто, то когда ИсточникФормыПараметры = Неопределено
только там необходимо убрать
 ВыбраннаяФорма = "ФормаЗаполнение";
СтандартнаяОбработка = Ложь;
это моя специфика
---
Проще сказать по другому: для ВСЕХ действий, отличных от действий на моей самописной форме списка, должна открываться типовая форма, как и раньше.
А вот для всех действий на МОЕЙ форме списка, при создании, копировании, открытии, итп, должна открываться МОЯ форма элемента.
---
если этим сотрудникам определенного отдела надо работать только со своими формами (и типовые их вообще не касаются), то определять по пользователю (новый параметр в пвх добавить, или еще как-нибудь)
---
А если писать Ваш
```1c
    ВидФормы = "_ФормаДляОтдельныхЛичностей"
```
, что откроется?
---
Я вас не понял... Где писать? Мне нужно переопределить форму элемента ТОЛЬКО если пользователь открывает ее с МОЕЙ формой списка сейчас.
---
а чем переопределение обработчиков которые открывают форму элемента не устраивает? Это нормальная практика при переопределении стандартной логики открытия формы.
СтандартнаяОбработка = Ложь
ОткрытьФорму(НужнаяФорма, ПараметрыФормы)
---
Придётся тогда ещё переопределять команды создания, копирования, редактирования на форме списка.
---
команды создания и копирования это один и тот же обработчик. А редактирование зачем?
И того только 2 обработчика. Выбор и ПередНачаломДобавления.
---
А редактирование зачем
Это то, что по F2.

Да, 3 события переопределить придётся:

```1c
    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.ФормаЭлемента", Новый Структура("Ключ", Элемент.ТекущаяСтрока));
    КонецПроцедуры

    &НаКлиенте
    Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

    Если Группа Тогда
    Возврат
    КонецЕсли;

    Отказ = Истина;

    Если Копирование Тогда
    ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.ФормаЭлемента", Новый Структура("ЗначениеКопирования", Элемент.ТекущаяСтрока));
    Иначе
    ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.ФормаЭлемента");
    КонецЕсли;

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

    &НаКлиенте
    Процедура СписокПередНачаломИзменения(Элемент, Отказ)
    Отказ = Истина;
    ОткрытьФорму("ВнешняяОбработка.ВнешняяОбработка1.Форма.ФормаЭлемента", Новый Структура("Ключ", Элемент.ТекущаяСтрока));
    КонецПроцедуры
```
---
Это то, что по F2.
Я знаю что такое Редактирование. Вопрос был, зачем его вообще оставлять?
Убираются из списка кнопок, кнопка Редактирование. Этого достаточно. Нужно же открытие элемента, а не непосредственное редактирование.
А при этом обработчик редактирование делает тоже что и Выбор. Так зачем его оставлять?

```1c
    &НаКлиенте
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПараметрыФормы = Новый Структура("Ключ", Элемент.ТекущаяСтрока);
    ОткрытьФорму("Справочник.Справочник5.Форма.ФормаЭлемента1",ПараметрыФормы,Элемент);
    КонецПроцедуры

    &НаКлиенте
    Процедура СписокПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
    Если Не Группа Тогда
    Отказ = Истина;
    ПараметрыФормы = Новый Структура("ЗначениеКопирования", ?(Копирование,Элемент.ТекущаяСтрока, Неопределено));
    ОткрытьФорму("Справочник.Справочник5.Форма.ФормаЭлемента1",ПараметрыФормы,Элемент);
    КонецЕсли;
    КонецПроцедуры
```

Этого достаточно в большинстве случаев.
---
как уже написали сделал расширение со своим кодом.
В ЦРМ обычно делают замену на форму ЦРМ без выбора на типовую.
Либо ролями. Но выбора все равно нет.
---
Примерно так, ИсточникФормыПараметры - добавленный параметр формы со всякими данными из формы вледельца

```1c
    Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)

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

    // Имя формы в этой обработке должно быть равно имени документа в метаданных
    КоллОбМдФормы = Обработки.Расш1_УпрОргВыбрать.Создать().Метаданные().Формы;
    ИсточникИмя = ИсточникФормыСсылка.Метаданные().Имя;
    Если КоллОбМдФормы.Найти(ИсточникИмя) = Неопределено Тогда
    ТекстОшибки = "
    |Для документа " +""+ИсточникИмя+"" + "
    |Не задана форма выбора для управленческой организации.
    |в обработке "Обработка.Расш1_УпрОргВыбрать"
    |
    |Обратитесь к разработчику!";
    КонецЕсли;

    Если ПустаяСтрока(ТекстОшибки) Тогда
    ; // Нет ошибок при получении формы
    СтандартнаяОбработка = Ложь; // Отказываемся от открытия основной формы - будет открыта форма с именем как в параметре ВыбраннаяФорма
    ВыбраннаяФорма = ИсточникИмя; // Назначаем имя формы выбора
    Иначе
    ; // Есть ошибки при получении формы, значит форма не будет создана и сразу вызываем исключение
    ВызватьИсключение ТекстОшибки;
    КонецЕсли;

    КонецПроцедуры
```
---
Пытаюсь понять по смыслу ваш код... Пока сходу не получается понять как вы получаете ссылку на форму-владелец. Сейчас еще подумаю...
---
Параметры.Свойство("ИсточникФормыПараметры", ИсточникФормыПараметры);
Ну лично я у себя данного параметра среди ключей структуры не вижу вообше не при каких обстоятельствах.
По логике я всегда используя ваш код буду падать в возврат сразу.
В качеств параметров при открытии лемента из формы списка идут только "Ключ" и "ЭтоГруппа".

```1c
    //ТЕСТ
    ИсточникФормыПараметры = Неопределено;
    Параметры.Свойство("ИсточникФормыПараметры", ИсточникФормыПараметры);
    Если ИсточникФормыПараметры = Неопределено Тогда
    а = 1;
    КонецЕсли;
    //
```

Короче в таком коде а = 1 всегда, как при открытии элемента с типовой формы, так и с нетиповой.
---
Используйте расширения. Сделайте свои формы через расширения. Если не требуются типовые.
---
ну ничего сложно в задаче не вижу:
1. В форме списка делаем обработчик события "Выбор"

```1c
    Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;

    ОткрытьФорму("Документ.Документ1.ФормаОбъекта", Новый Структура("ОткрытьМоюФорму", Истина), ЭтаФорма);
    КонецПроцедуры
```

2. В обработчике ОбработкаПолученияФормы

```1c
    Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)

    Если Параметры.Свойство("ОткрытьМоюФорму") Тогда
    СтандартнаяОбработка = Ложь;
    ВыбраннаяФорма = "Документ.Документ1.Форма.ФормаДокументаМоя";
    КонецЕсли;

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

Функции создать, скопировать из формы списка скрываем, делаем свои команды, где открываем форму нового аналогично ОткрытьФорму("Документ.Документ1.ФормаОбъекта", Новый Структура("ОткрытьМоюФорму", Истина), ЭтаФорма);
---
Надо отказаться от автозаполнения командной панели на вашей форме и создать нужные кнопки и написать процедуры открытия и копирования и создания документа с нужной вам формой. Ну и отработать действия выбора на текущей строке списка открытием документа с вашей формой.