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

Так и получиться, что для создания элемента одна форма, а для редактирования другая.
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший