|
Неуправляемый интерфейс и обновление отображения введенных кодом данных на форме | ☑ | ||
---|---|---|---|---|
0
beholder13
11.04.14
✎
18:21
|
Доброго времени суток, коллеги.
Я окончательно запутался и нуждаюсь в вашей помощи, пишу в надежде ее получить. Имеется ЗиУП 2.5, в который для удобства использования из третьего были перетянуты некоторые объекты на управляемом интерфейсе с тотальным комментированием и переписыванием, но в целом все работает. Сейчас в процессе реализации хотелки достиг вполне себе обыкновенного состояния затыка. Ниже описание непосредственно ситуации. Есть документ с управляемой формой, в нем имеется некая табличная часть (далее ТЧ). На форме имеется реквизит Объект с типом "ДокументОбъект.<ИмяДокумента>". На форму ТЧ положена напрямую, т.е. на форму передается весь документ со своими внутренностями и выбранные поля и таблицы выведены напрямую, тем самым тип таблицы на форме (далее ТаблицаНаФорме) - ДанныеФормыКоллекция. Типовым механизмом в обработчике события ТаблицаНаФорме.ПередНачаломДобавления() прописано добавление строки именно в эту таблицу, следующим образом: // Процедура в общем клиентском модуле, вызываемая из обработчика события, // передаваемые параметры с формы соответствуют по именам, только первый - ЭтаФорма Процедура ОбработчикСобытияПередНачаломДобавления(Форма, Элемент, Отказ, Копирование, Родитель, Группа) Экспорт Отказ = Истина; Форма.Модифицированность = Истина; ДанныеНовойСтроки = Форма.Объект.ТаблицаНаФорме.Добавить(); ИдентификаторНовойСтроки = ДанныеНовойСтроки.ПолучитьИдентификатор(); ИндексНовойСтроки = Форма.Объект.ТаблицаНаФорме.Индекс(ДанныеНовойСтроки); <...> // Бла бла бла Форма.Элементы.ТаблицаНаФорме.ТекущаяСтрока = ИдентификаторНовойСтроки; Форма.Элементы.ТаблицаНаФорме.ТекущийЭлемент = Форма.Элементы.ТаблицаНаФормеПерваяКолонка; Форма.Элементы.ТаблицаНаФорме.ИзменитьСтроку(); КонецПроцедуры Все достаточно просто, обработчик перекрывает механизм платформы, рисует строку в таблице формы и позиционирует на первую ячейку в строке. Мне необходимо вклиниться в этот процесс, заполнив эту строку сразу определенными значениями, ну, допустим, поставить сразу значение в ВтораяКолонка этой строки. Руководствуясь тем, что строка нарисована в реквизите формы, делаю это приблизительно следующим методом: НоваяСтрока = Форма.Объект.ТаблицаНаФорме.Получить(ИдентификаторНовойСтроки); // Тип - ДанныеФормыЭлементКоллекции НоваяСтрока.ВтораяКолонка = Значение; Значений гораздо больше, там на сервере еще делаются запросы, все это перекручивается, но, по сути, все это утрируется до этих двух строчек. Вставляю я их туда, где в первом листинге указано <...>. Таким образом, в отладчике к моменту выхода из формы в Форма.Объект.ТаблицаНаФорме в последней строке ВтораяКолонка имеет в себе Значение. Более того, внутренние обработчики прекрасно видят это значение и делают свои расчеты на основании него. Но, как уже, думаю, понятно, визуально на форме его не видно. Методы типа Форма.ЗначениеВРеквизитФормы() или Форма.Прочитать() неактуальны, потому что на сервере, по сути, в реквизите формы значение имеется, но оно не отражено на клиенте. При выборе значения в ячейке ПерваяКолонка строки ячейка ВтораяКолонка очищается, посему вывод достаточно прост - клиентская часть даже не подозревает о том, что там что-то есть, отправляет на сервер пустое значение и, тем самым, переписывает то, что я туда воткнул. Вопрос вполне очевиден - что я делаю не так? =) Надеюсь, описание проблемы достаточно внятное. Заранее благодарю за содействие. |
|||
1
Жан Пердежон
11.04.14
✎
18:56
|
какая-то каша в (0): куча лишней инфы, зато самое важное, видимо, сокрыто в <...>, но если пальцем в небо, то:
ДанныеНовойСтроки.ВтораяКолонка = Значение; |
|||
2
beholder13
11.04.14
✎
19:07
|
(1) В <..> сокрыта не несущая в в себе смысла по отношению к задаче раскраска четных и нечетных строк, убрал, чтоб не нагромождать.
ДанныеНовойСтроки.ВтораяКолонка = Значение; аналогично НоваяСтрока.ВтораяКолонка = Значение; потому как ДанныеНовойСтроки получено методом Добавить(), а НоваяСтрока - методом Получить() с идентификатором, полученным напрямую из ДанныеНовойСтроки. То, что данные попадают в нужную строку, говорит о том, что идентификатор верен (в данном случае о совпадает с индексом, вариант использовать индекс приведет к тому же результату). Следовательно, что пнем об сову, что совой об пень. Ниже СП по обоим методам в качестве пруфа. ДанныеФормыКоллекция (FormDataCollection) Добавить (Add) Синтаксис: Добавить() Возвращаемое значение: Тип: ДанныеФормыЭлементКоллекции. Описание: Добавляет элемент в конец коллекции и возвращает его в качестве результата метода. ДанныеФормыКоллекция (FormDataCollection) Получить (Get) Синтаксис: Получить(<Индекс>) Параметры: <Индекс> (необязательный) Тип: Число. Расположение элемента в коллекции. Возвращаемое значение: Тип: ДанныеФормыЭлементКоллекции. Описание: Получает элемент по индексу. Работает аналогично оператору []. |
|||
3
Мимохожий Однако
11.04.14
✎
19:15
|
(0)"Форма.ЗначениеВРеквизитФормы() или Форма.Прочитать() неактуальны". Сумлеваюсь я в этом утверждении
|
|||
4
beholder13
11.04.14
✎
19:23
|
(3) Постараюсь развеять Ваши сомнения.
Метод Форма.ЗначениеВРеквизитФормы(), очевидно, помещает значение в реквизит формы, и он не актуален по причине того, что я работаю с методами Форма.Объект.ТаблицаНаФорме, что, по сути своей, уже является значением реквизита формы (Форма.Объект и все, что к нему имеет отношение). Любое прямое помещение значения из, например, самого объекта в этот реквизит на выходе из обработчика просто сольет в реквизит все, что там есть, в том числе имеющуюся в объекте ТЧ, в которой новой добавленной строки не существует. Метод Форма.Прочитать() приведет к аналогичным последствиям, только при этом он полностью получит из объекта все записанные данные, уничтожив последствия всех изменений на форме с момента последней записи документа, в том числе, добавление новой строки. Записывать документ сразу при создании строки бессмысленно, так как строка еще не заполнена необходимыми значениями, и в записи будет отказано. |
|||
5
beholder13
11.04.14
✎
19:28
|
И да, в объекте на сервере эта строка, теоретически, должна создасться после завершения выполнения обработчика, при этом в нее должны быть переданы указанные в реквизите формы значения. Так и происходит, но эти значения не отображаются на форме на клиенте, и их существование игнорируется при ручном изменении любого поля в строке. В любом случае, это единственный обработчик добавления новой строки для объекта типа ТаблицаФормы.
|
|||
6
Жан Пердежон
11.04.14
✎
20:44
|
(2) попробую еще раз: из каши в (0) совсем неочевидно, что ты собираешься получить? Назови уже лучше сразу сам документ и форму из ЗУП 3.
|
|||
7
beholder13
12.04.14
✎
10:51
|
(6) Табель это, я выходные туда хочу по производственному календарю добавить, чтобы автоматом проставились при создании новой строки.
|
|||
8
beholder13
14.04.14
✎
09:52
|
Честно говоря, я не совсем понимаю, как так получается, что данные, изменяемые прямо в реквизите формы, который сообщается напрямую с объектом, не отражаются на форме и игнорируются при дальнейшем изменении данных этого реквизита... Скорее всего, я забываю прописать какой-то метод, который бы логически завершил все это действо, но бессмысленно втыкаю и туплю...
|
|||
9
beholder13
14.04.14
✎
10:50
|
Ну или, наоборот, чуть позже происходит очистка =) проблема решена, перенес в другое место, туда, где проставляются непосредственно данные в строке при изменении данных в ПерваяКолонка. Всем спасибо =)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |