Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Открыть созданный программно документ из обработки проведения
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование управляемых форм 1С 8.2
Vofka
Привет!

Есть документ. Опущу детали и сформулирую цель так: в обработке проведения этого документа мне нужно создать программно ещё один документ (с этим вопросов нету) и открыть его. Как, собственно, открыть с сервера программно созданный объект?
alex040269
ДополнительныеСвойства smile.gif
Vofka
alex040269, не понял. blush.gif
alex040269
через ДополнительныеСвойства можно вернуть на клиент все, что угодно в т.ч. и ссылку.
pumbaE
Дополнительные свойства только на сервере или толстом клиенте. Создаем временное хранилище, проводим документ, во временное хранилище возвращаем ссылку и уже на клиенте делаем Ссылка.ОткрытьЗначение() .
Vofka
И в каком событии смотреть туда? После записи что ли?
pumbaE
Да, на клиенте ПередЗаписью создаем временное хранилище, вызываем серверную процедуру, в доп свойства записываем адресс хранилища, при проведении в хранилище записываем ссылку, массив ссылок и на клиенте после записи считываем данные из временного хранилища.
DartRomanius
Цитата(Vofka @ 03.09.12, 9:39) необходимо зарегистрироваться для просмотра ссылки
И в каком событии смотреть туда? После записи что ли?


"ПослеЗаписи".

Курить структуру "ПараметрыЗаписи".
Vofka
А если документ будет проводиться не из формы документа, а из формы списка?
alex040269
да, недосмотрел
Цитата
Может использоваться в тех случаях, когда необходимо хранить некоторые значения, связанные с объектом, на время выполнения некоторых операций, без изменения объекта. Например, при обработке событий в подписке на события.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Vofka
Да, кстати, а как же мне в форме заполнить ДополнительныеСвойства, если у меня там объекта еще нету?
zay
1.
Была похожая задача в обычном интерфейсе. Перепроводить документ2 из модуля объекта документа1, который выполнялся на сервере. Необходимо было выполнить в привилегированом модуле, а ссылку в качестве параметра функции передать нельзя - "Ошибка параметра. Передача мутабельного значения не поддерживается". Не знаю, подойдет вам такой способ или нет. В моем случае документ2 всегда уже существовал.

//В модуле документа1
ИдентификаторДокумента2  =  Документ2.УникальныйИдентификатор();
ПроцедураИзПривилегированогоМодуля(  ИдентификаторДокумента2  );


Процедура ПроцедураИзПривилегированогоМодуля(  ИдентификаторДокумента2  )

    Документ2Ссылка = Документы.Документ2.ПолучитьСсылку(   ИдентификаторДокумента2   );
    Документ2Объект = Документ2Ссылка.ПолучитьОбъект();

    //Делаем с Документ2Объект все что нам надо

КонецПроцедуры


2.
Проведение одного документа из модуля другого документа может привести к определенным проблемам. В моей ситуации это приводило к конфликтам блокировок и как следствие некоторые Документы2 не соответствовал Документу1 (ради чего это все собственно и затевалось).
Если бы делал эту задачу сейчас - вместо синхронизации одинаковых реквизитов Документа1 и Документа2 - вынес бы эти реквизиты в регистр сведений, общий для Документа1 и Документа2.
Vofka
Цитата(zay @ 03.09.12, 11:58) необходимо зарегистрироваться для просмотра ссылки
Была похожая задача в обычном интерфейсе

Это совсем другая задача. Здесь вся "соль" именно в управляемом интерфейсе.
logist
Цитата(pumbaE @ 03.09.12, 10:06) необходимо зарегистрироваться для просмотра ссылки
Да, на клиенте ПередЗаписью создаем временное хранилище, вызываем серверную процедуру, в доп свойства записываем адресс хранилища, при проведении в хранилище записываем ссылку, массив ссылок и на клиенте после записи считываем данные из временного хранилища.

+1

Цитата(Vofka @ 03.09.12, 10:09) необходимо зарегистрироваться для просмотра ссылки
А если документ будет проводиться не из формы документа, а из формы списка?

Значит в форме списка прописать тоже самое. Или сообразить универсальную процедуру в общем модуле.
Vofka
Цитата(logist @ 03.09.12, 12:05) необходимо зарегистрироваться для просмотра ссылки
Значит в форме списка прописать тоже самое. Или сообразить универсальную процедуру в общем модуле.

Ну это понятно. Вопрос в том, какое событие формы списка отлавливает обработку проведения?

Ну и актуальный вопрос ещё висит:
Цитата(Vofka @ 03.09.12, 10:17) необходимо зарегистрироваться для просмотра ссылки
Да, кстати, а как же мне в форме заполнить ДополнительныеСвойства, если у меня там объекта еще нету?

