Версия для печати темы (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

ДополнительныеСвойства smile.gif

Автор: Vofka 03.09.12, 8:18

alex040269, не понял. blush.gif

Автор: 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) *
Ну это понятно. Вопрос в том, какое событие формы списка отлавливает обработку проведения?

Я бы просто запретил проводить документы в форме smile.gif

Автор: 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

smile.gif

Автор: Vofka 03.09.12, 13:29

Запутали ещё больше smile.gif . В общем, я по позже ещё тему перечитаю, покручу то о чем здесь написано и отпишу. Всем спасибо за ответы!

Автор: DartRomanius 03.09.12, 13:45

Ладно, попробую .....

Есть:
- "документ 1" - создаем, зписываем/проводим, проводим существующий из формы списка.
- "документ 2" - создается из модуля проведения (и проводится) документа1.

в догонку:
- "документ 1", знает о наличии отсутствии (как вариант реквизит-ссылка) "документа 2".

Варианты:
1. "Документ 1" - проводится (и записывается ессно..) из собственной формы документа.
2. "Документ 1" - проводится/перепроводится (хотя не суть важно) из "ФормаСписка"/"ФормаВыбора" (как вариант еще журналы, но принцип тот-же).

Решения:
1-й вариант, вроде все ясно, отлавливаем событие "ПриЗаписи" объекта и так-как объект уже есть (опустим пока транзакционные особенности), то можно достучаться уже до "ДополнительныеСвойства".
2-й вариант сложнее, требуется модернизировать "ФормуДокумента" у "документ 1". Требуется ввести параметр формы (причем возможно "ключевой"). Далее перед открытием формы делать анализ, и передавать данные форме (списка) которая открыла форму с параметрами (необходимыми нам). ЗЫ: Думаю отдельная команда в списке тут в самый раз. Так-как мы частично повторяем пункт 1-й, то алгоритм надо прописывать с учетом вариаций вызова.
Тут нам кстати пригодится структура "ПараметрыЗаписи", можно добавлять свои ключи.

Где-то как-то так... smile.gif

Автор: 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 стр.

smile.gif .

При решении воспользовался, как писали:
Цитата(pumbaE @ 03.09.12, 9:38) *
Дополнительные свойства только на сервере или толстом клиенте. Создаем временное хранилище, проводим документ, во временное хранилище возвращаем ссылку и уже на клиенте делаем Ссылка.ОткрытьЗначение() .


Если будет время и не забуду, то на досуге оформлю в виде заметки как это сделать.

Всем спасибо, всем жму палец! smile.gif

PS. Не смог удержаться

Автор: DartRomanius 04.09.12, 11:18

Ох.!!!!1111адынадын

Сам в свое время мозги в гипсу держал. Теперь с ужасом сморю на формы "обыкновенные". smile.gif
Запомним как данность, объект существует даже если он не записан в базу, следовательно..... надеюсь продолжать не надо?
Ссылка будет существовать (всегда) если объект записан в базу данных.

Ну и напомню прописные истины:
Модуль формы (клиент) - не имеет доступа к данным, только к своему объекту и то ограниченно, и то с оговорками.
Модуль формы (сервер) - имеет доступ к данным, но есть некоторые (относительно незначительные) особенности.
Модуль (общий? объекта?) (сервер) - имеет доступ к данным.

За сим откланяюсь.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua