Имя: Пароль:
1C
1С v8
Нельзя изменять поле, содержащее объект данных формы
0 distorter
 
08.05.12
00:12
В модуле формы элемента справочника хочу автоматически менять наименование при изменении реквизита. Выдает ошибку.

&НаКлиенте
Процедура УлицаПриИзменении(Элемент)
   Объект.Наименование = СформироватьНаименование(Объект);
КонецПроцедуры

&НаСервереБезКонтекста
Функция СформироватьНаименование(Объект)
   Улица = Строка(Объект.Улица);
   Номер = Строка(Объект.Номер);
   Корпус = Строка(Объект. Корпус);
   Строение = Строка(Объект.Строение);
   Адрес = Улица + ", " + Номер + ", корп. " + Корпус + ", стр. " + Строение;
   Возврат Адрес;
КонецФункции
1 artems
 
08.05.12
00:22
А почему без контекста? Сделай серверной процедурой, в ней меняй наименование и вызывай ее при изменении всех зависимых полей.
2 distorter
 
08.05.12
00:26
(1) Вот так?

&НаКлиенте
Процедура УлицаПриИзменении(Элемент)
   СформироватьНаименование(Объект);
КонецПроцедуры

&НаСервере
Процедура СформироватьНаименование(Объект)
   Улица = Строка(Объект.Улица);
   Номер = Строка(Объект.Номер);
   Корпус = Строка(Объект.Корпус);
   Строение = Строка(Объект.Строение);
   Адрес = Улица + ", " + Номер + ", корп. " + Корпус + ", стр. " + Строение;
   Объект.Наименование = Адрес;
КонецПроцедуры

Ту же самую ошибку выдает.
3 proger2011
 
08.05.12
00:29
Можно Объект не передавать на сервер, он и так там доступен
4 distorter
 
08.05.12
00:36
(3) Если не передавать, то работает. А без контекста никак нельзя?
5 artems
 
08.05.12
00:39
(4) а зачем именно без контекста?
6 distorter
 
08.05.12
00:41
(5) Предполагается работа исключительно в тонком клиенте. Хочется, чтобы быстрее работало.
7 proger2011
 
08.05.12
00:42
(4) Попробуй преобразовать

ДанныеФормыВЗначение(<Объект>, <Тип>)
Параметры:

<Объект> (обязательный)

Тип: ДанныеФормыСтруктураСКоллекцией; ДанныеФормыКоллекция; ДанныеФормыСтруктура; ДанныеФормыДерево.
Данные формы.
<Тип> (обязательный)

Тип: Тип.
Тип значения, получаемого из данных формы.
Возвращаемое значение:

Тип: Произвольный.

Описание:

Преобразует данные формы в объект прикладного типа.

Доступность:

Сервер, толстый клиент.
Примечание:
8 artems
 
08.05.12
00:44
Не ускорит настолько, что бы было критично.
Сделай как в (7) сказали и заметь производительность.
Я думаю что гонять реквизит формы в значение даже дольше получится...
9 proger2011
 
08.05.12
00:46
(8) Да я чёта написал а потом засомневался, если без контекста то по идее Объект не доступен будет.
10 artems
 
08.05.12
00:49
А зачем там объект? В клиентской процедуре реквизит в значение, значение на сервер без контекста, а оттуда возвращать строку наименования. Хотя по моему это извращение )))
11 distorter
 
08.05.12
00:55
(10) Я еще не сделал как в (7) говорит что-то про несоответствие типов во втором параметре. К какому типу я Объект привести должен?
12 Garkin
 
08.05.12
01:00
(6) Если хочешь быстро - тогда не вызывай сервер без необходимости, поставь для   "Функция СформироватьНаименование()" - "&НаКлиенте".
13 artems
 
08.05.12
01:02
Ну тут уж сам поковыряйся ) с чем тебе на сервере работать проще будет. Я бы попробовал с ДанныеФормыСтруктура.
14 distorter
 
08.05.12
01:06
(12) а ведь правда, сервер не нужен - все данные на форме.
вот так работает отлично, так же как (3)



&НаКлиенте
Процедура УлицаПриИзменении(Элемент)
   СформироватьНаименованиеНаКлиенте();
КонецПроцедуры

&НаКлиенте
Процедура СформироватьНаименованиеНаКлиенте()
   Улица = Строка(Объект.Улица);
   Номер = Строка(Объект.Номер);
   Корпус = Строка(Объект.Корпус);
   Строение = Строка(Объект.Строение);
   Адрес = Улица + ", " + Номер + ", корп. " + Корпус + ", стр. " + Строение;
   Объект.Наименование = Адрес;
   ЭтаФорма.Заголовок = Объект.Наименование;
КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   ЭтаФорма.Заголовок = Объект.Наименование;
КонецПроцедуры
15 artems
 
08.05.12
01:06
А если говорить о производительности, то не в ту сторону смотришь. Сколько раз у тебя наименование переписываться будет? Я вижу как минимум 4. Может лучше в процедуре перед записью проверить должно поменяться наименование и если должно, то один раз всего поменять.
16 distorter
 
08.05.12
01:07
Тогда еще вопрос - где лучше формировать заголовок формы при открытии (автоформирование целенаправленно отключено в свойствах формы) - на сервере или на клиенте?
17 distorter
 
08.05.12
01:09
(15) я хочу чтобы пользователь видел результирующую строку в заголовке в процессе своих действий. Наименование вообще отсутствует на форме как реквизит. А так ему придется в уме прикидывать как будет называться элемент справочника в результате его действий.
18 artems
 
08.05.12
01:15
Ну сделай наименование недоступным для редактирования и не надо с заголовком мудрить.
19 distorter
 
08.05.12
01:25
(18) Заголовок скрыть, оставить наименование в виде Декорация текст? (не хочется делать его просто реквизитом - затеряется в толпе :)