|
Как обеспечить хранение хранилищ значений в строках табличной части в управляемой форме? | ☑ | ||
---|---|---|---|---|
0
TormozIT
гуру
05.09.17
✎
23:38
|
Есть динамически создаваемый объектный реквизит управляемой формы (например СправочникОбъект.Номенклатура). У него есть табличные части с реквизитами типа ХранилищеЗначения. Нужно предоставить пользователю возможность просматривать представления и редактировать содержимое этих хранилищ значений. Как оптимальнее всего решать такую задачу?
Пока я вижу только способ создания реквизита ТаблицаЗначений для каждой ТЧ с созданием дочерних реквизитов по колонкам ТЧ, но хранилища значений заменять на Строка(0). При чтении объекта помещать каждое хранилище значения во временное хранилище, а в реквизит таблицы помещать его адрес. Перед записью соответственно делать обратную процедуру. Но уж очень хлопотный способ. |
|||
1
TormozIT
гуру
10.09.17
✎
14:12
|
Ап
|
|||
2
Филиал-msk
10.09.17
✎
14:17
|
Смириться или переделать архитектуру.
Сколько копий уже ломали, что хранилище значений в ТЧ - это зло... |
|||
3
Lama12
10.09.17
✎
23:37
|
(0) А чем РС не устраивает?
|
|||
4
TormozIT
гуру
10.09.17
✎
23:54
|
(3) Не понял.
|
|||
5
jsmith82
10.09.17
✎
23:56
|
А что находится в ХЗ?
|
|||
6
jsmith82
10.09.17
✎
23:58
|
Ты просто так излагаешь странно, будто в обычных формах ХЗ - это такой прям клиентский редактируемый тип данных.
|
|||
7
Zhuravlik
11.09.17
✎
00:09
|
(0)"При чтении объекта помещать каждое хранилище значения во временное хранилище, а в реквизит таблицы помещать его адре" - мне кажется лишнее... Правится должна одна строка, а читаются все 20.. Сделать форму для редактирования, как возникла нужда править - открывать ее, блокируя владельца, и обновлять ХЗ соотв. Это также позволит разделить код по редактированию от кода по сохранению.
|
|||
8
Lama12
11.09.17
✎
06:40
|
(3) Сделай регистр сведений. Храни в нем хранилища.
|
|||
9
TormozIT
гуру
11.09.17
✎
06:55
|
(7) Форму то сделать проще простого. Как хранить хранилища значений для строк ТЧ (до записи объекта в базу)?
|
|||
10
TormozIT
гуру
11.09.17
✎
06:58
|
(6) Посмотри мой "Редактор объекта БД" из подсистемы "Инструменты разработчика". Там полная поддержка хранилищ значений (в ТЧ, в движениях, в реквизитах объекта).
|
|||
11
toypaul
гуру
11.09.17
✎
07:50
|
не понимаю чем тут ТЗ поможет. как не крути ХЗ напрямую нельзя редактировать
|
|||
12
FIXXXL
11.09.17
✎
08:36
|
(9) СправочникОбъект после редактирования ХЗ что мешает принудительно записать?
|
|||
13
FIXXXL
11.09.17
✎
08:47
|
(12) хотя можно и не писать... только про модифицированность основной формы не забыть
получаешь ХЗ из ОБЪЕКТА на сервере, передаешь в форму редактирования параметром, ХЗ МОЖНО ПЕРЕДАВАТЬ, ОНО СЕРИАЛИЗУЕТСЯ, ПриСозданииНаСервере формы редактирования читаешь из ХЗ и помещаешь в реквизит формы обратно передаешь так же: пакуешь реквизит в ХЗ и отдаешь как параметр оповещения в исходной форме ловишь оповещение, на сервере присваиваешь ОБЪЕКТУ через ОБ = РеквизитФормыВЗначение("Объект"); .......... ЗначениеВРеквизитФормы(ОБ,"Объект"); вот после этого надо по идее или взвести модифицированность основной формы или принудительно записать ОБЪЕКТ |
|||
14
TormozIT
гуру
11.09.17
✎
09:03
|
(13) Ты уже вроде (9) прочитал и даже ответил. Там я писал что форму для редактирования хранилища значения сделать просто. Но возможно кому то будет полезно.
|
|||
15
TormozIT
гуру
11.09.17
✎
09:07
|
Давайте сосредоточимся на (0). Платформа для реквизитов объектов типа ХранилищеЗначения реализует в серверном контексте формы внутреннее хранилище, т.е. на самом деле хранлища значений лежат в строках ТЧ данных формы на сервере, но они не видны в объектной модели и получить их нельзя. Если удалить строку ТЧ, то удалится и ее хранилище значения из серверных данных формы. Если переместить строку ТЧ, то у нее сохранится хранилище значения. При записи объекта все эти хранилища значений в реквизитах строк ТЧ появляются, но до этого момента их нельзя увидеть.
Поэтому я и написал в (0) что очевидным способом является реализованная на прикладном уровне альтернатива механизму платформы, но с возможностью получать хранилище значения ячейки на клиент и там редактировать его. |
|||
16
D3O
11.09.17
✎
09:15
|
(0) ну а чем он хлопотный? прописать ПриЧетнииНаСервере, ПередЗаписьюНаСервере...
но я бы в ТЗ-реквизитах формы добавил поле для хранения индекса соответствующей табличной части объекта и дополнительно обработку удаления/добавления строк ТЧ. |
|||
17
Остап Сулейманович
11.09.17
✎
09:33
|
(15) "хранлища значений лежат в строках ТЧ ". Вот вам, видимо, болт.
В строках ТЧ лежат не собственно значения, а их адреса в специально предназначенном для этих целей хранилище в БД. Потому и работа с ними организована в стиле поместить и получить. Все остальное - на прикладном разработчике. Если допустим в хранилище лежит какой-нибудь специфичный файл. Например чертеж АвтоКада. Как вы предлагаете его редактировать в ячейке табличного поля? |
|||
18
TormozIT
гуру
11.09.17
✎
09:56
|
(17)
Про редактирования хранилищ в форме смотри (10). Про хранение адресов вместо самих хранилищ - это понятно. Я написал так для упрощения, чтобы понятнее передать смысл. Ведь в (0) я по сути предложил тоже самое, только кодировать самому. |
|||
19
DmitrO
11.09.17
✎
10:26
|
(0)а зачем создавать таблицу значений для каждой ТЧ? Если можно просто добавить реквизит формы с адресом прямо в ТЧ (вроде, так все и делают)?
|
|||
20
TormozIT
гуру
11.09.17
✎
10:57
|
(19) Да, действительно делают. Забыл об этой возможности. Спасибо. Это упрощает реализацию.
|
|||
21
FIXXXL
11.09.17
✎
11:20
|
(14) а как редактировать ХЗ без доп.формы, файл или ТЗ или пять томов ВойнаИМир в ячейке? :)
|
|||
22
TormozIT
гуру
11.09.17
✎
12:16
|
(21) Зачем редактировать без доп. формы?
|
|||
23
sapphire
11.09.17
✎
12:21
|
(9) Использовать значения произвольного типа или двоичные данные
|
|||
24
FIXXXL
11.09.17
✎
12:31
|
(22) тогда я не понял вопроса и трудностей
передаешь ХЗ из строки Объекта в доп.форму как параметр, в доп.форме разворачиваешь его, через Оповестить отдаешь обратно и пишешь в основной форме в реквизит строки Объекта |
|||
25
TormozIT
гуру
11.09.17
✎
12:33
|
(23) Не прокатит. При первой же синхронизации данных формы между сервером и клиентом возникнет ошибка "Отсутствует отображение типа ХранилищеЗначения".
|
|||
26
TormozIT
гуру
11.09.17
✎
12:35
|
(24) В 3-й раз: у меня нет проблемы редактировать одно хранилище значения на клиенте. Вопрос был: Как это сделать, когда у ТЧ есть реквизит типа ХранилищеЗначения?
|
|||
27
sapphire
11.09.17
✎
12:40
|
(25) Прокатит. Если разбирать что именно там хранится.
Внутри хранилища хранилища значений еще одно хранилище значения? |
|||
28
TormozIT
гуру
11.09.17
✎
13:52
|
(27) Проверил. Ты прав. Произвольный тип позволяет хранить хранилище значения в реквизите формы, причем независимо от его содержимого. Спасибо. Это мне сильно поможет.
Итак текущий план действий такой. 1. В ТЧ добавить реквизиты с типом Произвольный для каждого реквизита типа ХранилищеЗначения 2. Загрузить туда данные при чтении на сервере. 3. На толстом клиенте их оттуда получить и показать в отдельной форме-редакторе. 4. Поместить отредактированное значение обратно в реквизит ТЧ приозвольного типа. 5. Перед записью на сервере поместить из добавленных реквизитов ТЧ данные в оригинальные реквизиты ТЧ. |
|||
29
FIXXXL
11.09.17
✎
14:19
|
(26) тоже не понял
простой пример: тыркаешь два раза в строку, срабатывает процедура Выбор, в ней определяешь текущую строку, читаешь ХЗ этой строки, отдаешь как параметр формы в форму редактирования ХЗ и т.д. |
|||
30
Адинэснег
11.09.17
✎
14:30
|
(0) нетленка для типовых "без изменения конфигураций", угадал?)
|
|||
31
Адинэснег
11.09.17
✎
14:31
|
аа, это же ТС
|
|||
32
TormozIT
гуру
11.09.17
✎
14:34
|
Как читать хранилище значения соответствующее строке из данных формы?
|
|||
33
TormozIT
гуру
11.09.17
✎
14:34
|
(32) это я обращался к (29)
|
|||
34
FIXXXL
11.09.17
✎
15:20
|
(32) через идстроки на сервере
|
|||
35
TormozIT
гуру
11.09.17
✎
15:27
|
(34) Покажи код, который позволит прочитать хранилище значения из строки через ИД на сервере.
|
|||
36
FIXXXL
12.09.17
✎
08:22
|
немножко соврамши про ИД, давно писал
весь фокус - найти нужную строку в ТЧ &НаСервере Функция ПараметрыЗапросаПолучитьСервер(ИДСтроки) ПараметрыЗапроса = Новый ХранилищеЗначения(Неопределено); ТекСтрока = Объект.ОбъектыОбмена.НайтиПоИдентификатору(ИДСтроки); //получаем параметры запроса по имени объекта в строке ОБ = РеквизитФормыВЗначение("Объект"); ТЧОбъекта = ОБ.ОбъектыОбмена; ТекСтрокаТЧ = ТЧОбъекта.Найти(ТекСтрока.ИмяОбъектаОбмена); Если НЕ ТекСтрокаТЧ = Неопределено Тогда ПараметрыЗапроса = ТекСтрокаТЧ.ПараметрыЗапроса; КонецЕсли; Возврат ПараметрыЗапроса; КонецФункции |
|||
37
TormozIT
гуру
12.09.17
✎
09:04
|
(36) Если это работает, то это будет лучшим ответом на мой вопрос (0) и очень странно что никто другой так долго на рассказал об этом способе. Спасибо.
|
|||
38
TormozIT
гуру
12.09.17
✎
09:06
|
(36) А способ то хотя видимо рабочий, но не универсальный. Не во всех ТЧ есть реквизит "ИмяОбъектаОбмена".
|
|||
39
TormozIT
гуру
12.09.17
✎
09:08
|
(36) Универсальный способ должен опираться на номер строки ТЧ, т.е. вместо поиска по значению реквизита надо брать строку ТЧ по индексу из данных формы.
|
|||
40
TormozIT
гуру
12.09.17
✎
09:12
|
Универсальный видимо будет типа такого
&НаСервере Функция ПараметрыЗапросаПолучитьСервер(ИДСтроки) ПараметрыЗапроса = Новый ХранилищеЗначения(Неопределено); ТекСтрока = Объект.ОбъектыОбмена.НайтиПоИдентификатору(ИДСтроки); //получаем параметры запроса по имени объекта в строке ОБ = РеквизитФормыВЗначение("Объект"); ТЧОбъекта = ОБ.ОбъектыОбмена; ТекСтрокаТЧ = ТЧОбъекта[Объект.ОбъектыОбмена.Индекс(ТекСтрока)); Если НЕ ТекСтрокаТЧ = Неопределено Тогда ПараметрыЗапроса = ТекСтрокаТЧ.ПараметрыЗапроса; КонецЕсли; Возврат ПараметрыЗапроса; КонецФункции |
|||
41
FIXXXL
12.09.17
✎
09:21
|
(40) индексы ДанныеФормыЭлементКоллекции и ОБ.ТЧ боюсь не совпадут :(
|
|||
42
TormozIT
гуру
12.09.17
✎
09:23
|
(41) Совпадут. Иначе как номера строк устанавливаются при сохранении?
|
|||
43
TormozIT
гуру
12.09.17
✎
09:24
|
Вот только обратное действие, т.е. сохранение отредактированного значения в строке ТЧ на сервере будет приводить каждый раз к куче сбросов текущих строк и подобного.
|
|||
44
FIXXXL
12.09.17
✎
10:17
|
(42) к сожалению не гарантируется, судя по
ДанныеФормыКоллекция (FormDataCollection) Индекс (IndexOf) Синтаксис: Индекс(<Элемент>) Описание: Получает индекс элемента коллекции. именно Элемента из ДанныеФормыКоллекция про совпадение результата с методом Табличная часть (Tabular section) Индекс (IndexOf) Синтаксис: Индекс(<Строка>) Параметры: <Строка> (обязательный Описание: Получает индекс строки в табличной части. ни слова :( |
|||
45
TormozIT
гуру
12.09.17
✎
10:30
|
(44) Не согласен с твоим обоснованием твоего предположения. Если оно верно, то дай хотя бы одно предположение, в каком порядке расставляются строки ТЧ при преобразовании из данных формы.
|
|||
46
FIXXXL
12.09.17
✎
10:31
|
(45) лучше вот чего
ДанныеФормыЭлементКоллекции (FormDataCollectionItem) ИсходныйНомерСтроки (SourceLineNumber) Использование: Только чтение. Описание: Тип: Число. Если объект ДанныеФормыКоллекция был получен из табличной части, то свойство содержит номер данной строки в оригинальной табличной части. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер). |
|||
47
TormozIT
гуру
12.09.17
✎
10:41
|
(46) Номер строки в ОРИГИНАЛЬНОЙ табличной части никак не поможет передать порядок строки из ДанныеФормыКоллекция в ТЧ.
|
|||
48
FIXXXL
12.09.17
✎
10:57
|
(47) я предложил ИсходныйНомерСтроки только как ИД строки использовать
потому как индексы не сойдутся :) |
|||
49
TormozIT
гуру
12.09.17
✎
11:02
|
(48) Еще раз почему индексы не сойдутся? (44) Слишком слабый (очень косвенный) аргумент.
|
|||
50
FIXXXL
12.09.17
✎
11:30
|
(49) потому как это разные по сути коллекции
если строку на форме подвигать вверх-вниз, индекс элемента в ДанныеФормыКоллекции изменится? а в коллекции РеквизитФормыВЗначение().ТЧ? |
|||
51
TormozIT
гуру
12.09.17
✎
11:36
|
(50) Сдвиг строки в таблице формы приведет к изменению индекса ДанныеФормыЭлементКоллекции и соответсвенно получаемой из нее через РеквизитФормыВЗначение строки ТЧ
|
|||
52
FIXXXL
12.09.17
✎
11:47
|
(51) проверял? :)
|
|||
53
FIXXXL
12.09.17
✎
11:48
|
(51) +а если строка новая и подвинута промеж "старых"?
|
|||
54
TormozIT
гуру
12.09.17
✎
11:48
|
(51) Не проверял. А ты проверял? Где тогда порядок строк в ДанныеФормыКоллекция хранится?
|
|||
55
TormozIT
гуру
12.09.17
✎
11:49
|
(53) Причем здесь старые строки?
|
|||
56
FIXXXL
12.09.17
✎
12:18
|
(55) короч, отпишись как реализуешь, интересно :)
|
|||
57
TormozIT
гуру
12.09.17
✎
12:23
|
(56) Да, напишу о результатах. Спасибо еще раз за наиболее ценную информацию по теме.
|
|||
58
TormozIT
гуру
16.09.17
✎
13:45
|
(28) В итоге получилось этим способом.
Способ с обращением к серверу для получения/установки хранилища значения через РеквизитФормыВЗначение не заработал. Мои представления о том, как хранятся хранилища значений в коллекциях данных формы оказались не верными. Если преобразовать объект с хранилищем значения в ТЧ в данные формы и обратно, то хранилище значения очищается. Таким образом получается, что платформа вообще не хранит хранилища значений для коллекций формы. Получается, что они будут всегда очищаться при записи, если явно не позаботиться об их сохранении? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |