|
УФ. Передача данных между формой справочника и объектом. | ☑ | ||
---|---|---|---|---|
0
fisher
18.02.14
✎
12:53
|
Задача: в определенных ситуациях хочу выполнять предварительную запись нового элемента справочника без контроля заполнения некоторых реквизитов (чтобы создать дефолтовые элементы подчиненных справочников и прописать потом на них ссылки в создаваемом элементе).
Каким образом можно передать признак предварительной записи из формы в ОбработкаПроверкиЗаполнения()? Или как по-другому можно решить эту задачу? |
|||
1
ДенисЧ
18.02.14
✎
12:55
|
обменДанными.Загрузка = Истина?;
|
|||
2
kosts
18.02.14
✎
12:56
|
Можно "установить ссылку нового"
|
|||
3
b159263
18.02.14
✎
13:00
|
(0) Создать дефолтовые элементы подчиненных справочников и прописать потом на них ссылки в создаваемом элементе это не лучший вариант. Так как не ясно что делать с элементами подчиненных справочников если пользователь откажется от запись нового элемента справочника-владельца.
|
|||
4
fisher
18.02.14
✎
13:11
|
(1) Не
(2) Можно. Но как тогда откатить запись подчиненных элементов, если будет отказ от записи основного? (3) Ясень пень. Но лучше вариантов я не вижу. Будет повышение юзабилити для 95% случаев ценой возможности появления не до конца заполненных элементов. |
|||
5
b159263
18.02.14
✎
13:14
|
(+3) Элементы подчиненных справочников надо создавать после записи объекта справочника владельца. В УФ команда перехода к элементам подчиненного справочника располагается на форме. Если текущий элемент не записан, то платформа автоматически проверяет это и предлагает записать объект.
(4) Приведи пример более подробный. Какая последовательность действий? |
|||
6
fisher
18.02.14
✎
13:23
|
(5) Я в курсе. Но не оч. удобно, если ссылку на дефолтовый элемент подчиненного справочника нужно записать в основной элемент и инфы достаточно для его автоматического создания. Тогда юзверю нужно:
1) заполнить основные реквизиты 2) записать элемент 3) создать элементы подчиненного справочника 4) выбрать в основном элементе ссылку на один из элементов подчиненного 5) записать элемент Я хочу так: 1) после заполнения основных реквизитов по определенному событию происходит автоматическая запись основного элемента, создание дефолтового элемента подчиненного справочника и запись ссылки на него в основной элемент (ну и повторная запись элемента). 2) если доп-элементов создавать не надо, то на этом работа пользователя заканчивается. В принципе, для решения задачи мне достаточно признака ЭтоНовый() в объекте. Но ответ на сабжевый вопрос всё равно интересен. |
|||
7
b159263
18.02.14
✎
13:41
|
&НаСервере
Процедура ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) Если НЕ ЗначениеЗаполнено(Объект.Ссылка) Тогда ПроверяемыеРеквизиты.Очистить(); КонецЕсли; КонецПроцедуры |
|||
8
fisher
18.02.14
✎
13:42
|
Гы. Еще прикол. 1С начала войну за отказ от модальности (и я с ними согласен). Можно типа вместо Вопрос() вызывать немодальный диалог ПоказатьВопрос(). Но владельца диалога задать нельзя и обработчиком может быть только процедура общего модуля, как я понял. Ну и как с этим жить?
Сами 1С открывают системный диалог о записи нового элемента при переходе к подчиненному справочнику в модальном режиме :) |
|||
9
b159263
18.02.14
✎
13:46
|
(8) Это тоже самое как с вопросом минимизации серверных вызовов: надо минимизировать количество обращений на сервер и количество кода выполняемого на клиенте :). Это примерная цитата стандартов 1С. Если посмотреть на компоновщик настроек компоновки данных, сколько он серверных вызовов делает...
|
|||
10
fisher
18.02.14
✎
13:46
|
(7) О! Спасибо. Упустил, что у формы это событие тоже есть. То, что надо.
|
|||
11
Feunoir
18.02.14
✎
13:47
|
(0) У формы есть метод Записать, в который передаются параметры. Эти параметры по идее видны в обработчиках записи.
Расширение управляемой формы для объектов (Managed form extension for objects) Записать (Write) Синтаксис: Записать(<ПараметрыЗаписи>) Параметры: <ПараметрыЗаписи> (необязательный) Тип: Структура. Структура параметров записи, которые могут быть обработаны в обработчиках событий записи. Состав параметров произвольный. Возвращаемое значение: Тип: Булево. Истина - успешно записан; Ложь - в противном случае. Описание: Записывает объект. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер). |
|||
12
fisher
18.02.14
✎
13:48
|
(11) В обработчиках записи ОБЪЕКТА они не видны.
|
|||
13
Feunoir
18.02.14
✎
13:53
|
(12) Хреново. Значит не повезло :(
|
|||
14
b159263
18.02.14
✎
13:54
|
(11) Не а (7) не прокатит?
|
|||
15
grigo
18.02.14
✎
13:54
|
(12)
## на сервере Процедура ПредварительнаяЗапись() СпрОбъект = РеквизитФормыВЗначение(Объект, ТипСправочникаОбъект); СпрОбъект.ДополнительныеРеквизиты.Вставить("ПредварительнаяЗапись", Истина) СпрОбъект.Записать(); КонецПроцедуры; |
|||
16
b159263
18.02.14
✎
13:55
|
(+11)Очищаешь массив проверяемых элементов и дальше все нормально запишется. Я проверил.
|
|||
17
grigo
18.02.14
✎
13:56
|
(15) Ошибочка, не дополнительныеРеквизиты, а ДополнительныеСвойства
|
|||
18
grigo
18.02.14
✎
13:56
|
(16) а как узнать, что НЕ НУЖНО проверять?
|
|||
19
b159263
18.02.14
✎
13:57
|
Ну если ссылка пустая, то не нужно проверять. Это все в серверном контексте формы происходит.
|
|||
20
fisher
18.02.14
✎
13:57
|
(15) Сам пробовал? Точно? ИМХО, до сервера "ДополнительныеСвойства" из формы не доедут.
|
|||
21
fisher
18.02.14
✎
13:59
|
Моя конкретная задача красиво и исчерпывающе решается через (7). Интересны универсальные способы типа (15).
|
|||
22
b159263
18.02.14
✎
14:00
|
Читайте супрекнижку Радчёнка Том 1 стр. 51, 52.
|
|||
23
grigo
18.02.14
✎
14:00
|
(20)
процедура Формы ПредварительнаяЗапись выполняется как раз на сервере. На сервере создается СпрОбъект, и пока СпрОбъект существует, будут существовать и дополнительные свойства, которые ты сможешь проверить в процедуре ПередЗаписью или ОбработкаПроверкиЗаполнения ОБЪЕКТА. Учите объектную модель. |
|||
24
fisher
18.02.14
✎
14:03
|
(23) Ты не ответил на вопрос. Работоспособность сам-то проверял? Я объектную модель знаю получше многих. Проблема в том, что для записи будет использоваться СпрОбъект созданный ЗАНОВО из данных формы. И вопрос в том, доедут ли до него "ДополнительныеСвойства".
|
|||
25
fisher
18.02.14
✎
14:05
|
А, стоп. Невнимательно глянул на (15). Может и взлетит при инициировании записи прямо там, но на универсальный способ передачи данных не катит...
|
|||
26
b159263
18.02.14
✎
14:05
|
(+22) Цитата: http://i024.radikal.ru/1402/a5/6c53b898ec19.jpg
|
|||
27
Feunoir
18.02.14
✎
14:07
|
(21) Вполне себе работает конструкция
&НаКлиенте Процедура ЗаписатьБП(Команда) ПараметыЗаписи = Новый Структура; ПараметыЗаписи.Вставить("НеПроверятьЗапись", Истина); Записать(ПараметыЗаписи); КонецПроцедуры &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) ТекущийОбъект.ДополнительныеСвойства.Вставить("ПараметрыЗаписи", ПараметрыЗаписи); КонецПроцедуры И потом уже в модуле объекта в обработчике, например, ПередЗаписью в дополнительных свойствах всё прекрасно видно. |
|||
28
b159263
18.02.14
✎
14:07
|
Проблема в том, что Обработка проверки заполнения в контексте модуля объекта проходит до записи и в неё ничего не передается.
|
|||
29
fisher
18.02.14
✎
14:13
|
(27) То, что искал!
Выходит, в ПередЗаписьюНаСервере() есть и объект и форма и можно передать данные через ДополнительныеСвойства. Сенк. |
|||
30
fisher
18.02.14
✎
14:15
|
Для моей конкретной задачи ессно лучше (7) подходит. А (27) - это на будущее.
|
|||
31
grigo
18.02.14
✎
14:16
|
(28)
Что да - то да. До записи. Ничего и не будет передаваться при (15). ДополнительныеСвойства - это данные, которые не передаются, а СУЩЕСТВУЮТ внутри СпрОбъект. Какие бы обработчики мы не вызывали у СпрОъект, (ПриЗаписи, ПередЗаписью, ОбработкаЗаполнения,ОбработкаПровркиЗаполнения,... или другие ), у него ВСЕГДА будут существовать эти дополнительные свойства. Поэтому в (15), если в обработчиках ПередЗаписью или ПриЗаписи не будет вызова ПроверитьЗаполнение(), то в ОбработкуПроверкиЗаполнения() код вообще не зайдет, а если есть - то в обработке проверки как раз и проверим ДополнительныеСвойства на необходимость выполнения проверки. |
|||
32
МишельЛагранж
18.02.14
✎
14:16
|
(29) ты не догнал, что ль, "крутую трехзвенку 1С"?
на сервере есть только объект, форма появляется на клиенте. Потому и приходится делать извраты в виде передачи данных посредством промежуточных структур-механизмов. |
|||
33
МишельЛагранж
18.02.14
✎
14:18
|
(31)это данные, которые не передаются, а СУЩЕСТВУЮТ внутри СпрОбъект
- забыл добавить, что к форме они не имеют никакого отношения, и ею не меняются никак, и даже не видятся напрямую. А вообще, это тот ли самый Фишер?! Помнится, мы тут с ним немало копий поломали и по 8.2 УФ. |
|||
34
grigo
18.02.14
✎
14:21
|
(33) Ты, видимо, забыл, прочитать (15). Из формы можно эти параметры УСТАНОВИТЬ. Как - написано в 15, и в 27, причем, в 27 делают то же самое, но гораздо лучше, признаю.
|
|||
35
МишельЛагранж
18.02.14
✎
14:28
|
(34)РеквизитФормыВЗначение
- это каким образом ты это на форме делаешь? Вообще, этот изврат получает контекст формы на сервере, а не наоборот. И даже тут - на сервере без контекста получишь х..фиг )) |
|||
36
fisher
18.02.14
✎
14:28
|
Мда...
(7) Не канает. Думал, там можно отредактировать список проверяемых реквизитов и он будет передан на сервер. Как бы не так. Там он вообще пустой... |
|||
37
fisher
18.02.14
✎
14:32
|
Так что остается (27)
|
|||
38
fisher
18.02.14
✎
14:42
|
Чорд! А ОбработкаПроверкиЗаполнения() раньше вызывается :)
Плюнул, и тупо в ОбработкеПроверкиЗаполнения() по ЭтоНовый() ограничил список проверяемых реквизитов :) |
|||
39
b159263
18.02.14
✎
14:53
|
(36) Не верю
|
|||
40
b159263
18.02.14
✎
15:00
|
(31) Я не спорю, так тоже можно, но получается больше кода а как известно redundant-код не наш код ;)
|
|||
41
fisher
18.02.14
✎
15:00
|
(39) Ты прав. Я соврал. Он содержит один элемент - "Объект" (тип строка).
8.3.4.408, интерфейс "Такси" |
|||
42
fisher
18.02.14
✎
15:06
|
Впрочем, под старыми УФ - тоже самое.
|
|||
43
SUA
18.02.14
✎
15:06
|
кстати как вариант
форма - мастер ввода нового - - содержит реквизиты основного справочника - требуемых дополнительных справочников - записывается все вместе, в одной транзакции (и при необходимости после записи открывается обычная основная форма) |
|||
44
fisher
18.02.14
✎
15:12
|
(43) Это самый правильный вариант. Но ради двух реквизитов рисовать отдельную форму... И красиво на обычную форму потом не переключишь... Для вящей красоты придется панелями делать...
Ну его. |
|||
45
b159263
18.02.14
✎
15:20
|
(43) Кстати в такси скорее всего так и надо, так как формы со множеством элементов банально не поместятся на экране.
Так и получиться, что для создания элемента одна форма, а для редактирования другая. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |