1С:Предприятие 8.3 (8.3.10.2561) в режиме совместимости с версией 8.3.4
Управляемая форма, у неё имеется независимый реквизит с типом "Произвольный", на самой форме Поле ввода, связанное с реквизитом и работающее в режиме выбора из списка с выставленным флагом "РежимВыбораИзСписка".
СписокВыбора заполняется парами Представление и Значение, где представление это строка, а в качестве значения используется ФиксированнаяСтруктура.
При выборе любого значения из выпадающего списка соответствующее преставление отображается в поле формы, а связанный реквизит приобретает тип "ФиксированнаяСтруктура" с соответствующим значением, которое было выбрано. Пока все работает, как и задумывалось, но стоит только изменить значения других полей формы, связанных с реквизитами ссылочного типа, или произвести манипуляции с табличными частями, то выбранное преставление в поле очищается и поле становится пустым. При этом значение самого реквизита, связанного с полем остается без изменения и соответствует выбранному ранее значению.
В чем тут подвох? Как сделать так, чтобы поле всегда отображало преставление, связанное с выбранным значением?
---
Реализовал идею (7) в своем варианте, с соответствием вместо массива. Все работает как нужно, представление не сбрасывается, а если точнее, то его вообще нет, вместо представления само значение в текстовом виде, по которому потом из соответствия выбирается реальное значение.
Вот код:

```1c
    &НаКлиенте
    Перем ВариантВыходаПродукцииХранение;

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    ВариантВыходаПродукцииХранение = ЗаполнитьВариантыПроцентовВыходаПродукции();
    КонецПроцедуры

    &НаСервере
    Функция ЗаполнитьВариантыПроцентовВыходаПродукции()

    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    | ВариантыПроцентовВыходаПродукции.Мука КАК Мука,
    | ВариантыПроцентовВыходаПродукции.Отруби КАК Отруби
    |ИЗ
    | РегистрСведений.ВариантыПроцентовВыходаПродукции КАК ВариантыПроцентовВыходаПродукции
    |
    |УПОРЯДОЧИТЬ ПО
    | Мука,
    | Отруби"
    );

    ВариантВыходаПродукцииХранение = Новый Соответствие();

    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда

    Выборка = РезультатЗапроса.Выбрать();
    СписокВариантов = Элементы.ВариантВыходаПродукции.СписокВыбора;

    Пока Выборка.Следующий() Цикл
    Представление = "Мука - <" + Выборка.Мука + "%> | Отруби - <" + Выборка.Отруби + "%>";
    Значение = Новый ФиксированнаяСтруктура("Мука,Отруби", Выборка.Мука, Выборка.Отруби);

    ВариантВыходаПродукцииХранение.Вставить(Представление, Значение);
    СписокВариантов.Добавить(Представление);
    КонецЦикла;

    КонецЕсли;

    Возврат ВариантВыходаПродукцииХранение;

    КонецФункции

    &НаКлиенте
    Процедура ВариантВыходаПродукцииПриИзменении(Элемент)
    ХранимоеЗначениеВыбора =ВариантВыходаПродукцииХранение.Получить(ВариантВыходаПродукцииВыбор);
    Если ТипЗнч(ХранимоеЗначениеВыбора) = Тип("ФиксированнаяСтруктура") Тогда
    Объект.ПроцентВыходаМуки = ХранимоеЗначениеВыбора.Мука;
    Объект.ПроцентВыходаОтрубей = ХранимоеЗначениеВыбора.Отруби;
    Если Объект.СырьёКоличество <> 0 Тогда
    РасчитатьКоличествоПродукцииНаСервере();
    Модифицированность = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
```
---
Дело не в процедуре заполнения списка выбора, а в заполнении реквизитов обьекта (не знаю, наверно ТЧ вы там заполняете) на сеовере.
Что если сделать переменную модуля в контексте клиента с типом Массив, в котором будут храниться структуры, а в реквизите формы - число, индекс элемента этого массива? Тогда вам не придется вообще ничего менять, кроме полученя данных выбора.
---
Возможно, вашему реквизиту где-то программно присваивается значение. Представление не подцепится, если это присвоение происходит на сервере или присваивается значение не списка выбора.
---
Ну вообще значение, после пропадания преставления, судя по табло в которое выведен реквизит, остается тем же. Однако ваш ответ навел меня на определенные мысли. Я провел дополнительную проверку и тестирование и при этом выяснилось следующее:
В коде присвоения значения на сервере нет. В этом я уверен, так как реквизит был добавлен мной и весь код обвязки этого элемента состоит всего из двух процедур мной же и написанных. В первой заполняется список выбора и она выполняется на сервере, а вторая - обработчик реагирующий на изменение значения и она на клиенте.
Вот собственно эти процедуры:

```1c
    &НаСервере
    Процедура ЗаполнитьВариантыПроцентовВыходаПродукции()

    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    | ВариантыПроцентовВыходаПродукции.Мука КАК Мука,
    | ВариантыПроцентовВыходаПродукции.Отруби КАК Отруби
    |ИЗ
    | РегистрСведений.ВариантыПроцентовВыходаПродукции КАК ВариантыПроцентовВыходаПродукции
    |
    |УПОРЯДОЧИТЬ ПО
    | Мука,
    | Отруби"
    );
    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда

    Выборка = РезультатЗапроса.Выбрать();
    СписокВариантов = Элементы.ВариантВыходаПродукции.СписокВыбора;

    Пока Выборка.Следующий() Цикл
    Представление = "Мука - <" + Выборка.Мука + "%> | Отруби - <" + Выборка.Отруби + "%>";
    Значение = Новый ФиксированнаяСтруктура("Мука,Отруби", Выборка.Мука, Выборка.Отруби);
    СписокВариантов.Добавить(Значение, Представление);
    КонецЦикла;

    КонецЕсли;
    КонецПроцедуры
```

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

    // Следующая процедура выполняется на сервере и именно
    // после ее вызова сбрасывается представление
    РасчитатьКоличествоПродукцииНаСервере();

    Модифицированность = Истина;
    КонецЕсли;
    КонецЕсли;
    КонецПроцедуры
```

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

```1c
    &НаСервере
    Процедура РасчитатьКоличествоПродукцииНаСервере()

    Объект.КоличествоМукиВзято = 0;
    Объект.КоличествоОтрубейВзято = 0;
```
---
В такой ситуации любое изменение реквизита формы на сервере приводит к очистке представления.
Например:

```1c
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    СписокВыбора = Элементы.Реквизит2.СписокВыбора;
    Для Сч = 0 По 9 Цикл
    СписокВыбора.Добавить(Новый ФиксированнаяСтруктура("Число", Сч), Строка(Сч));
    КонецЦикла;
    КонецПроцедуры

    &НаСервере
    Процедура Реквизит2ПриИзмененииНаСервере()
    Реквизит1 = "Тест"
    КонецПроцедуры

    &НаКлиенте
    Процедура Реквизит2ПриИзменении(Элемент)
    Реквизит2ПриИзмененииНаСервере();
    КонецПроцедуры
```

Представление у поля Реквизит2 очищается при выборе из списка.
Можно попробовать получить необходимые данные на сервере, и заполнять реквизиты объекта на клиенте.
---
Можно попробовать получить необходимые данные на сервере, и заполнять реквизиты объекта на клиенте.Спасибо за совет. Обязательно попробую этот вариант и напишу результат. Жаль что управляемые формы так нехорошо себя ведут, с простыми таких проблем не возникало.
---
Можно попробовать получить необходимые данные на сервере, и заполнять реквизиты объекта на клиенте.
Переделал код заполнения списка выбора. Теперь это вместо одной процедуры - две. Одна с запросом выполняется на сервере, а другая полученными с сервера данными заполняет список на клиенте. Но ситуация не поменялась. Как сбрасывалось представление, так и сбрасывается. Пока тупик.

Вот переделанный код (заполняющий список выбора):

```1c
    &НаКлиенте
    Процедура ЗаполнитьВариантыПроцентовВыходаПродукции2()

    Массив = ПолучитьДанныеДляЗаполненияВариантов();
    СписокВариантов = Элементы.ВариантВыходаПродукции.СписокВыбора;

    Если Массив <> Неопределено Тогда
    Для Каждого Элемент Из Массив Цикл
    СписокВариантов.Добавить(Элемент, Элемент.Представление);
    КонецЦикла;
    КонецЕсли;

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

    &НаСервереБезКонтекста
    Функция ПолучитьДанныеДляЗаполненияВариантов()
    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    | ВариантыПроцентовВыходаПродукции.Мука КАК Мука,
    | ВариантыПроцентовВыходаПродукции.Отруби КАК Отруби
    |ИЗ
    | РегистрСведений.ВариантыПроцентовВыходаПродукции КАК ВариантыПроцентовВыходаПродукции
    |
    |УПОРЯДОЧИТЬ ПО
    | Мука,
    | Отруби"
    );
    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда

    Выборка = РезультатЗапроса.Выбрать();
    Массив = Новый Массив(Выборка.Количество());
    Индекс = 0;

    Пока Выборка.Следующий() Цикл
    Представление = "Мука - <" + Выборка.Мука + "%> | Отруби - <" + Выборка.Отруби + "%>";
    Значение = Новый ФиксированнаяСтруктура("Мука,Отруби,Представление", Выборка.Мука, Выборка.Отруби, Представление);
    Массив[Индекс] = Значение;
    Индекс = Индекс + 1;
    КонецЦикла;

    Возврат Массив;
    Иначе
    Возврат Неопределено;
    КонецЕсли;

    КонецФункции
```
---
Дело не в процедуре заполнения списка выбора, а в заполнении реквизитов обьекта (не знаю, наверно ТЧ вы там заполняете) на сеовере.
Что если сделать переменную модуля в контексте клиента с типом Массив, в котором будут храниться структуры, а в реквизите формы - число, индекс элемента этого массива? Тогда вам не придется вообще ничего менять, кроме полученя данных выбора.
---
Дело не в процедуре заполнения списка выбора, а в заполнении реквизитов обьекта (не знаю, наверно ТЧ вы там заполняете) на сеовере.
Да, все табличные части заполняются на сервере. В принципе переделать конечно можно, но это достаточно большой объем работы, плюс скорее всего такое решение будет не очень хорошим с точки зрения производительности.

Что если сделать переменную модуля в контексте клиента с типом Массив, в котором будут храниться структуры, а в реквизите формы - число, индекс элемента этого массива? Тогда вам не придется вообще ничего менять, кроме полученя данных выбора.Можно, только лучше наверное не массив сделать, а соответствие, а в реквизите формы хранить не число, а сразу текстовое представление с которым в соответствии будет сопоставлена нужная структура. Если хранить число, то скорее всего оно и будет отображаться вместо текстового представления. Спасибо за идею, попробую сделать такую реализацию
---
Реализовал идею (7) в своем варианте, с соответствием вместо массива. Все работает как нужно, представление не сбрасывается, а если точнее, то его вообще нет, вместо представления само значение в текстовом виде, по которому потом из соответствия выбирается реальное значение.
Вот код:

```1c
    &НаКлиенте
    Перем ВариантВыходаПродукцииХранение;

    &НаКлиенте
    Процедура ПриОткрытии(Отказ)
    ВариантВыходаПродукцииХранение = ЗаполнитьВариантыПроцентовВыходаПродукции();
    КонецПроцедуры

    &НаСервере
    Функция ЗаполнитьВариантыПроцентовВыходаПродукции()

    Запрос = Новый Запрос(
    "ВЫБРАТЬ
    | ВариантыПроцентовВыходаПродукции.Мука КАК Мука,
    | ВариантыПроцентовВыходаПродукции.Отруби КАК Отруби
    |ИЗ
    | РегистрСведений.ВариантыПроцентовВыходаПродукции КАК ВариантыПроцентовВыходаПродукции
    |
    |УПОРЯДОЧИТЬ ПО
    | Мука,
    | Отруби"
    );

    ВариантВыходаПродукцииХранение = Новый Соответствие();

    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда

    Выборка = РезультатЗапроса.Выбрать();
    СписокВариантов = Элементы.ВариантВыходаПродукции.СписокВыбора;

    Пока Выборка.Следующий() Цикл
    Представление = "Мука - <" + Выборка.Мука + "%> | Отруби - <" + Выборка.Отруби + "%>";
    Значение = Новый ФиксированнаяСтруктура("Мука,Отруби", Выборка.Мука, Выборка.Отруби);

    ВариантВыходаПродукцииХранение.Вставить(Представление, Значение);
    СписокВариантов.Добавить(Представление);
    КонецЦикла;

    КонецЕсли;

    Возврат ВариантВыходаПродукцииХранение;

    КонецФункции

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

```1c
    Если Не Объект.Договор.Пустая() Тогда Объект.Договор=Объект.Договор; КонецЕсли;
```
---
Встретился с аналогичной проблемой в УТ : конфигурация не обновлялась и режим совместимости стоит 8.2.16. Обработка сделана под обновленную конфигурацию, у которой режим совместимости 8.3.4. При открытии в старой конфигурации у текстового поля отсутствует меню выбора значения, в новой конфигурации - есть. Изменил режим совместимости до 8.3.4 в старой конфигурации - меню выбора появилось. Изменения еще нужно тестировать, но причина как раз в режиме совместимости.