logist
Цитата(Vofka @ 03.09.12, 12:09) необходимо зарегистрироваться для просмотра ссылки
Ну это понятно. Вопрос в том, какое событие формы списка отлавливает обработку проведения?

Я бы просто запретил проводить документы в форме smile.gif
DartRomanius
Цитата(Vofka @ 03.09.12, 12:09) необходимо зарегистрироваться для просмотра ссылки
Ну это понятно. Вопрос в том, какое событие формы списка отлавливает обработку проведения?


Практическое пособие разработчика - 832 стр.
Vofka
Цитата(DartRomanius @ 03.09.12, 12:58) необходимо зарегистрироваться для просмотра ссылки
Практическое пособие разработчика - 832 стр.

Я чего-то не понимаю или же "Последовательность событий при проведении документа из формы документа" не имеет никакого отношения к форме списка?
alex040269
Цитата(Vofka @ 03.09.12, 13:13) необходимо зарегистрироваться для просмотра ссылки
Я чего-то не понимаю или же "Последовательность событий при проведении документа из формы документа" не имеет никакого отношения к форме списка?

по логике должны вызываться или нет события, определенные в самой форме. Все остальное должно вызываться независимо от способа проведения.
Vofka
Цитата(logist @ 03.09.12, 12:21) необходимо зарегистрироваться для просмотра ссылки
Я бы просто запретил проводить документы в форме smile.gif

Это же не наш метод smile.gif

Цитата(alex040269 @ 03.09.12, 13:18) необходимо зарегистрироваться для просмотра ссылки
по логике должны вызываться или нет события, определенные в самой форме

Ну так формы то самой нету, в которой эти события определены. Ну т.е. в событии формы документа ПередЗаписью, как писали выше, надо данные в хранилище поместить, а потом извлечь и что-то с ними сделать. Но в форме списка нету событий не ПередЗаписью не ПослеЗаписи. Соответственно вопрос стоит в том, как вернуть адрес хранища с сервера на клиент?

И вопрос
Цитата
Да, кстати, а как же мне в форме заполнить ДополнительныеСвойства, если у меня там объекта еще нету?

глупый и никто не отвечает или же никто не знает ответа?
logist
Цитата(Vofka @ 03.09.12, 13:27) необходимо зарегистрироваться для просмотра ссылки
Цитата
Да, кстати, а как же мне в форме заполнить ДополнительныеСвойства, если у меня там объекта еще нету?

глупый и никто не отвечает или же никто не знает ответа?

ПослеЗаписи Объект уже есть, соответственно в какой-то серверной процедуре можно взять из ДополнительныхСвойств чего-то. Т.е. в модуле при проведении записываем туда ссылку нового объекта, а в форме ПослеЗаписиНаСервере получаем ее. Только вот доступны ли ДополнительныеСвойства в форме...
alex040269
Цитата(logist @ 03.09.12, 13:53) необходимо зарегистрироваться для просмотра ссылки
Только вот доступны ли ДополнительныеСвойства в форме

не доступны. Это реквизит объекта. Время жизни равно времени жизни объекта.
DartRomanius
Цитата(Vofka @ 03.09.12, 13:27) необходимо зарегистрироваться для просмотра ссылки
Ну так формы то самой нету, в которой эти события определены. Ну т.е. в событии формы документа ПередЗаписью, как писали выше, надо данные в хранилище поместить, а потом извлечь и что-то с ними сделать. Но в форме списка нету событий не ПередЗаписью не ПослеЗаписи. Соответственно вопрос стоит в том, как вернуть адрес хранища с сервера на клиент?


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

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

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

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

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

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

Где-то как-то так... smile.gif
Vofka
Цитата(DartRomanius @ 03.09.12, 14:45) необходимо зарегистрироваться для просмотра ссылки
1-й вариант, вроде все ясно, отлавливаем событие "ПриЗаписи" объекта и так-как объект уже есть (опустим пока транзакционные особенности), то можно достучаться уже до "ДополнительныеСвойства"

Так а как потом достучаться до дополнительных свойств в процедуре ПослеЗаписи из модуля формы на клиенте?
DartRomanius
Цитата(Vofka @ 03.09.12, 15:11) необходимо зарегистрироваться для просмотра ссылки
Так а как потом достучаться до дополнительных свойств в процедуре ПослеЗаписи из модуля формы на клиенте?


Так объект уже в базе.... события происходят уже после транзакции....
Правда тока на серверной части формы, но все-же....
alex040269
Цитата(DartRomanius @ 03.09.12, 15:16) необходимо зарегистрироваться для просмотра ссылки
Так объект уже в базе.... события происходят уже после транзакции....

Объект в базе - не означает, что события происходят после транзакции...

ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) - еще можно влиять на значение реквизитов документа

ПриЗаписи(Отказ) - изменить реквизиты можно, но бесполезно (документ записан). Отказаться от проведения дока еще можно - транзакция продолжается!

Да к стати. Есть еще одна мыслишка на сервере доступна форма, может получится создать еще один служебный реквизит формы. Запихнуть туда уникальный идентификатор созданного дока и прочитать его на клиенте.
DartRomanius
Цитата(alex040269 @ 03.09.12, 15:28) необходимо зарегистрироваться для просмотра ссылки
Объект в базе - не означает, что события происходят после транзакции...

ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения) - еще можно влиять на значение реквизитов документа

ПриЗаписи(Отказ) - изменить реквизиты можно, но бесполезно (документ записан). Отказаться от проведения дока еще можно - транзакция продолжается!

Да к стати. Есть еще одна мыслишка на сервере доступна форма, может получится создать еще один служебный реквизит формы. Запихнуть туда уникальный идентификатор созданного дока и прочитать его на клиенте.


Не знаю, не знаю... Сам конечно экспериментально не пробовал, но согласно вышеприведенной выше ссылке на схему
(собственно страница 832 из 1С:Предприятие 8.2 Практическое пособие разработчика)
событие "ПослеЗаписиНаСервере" в серверной части формы, уже после транзакции записи происходит.
Vofka
Цитата(DartRomanius @ 03.09.12, 15:16) необходимо зарегистрироваться для просмотра ссылки
Так объект уже в базе.... события происходят уже после транзакции....
Правда тока на серверной части формы, но все-же....

Наверное я чего-то не пониманию.

Итак, на пальцах. Процедура модуля объекта:

Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    ДополнительныеСвойства.Вставить("Тест", "Есть");
КонецПроцедуры


Процедуры в модуле формы:

&НаСервере
Процедура Тест()
    // как мне отсюда к дополнительным свойствам достучаться?
        // объекта того нету. И если мы даже получим тут объект - то это будет другой объект с пустыми дополнительными свойствами.
КонецПроцедуры

&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
    Тест();
КонецПроцедуры


И если можно, давайте продолжим на примерах какого-то кода.
alex040269
а как открыть форму, если есть ссылка на документ?

необходимо зарегистрироваться для просмотра ссылки
Vofka
Цитата(alex040269 @ 03.09.12, 17:01) необходимо зарегистрироваться для просмотра ссылки
а как открыть форму, если есть ссылка на документ?

ОткрытьЗначение();


Но в моем случае используется не ссылка, а объект, т.к. ссылки ещё нету. Но не в этом суть, это так, небольшой отступ, который не является предметом обсуждения данной темы.

Цитата(alex040269 @ 03.09.12, 17:04) необходимо зарегистрироваться для просмотра ссылки
необходимо зарегистрироваться для просмотра ссылки

И что мне покажет пустой конфиг?
alex040269
Цитата(Vofka @ 03.09.12, 17:09) необходимо зарегистрироваться для просмотра ссылки
И что мне покажет пустой конфиг?


ну конфиг не совсем пучтой!!! А что вы ожидали УПП за 15 мин?

Цитата(Vofka @ 03.09.12, 17:09) необходимо зарегистрироваться для просмотра ссылки
Но в моем случае используется не ссылка, а объект, т.к. ссылки ещё нету

а разве объекты доступны на клиенте?
Vofka
Цитата(alex040269 @ 03.09.12, 20:38) необходимо зарегистрироваться для просмотра ссылки
ну конфиг не совсем пучтой!!!

Странно, я просмотрел, ничего не увидел там вообще. Завтра ещё раз гляну.

Цитата(alex040269 @ 03.09.12, 20:38) необходимо зарегистрироваться для просмотра ссылки
а разве объекты доступны на клиенте?

Не доступен, но это роли не играет необходимо зарегистрироваться для просмотра ссылки
Vofka
Цитата(alex040269 @ 03.09.12, 20:38) необходимо зарегистрироваться для просмотра ссылки
ну конфиг не совсем пучтой!!!

Перекачал, появилось 2 документа. Как добраться до объекта теперь я понял faceoff.gif . Но ваш вариант немного не то, что надо, потому что вы создаете документ и записываете его, а мне надо без записи. Но с остальным я разобрался. Мой затык был в том, что я не знал, как потом добраться до текущего объекта. Тепер я понял к чему было сказано
Цитата(DartRomanius @ 03.09.12, 12:58) необходимо зарегистрироваться для просмотра ссылки
Практическое пособие разработчика - 832 стр.

smile.gif .

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


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

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

PS. Не смог удержаться
DartRomanius
Ох.!!!!1111адынадын

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

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

За сим откланяюсь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.