Версия для печати темы (https://pro1c.org.ua/index.php?s=287518044f17cb7746d5817166ff62e0&showtopic=8794)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование управляемых форм 1С 8.2 _ Открыть созданный программно документ из обработки проведения
Автор: Vofka 02.09.12, 20:00
Привет!
Есть документ. Опущу детали и сформулирую цель так: в обработке проведения этого документа мне нужно создать программно ещё один документ (с этим вопросов нету) и открыть его. Как, собственно, открыть с сервера программно созданный объект?
Автор: alex040269 02.09.12, 21:14
ДополнительныеСвойства
Автор: Vofka 03.09.12, 8:18
alex040269, не понял.
Автор: alex040269 03.09.12, 8:33
через ДополнительныеСвойства можно вернуть на клиент все, что угодно в т.ч. и ссылку.
Автор: pumbaE 03.09.12, 8:38
Дополнительные свойства только на сервере или толстом клиенте. Создаем временное хранилище, проводим документ, во временное хранилище возвращаем ссылку и уже на клиенте делаем Ссылка.ОткрытьЗначение() .
Автор: Vofka 03.09.12, 8:39
И в каком событии смотреть туда? После записи что ли?
Автор: pumbaE 03.09.12, 9:06
Да, на клиенте ПередЗаписью создаем временное хранилище, вызываем серверную процедуру, в доп свойства записываем адресс хранилища, при проведении в хранилище записываем ссылку, массив ссылок и на клиенте после записи считываем данные из временного хранилища.
Автор: DartRomanius 03.09.12, 9:07
Цитата(Vofka @ 03.09.12, 9:39)
И в каком событии смотреть туда? После записи что ли?
"ПослеЗаписи".
Курить структуру "ПараметрыЗаписи".
Автор: Vofka 03.09.12, 9:09
А если документ будет проводиться не из формы документа, а из формы списка?
Автор: alex040269 03.09.12, 9:09
да, недосмотрел
Цитата
Может использоваться в тех случаях, когда необходимо хранить некоторые значения, связанные с объектом, на время выполнения некоторых операций, без изменения объекта. Например, при обработке событий в подписке на события.
Доступность:
Сервер, толстый клиент, внешнее соединение.
Автор: Vofka 03.09.12, 9:17
Да, кстати, а как же мне в форме заполнить ДополнительныеСвойства, если у меня там объекта еще нету?
Автор: zay 03.09.12, 10:58
1.
Была похожая задача в обычном интерфейсе. Перепроводить документ2 из модуля объекта документа1, который выполнялся на сервере. Необходимо было выполнить в привилегированом модуле, а ссылку в качестве параметра функции передать нельзя - "Ошибка параметра. Передача мутабельного значения не поддерживается". Не знаю, подойдет вам такой способ или нет. В моем случае документ2 всегда уже существовал.
//В модуле документа1
ИдентификаторДокумента2 = Документ2.УникальныйИдентификатор();
ПроцедураИзПривилегированогоМодуля( ИдентификаторДокумента2 );
Процедура ПроцедураИзПривилегированогоМодуля( ИдентификаторДокумента2 )
Документ2Ссылка = Документы.Документ2.ПолучитьСсылку( ИдентификаторДокумента2 );
Документ2Объект = Документ2Ссылка.ПолучитьОбъект();
//Делаем с Документ2Объект все что нам надо
КонецПроцедуры
2.
Проведение одного документа из модуля другого документа может привести к определенным проблемам. В моей ситуации это приводило к конфликтам блокировок и как следствие некоторые Документы2 не соответствовал Документу1 (ради чего это все собственно и затевалось).
Если бы делал эту задачу сейчас - вместо синхронизации одинаковых реквизитов Документа1 и Документа2 - вынес бы эти реквизиты в регистр сведений, общий для Документа1 и Документа2.
Автор: Vofka 03.09.12, 11:04
Цитата(zay @ 03.09.12, 11:58)
Была похожая задача в обычном интерфейсе
Это совсем другая задача. Здесь вся "соль" именно в управляемом интерфейсе.
Автор: logist 03.09.12, 11:05
Цитата(pumbaE @ 03.09.12, 10:06) http://pro1c.org.ua/index.php?act=findpost&pid=55635
А если документ будет проводиться не из формы документа, а из формы списка?
Значит в форме списка прописать тоже самое. Или сообразить универсальную процедуру в общем модуле.
Автор: Vofka 03.09.12, 11:09
Цитата(logist @ 03.09.12, 12:05) http://pro1c.org.ua/index.php?act=findpost&pid=55649
Да, кстати, а как же мне в форме заполнить ДополнительныеСвойства, если у меня там объекта еще нету?
Автор: logist 03.09.12, 11:21
Цитата(Vofka @ 03.09.12, 12:09)
Ну это понятно. Вопрос в том, какое событие формы списка отлавливает обработку проведения?
Я бы просто запретил проводить документы в форме
Автор: DartRomanius 03.09.12, 11:58
Цитата(Vofka @ 03.09.12, 12:09)
Ну это понятно. Вопрос в том, какое событие формы списка отлавливает обработку проведения?
Практическое пособие разработчика - 832 стр.
Автор: Vofka 03.09.12, 12:13
Цитата(DartRomanius @ 03.09.12, 12:58)
Практическое пособие разработчика - 832 стр.
Я чего-то не понимаю или же "Последовательность событий при проведении документа из формы документа" не имеет никакого отношения к форме списка?
Автор: alex040269 03.09.12, 12:18
Цитата(Vofka @ 03.09.12, 13:13)
Я чего-то не понимаю или же "Последовательность событий при проведении документа из формы документа" не имеет никакого отношения к форме списка?
по логике должны вызываться или нет события, определенные в самой форме. Все остальное должно вызываться независимо от способа проведения.
Автор: Vofka 03.09.12, 12:27
Цитата(logist @ 03.09.12, 12:21) http://pro1c.org.ua/index.php?act=findpost&pid=55654
по логике должны вызываться или нет события, определенные в самой форме
Ну так формы то самой нету, в которой эти события определены. Ну т.е. в событии формы документа
ПередЗаписью, как писали выше, надо данные в хранилище поместить, а потом извлечь и что-то с ними сделать. Но в форме списка нету событий не
ПередЗаписью не
ПослеЗаписи. Соответственно вопрос стоит в том, как вернуть адрес хранища с сервера на клиент?
И вопрос
Цитата
Да, кстати, а как же мне в форме заполнить ДополнительныеСвойства, если у меня там объекта еще нету?
глупый и никто не отвечает или же никто не знает ответа?
Автор: logist 03.09.12, 12:53
Цитата(Vofka @ 03.09.12, 13:27)
Цитата
Да, кстати, а как же мне в форме заполнить ДополнительныеСвойства, если у меня там объекта еще нету?
глупый и никто не отвечает или же никто не знает ответа?
ПослеЗаписи Объект уже есть, соответственно в какой-то серверной процедуре можно взять из ДополнительныхСвойств чего-то. Т.е. в модуле при проведении записываем туда ссылку нового объекта, а в форме ПослеЗаписиНаСервере получаем ее. Только вот доступны ли ДополнительныеСвойства в форме...
Автор: alex040269 03.09.12, 13:04
Цитата(logist @ 03.09.12, 13:53)
Только вот доступны ли ДополнительныеСвойства в форме
не доступны. Это реквизит объекта. Время жизни равно времени жизни объекта.
Автор: DartRomanius 03.09.12, 13:13
Цитата(Vofka @ 03.09.12, 13:27)
Ну так формы то самой нету, в которой эти события определены. Ну т.е. в событии формы документа ПередЗаписью, как писали выше, надо данные в хранилище поместить, а потом извлечь и что-то с ними сделать. Но в форме списка нету событий не ПередЗаписью не ПослеЗаписи. Соответственно вопрос стоит в том, как вернуть адрес хранища с сервера на клиент?
Собственно, в форме списка документов (кстати он как правило представлен "ДинамическийСписок") такого нет в принципе.
Посему вывод: подобный финт не возможен из формы списка, однако возможен из формы самого объекта. То есть, стандартными средствами не достижимо.
Однако, можно извратится:
- сделать кнопку на форме списка (со своей собственной процедурой/функцией вызова проведения того объекта на который спозиционированы).
- в данной команде вызываем открытие формы объекта с передачей определенных параметров вызова. (думаю взаимодействие 2-х и более форм описывать не требуется).
- потом получив из так не открывшейся (так надо задать в условиях данного вопроса насколько я понял) формы передаем контекст (привет 7.7)/ссылку на созданный объект.
- .........
- PROFIT
Автор: Vofka 03.09.12, 13:29
Запутали ещё больше . В общем, я по позже ещё тему перечитаю, покручу то о чем здесь написано и отпишу. Всем спасибо за ответы!
Автор: DartRomanius 03.09.12, 13:45
Ладно, попробую .....
Есть:
- "документ 1" - создаем, зписываем/проводим, проводим существующий из формы списка.
- "документ 2" - создается из модуля проведения (и проводится) документа1.
в догонку:
- "документ 1", знает о наличии отсутствии (как вариант реквизит-ссылка) "документа 2".
Варианты:
1. "Документ 1" - проводится (и записывается ессно..) из собственной формы документа.
2. "Документ 1" - проводится/перепроводится (хотя не суть важно) из "ФормаСписка"/"ФормаВыбора" (как вариант еще журналы, но принцип тот-же).
Решения:
1-й вариант, вроде все ясно, отлавливаем событие "ПриЗаписи" объекта и так-как объект уже есть (опустим пока транзакционные особенности), то можно достучаться уже до "ДополнительныеСвойства".
2-й вариант сложнее, требуется модернизировать "ФормуДокумента" у "документ 1". Требуется ввести параметр формы (причем возможно "ключевой"). Далее перед открытием формы делать анализ, и передавать данные форме (списка) которая открыла форму с параметрами (необходимыми нам). ЗЫ: Думаю отдельная команда в списке тут в самый раз. Так-как мы частично повторяем пункт 1-й, то алгоритм надо прописывать с учетом вариаций вызова.
Тут нам кстати пригодится структура "ПараметрыЗаписи", можно добавлять свои ключи.
Где-то как-то так...
Автор: Vofka 03.09.12, 14:11
Цитата(DartRomanius @ 03.09.12, 14:45)
1-й вариант, вроде все ясно, отлавливаем событие "ПриЗаписи" объекта и так-как объект уже есть (опустим пока транзакционные особенности), то можно достучаться уже до "ДополнительныеСвойства"
Так а как потом достучаться до дополнительных свойств в процедуре ПослеЗаписи из модуля формы на клиенте?
Автор: DartRomanius 03.09.12, 14:16
Цитата(Vofka @ 03.09.12, 15:11)
Так а как потом достучаться до дополнительных свойств в процедуре ПослеЗаписи из модуля формы на клиенте?
Так объект уже в базе.... события происходят уже после транзакции....
Правда тока на серверной части формы, но все-же....
Автор: alex040269 03.09.12, 14:28
Цитата(DartRomanius @ 03.09.12, 15:16)
Так объект уже в базе.... события происходят уже после транзакции....
Объект в базе - не означает, что события происходят после транзакции...
ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) - еще можно влиять на значение реквизитов документа
ПриЗаписи(Отказ) - изменить реквизиты можно, но бесполезно (документ записан). Отказаться от проведения дока еще можно - транзакция продолжается!
Да к стати. Есть еще одна мыслишка на сервере доступна форма, может получится создать еще один служебный реквизит формы. Запихнуть туда уникальный идентификатор созданного дока и прочитать его на клиенте.
Автор: DartRomanius 03.09.12, 14:33
Цитата(alex040269 @ 03.09.12, 15:28)
Объект в базе - не означает, что события происходят после транзакции...
ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) - еще можно влиять на значение реквизитов документа
ПриЗаписи(Отказ) - изменить реквизиты можно, но бесполезно (документ записан). Отказаться от проведения дока еще можно - транзакция продолжается!
Да к стати. Есть еще одна мыслишка на сервере доступна форма, может получится создать еще один служебный реквизит формы. Запихнуть туда уникальный идентификатор созданного дока и прочитать его на клиенте.
Не знаю, не знаю... Сам конечно экспериментально не пробовал, но согласно вышеприведенной выше ссылке на схему
(собственно страница 832 из 1С:Предприятие 8.2 Практическое пособие разработчика)
событие "ПослеЗаписиНаСервере" в серверной части формы, уже после транзакции записи происходит.
Автор: Vofka 03.09.12, 14:44
Цитата(DartRomanius @ 03.09.12, 15:16)
Так объект уже в базе.... события происходят уже после транзакции....
Правда тока на серверной части формы, но все-же....
Наверное я чего-то не пониманию.
Итак, на пальцах. Процедура модуля объекта:
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ДополнительныеСвойства.Вставить("Тест", "Есть");
КонецПроцедуры
Процедуры в модуле формы:
&НаСервере
Процедура Тест()
// как мне отсюда к дополнительным свойствам достучаться?
// объекта того нету. И если мы даже получим тут объект - то это будет другой объект с пустыми дополнительными свойствами.
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
Тест();
КонецПроцедуры
И если можно, давайте продолжим на примерах какого-то кода.
Автор: alex040269 03.09.12, 16:04
а как открыть форму, если есть ссылка на документ?
http://pro1c.org.ua/redirect.php?http://pro1c.ho.ua/download/images/createdoc.cf
Автор: Vofka 03.09.12, 16:09
Цитата(alex040269 @ 03.09.12, 17:01) http://pro1c.org.ua/index.php?act=findpost&pid=55681
http://pro1c.org.ua/redirect.php?http://pro1c.ho.ua/download/images/createdoc.cf
И что мне покажет пустой конфиг?
Автор: alex040269 03.09.12, 19:38
Цитата(Vofka @ 03.09.12, 17:09) http://pro1c.org.ua/index.php?act=findpost&pid=55682
Но в моем случае используется не ссылка, а объект, т.к. ссылки ещё нету
а разве объекты доступны на клиенте?
Автор: Vofka 03.09.12, 20:41
Цитата(alex040269 @ 03.09.12, 20:38) http://pro1c.org.ua/index.php?act=findpost&pid=55687
а разве объекты доступны на клиенте?
Не доступен, но это роли не играет http://pro1c.org.ua/index.php?showtopic=7950
Автор: Vofka 04.09.12, 9:11
Цитата(alex040269 @ 03.09.12, 20:38) http://pro1c.org.ua/index.php?act=findpost&pid=55687
Практическое пособие разработчика - 832 стр.
.
При решении воспользовался, как писали:
Цитата(pumbaE @ 03.09.12, 9:38)
Дополнительные свойства только на сервере или толстом клиенте. Создаем временное хранилище, проводим документ, во временное хранилище возвращаем ссылку и уже на клиенте делаем Ссылка.ОткрытьЗначение() .
Если будет время и не забуду, то на досуге оформлю в виде заметки как это сделать.
Всем спасибо, всем жму палец!
PS. Не смог удержаться
Автор: DartRomanius 04.09.12, 11:18
Ох.!!!!1111адынадын
Сам в свое время мозги в гипсу держал. Теперь с ужасом сморю на формы "обыкновенные".
Запомним как данность, объект существует даже если он не записан в базу, следовательно..... надеюсь продолжать не надо?
Ссылка будет существовать (всегда) если объект записан в базу данных.
Ну и напомню прописные истины:
Модуль формы (клиент) - не имеет доступа к данным, только к своему объекту и то ограниченно, и то с оговорками.
Модуль формы (сервер) - имеет доступ к данным, но есть некоторые (относительно незначительные) особенности.
Модуль (общий? объекта?) (сервер) - имеет доступ к данным.
За сим откланяюсь.
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua