Имя: Пароль:
1C
1С v8
Неуправляемый интерфейс и обновление отображения введенных кодом данных на форме
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
Ну или, наоборот, чуть позже происходит очистка =) проблема решена, перенес в другое место, туда, где проставляются непосредственно данные в строке при изменении данных в ПерваяКолонка. Всем спасибо =)