Здравствуйте! Товарищ подкинул задачку. По описанию, я считаю, задачка полный бред. Но как он говорит, такое реализовывали в реальности! Но наверное я что-то не понимаю и поэтому хочу тоже попробовать сделать :)
Есть 2 формы элемента. Одна основная, вторая для "редактирования". Интерфейс у них разный, "объект" естественно один :) В списке документов, при нажатии на один из документов, открывается первая. основная, форма. В этой форме у всех реквизитов стоит "только чтение". Изменить ничего нельзя. В командной панели этой формы есть команда "Редактировать". При нажатии на нее открывается вторая форма с другим интерфейсом. Если у первой, основной, формы элемента реквизиты расположены на одной странице, то в форме для "редактирования" несколько страниц и все реквизиты разбросаны/сгруппированы по ним. И конечно, все данные реквизитов из первой формы отображены во второй. После изменения нужных реквизитов и нажатия на кнопку "провести и закрыть" должна открываться основная форма с уже изменеными реквизитами.
Вот что пришло в мою светлую голову как можно это реализовать: в основной форме при нажатии на кнопку "Редактирование" передавать все значения в параметры второй формы. То есть собрать все в структуру и передать во второй параметр функции ОткрытьФорму(). Далее во второй форме в процедуре ПриСоздании() принять параметры и заполнить все реквизиты, а событии ПослеЗаписи() опять собрать все реквизиты в структуру и передать в метод Закрыть(). В основной форме в процедуре переданной в объект ОписаниеОповещения принять эту структуру и заполнить все реквизиты.
Имеет ли право на жизнь такой способ или лучше сделать как-то по другому? Посоветуйте, пожалуйста, я прислушаюсь.
(1) Теоретически можно при нажатии на кнопку открыть форму для редактирования, а форма просмотра - закрыть. При окончании редактирования - обратное. Минус в том, что происходит неоднократное чтение объекта. Как вариант, форму для просмотра не закрывать, а в форме редактирования после записи оповещать об изменении. В форме просмотра ловить это событие и перечитывать либо весь объект, либо что-то придумать :).
Этот подход работает, но он:
Сложный в поддержке: если реквизитов много, их нужно вручную собирать и передавать.
Неэффективен: данные копируются между формами, что может быть избыточно.
Не соответствует принципам ООП: данные объекта дублируются, вместо того чтобы работать с одним экземпляром объекта. И ещё раз НО он работает
(5) Так ООП в 1С нет) Но я понимаю, что вы имеете ввиду и согласен с вами. Методом тыка я пришел наверное к единственному варианту: гонять структуру туда-сюда. Выглядит это так: Собираю все реквизиты этим методом (благо добрые люди придумали все до нас). Потом во второй форме я вынужден преобразовывать ДанныеФормаСтруктура в обычную структуру этим методом, чтобы была возможность просто обойти структуру циклом. Обходя циклом проверяю: ОбщегоНазначения.ЕстьРеквизитОбъекта(Реквизит.Ключ, Метаданные.Документы.ПриемНаРаботу). Таким образом фильтрую ненужные данные. Потом просто записываю: Объект[Реквизит.Ключ] = Реквизит.Значение;
При необходимости редактирования - первую форму автоматически закрыть.
Открыть вторую, отредактировать, записать, закрыть, оповестить форму списка, из списка снова автоматически открыть первую форму.