Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
29 мар 2024, 10:14

Копирование подчиненных документов при интерактивном копировании документа

Автор dtritus, 13 янв 2016, 09:45

0 Пользователей и 1 гость просматривают эту тему.

dtritus

Есть документ "Задача". Он может быть связан с другими "Задачами" следующим образом: в состав Задачи могут входить подзадачи (это простые "Задачи" ссылающиеся реквизитом "Родитель" на главную задачу). В Форме списка можно скопировать Задачу (нажатием F9), при этом происходит открытие формы документа (создание задачи), но подчиненные задачи не копируются и не устанавливается на них связь. При копировании срабатывает:
Процедура ПриКопировании(ОбъектКопирования) в модуле объекта (тут я могу получить необходимые подзадачи от ОбъектКопирования и скопировать их, но сослаться на саму новую Задачу как родитель не получается - так как этот документ ещё не записан) Далее происходит:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
     в модуле ФормаДокумента. В ней я также могу получить подзадачи и скопировать их, но установить ссылку на родителя не получается, так как у меня ещё по прежнему не записан новый документ, а обратиться к документу тоже не могу он ещё не создан как объект. Далее происходит
&НаКлиенте
Процедура ПриОткрытии(Отказ)
в модуле ФормаДокумента.

Этот вопрос уже много раз обсуждался, много прочитал тем по этому поводу, но как и откуда записать новый документ чтобы потом на него сослаться так и не понял. Подскажите пути решения проблемы.

Vladimir_Sh

Я бы наверное сделал так:
1. Создал параметр формы, например ПодчиненныеЗадачи
2. В событии "ПриКопировании" заполнял параметр
3. В событии "ПослеЗаписи" (там уже будет ссылка на созданную задачу), брал значения из параметра и заполнял как нужно.
4. Добавить необходимые условия в события (по вкусу :D ).
Если я Вам помог, нажми - Спасибо!

cska-fanat-kz

для УЖЕ СУЩЕСТВУЮЩЕЙ задачи придумать кнопку "Копировать подзадачи из другой задачи"....
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

dtritus

Цитата: Vladimir_Sh от 13 янв 2016, 10:05
Я бы наверное сделал так:
1. Создал параметр формы, например ПодчиненныеЗадачи
2. В событии "ПриКопировании" заполнял параметр
3. В событии "ПослеЗаписи" (там уже будет ссылка на созданную задачу), брал значения из параметра и заполнял как нужно.
4. Добавить необходимые условия в события (по вкусу :D ).

А как из модуля объекта (ПриКопировании) получить доступ к параметру формы ПодчиненныеЗадачи?

Vladimir_Sh

dtritus, вот жешь :( . Что-то я забыл такой маленький момент :). Тогда реквизит, его даже можно в дальнейшем где нить использовать.
Если я Вам помог, нажми - Спасибо!

dtritus

Цитата: Vladimir_Sh от 13 янв 2016, 13:50
dtritus, вот жешь :( . Что-то я забыл такой маленький момент :). Тогда реквизит, его даже можно в дальнейшем где нить использовать.

А ПослеЗаписи это в модуле Формы или модуле объекта делать ? И как получить объект подчиненное задание из реквизита основного?

Vladimir_Sh

Кстати Вы можете на самом деле в Собитий ПриЗаписи в модуле объекта запросом (или еще каким образом) собирать подчиненные объекты документа основания и делать с ними что угодно, не добавляя доп. реквизиты.
Важный момент если будете править этот же документ в событии его будет необходимо записать повторно и в этом случае событие отработает повторно будьте внимательны.
Если я Вам помог, нажми - Спасибо!

dtritus

Цитата: Vladimir_Sh от 13 янв 2016, 15:29
Кстати Вы можете на самом деле в Собитий ПриЗаписи в модуле объекта запросом (или еще каким образом) собирать подчиненные объекты документа основания и делать с ними что угодно, не добавляя доп. реквизиты.
Важный момент если будете править этот же документ в событии его будет необходимо записать повторно и в этом случае событие отработает повторно будьте внимательны.
в событии ПриЗаписи (если не использовать доп. реквизитов) у меня уже нет доступа к документу от которого скопировали Текущий (соответственно не могу получить(скопировать и сослаться на Текущий) подчиненные документы). Поэтому реквизит такой нужен. Но Ваша мысль мне помогла, и именно в модуле объекта ПриЗаписи я буду доставать документ от которого был скопирован Текущий (если такой есть) и получать подчиненные.
Добавлено: 13 янв 2016, 17:03


Добавил реквизит в объект СкопированОт. В модуле объекта ПриКопировании устанавливал СкопированОт=ОбъектКопирования.Ссылка . Далее в этом же модуле ПриЗаписи брал СкопированОт от него получал подчиненные документы, их копировал и устанавливал им родителя ЭтотОбъект.Ссылка. Ну и добавил пару условий чтобы при первой записи после копирования документа реквизит СкопированОт очищался и объект ещё раз записывался.

Модуль Объекта

Процедура ПриКопировании(ОбъектКопирования)
    #Область ДОБАВЛЕНИЯ
//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
//
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Задание.Ссылка КАК Задание,
| Задание.Номер КАК Номер,
| Задание.Дата КАК Дата,
| Задание.Выполнено,
| Задание.ТекущийИсполнитель,
| Задание.ТекущийЭтап,
| Задание.Тема,
| Задание.ТекущийЭтап.НавСсылка КАК НавСсылка,
| Задание.Процесс,
| Задание.Сервис
|ИЗ
| Документ.Задание КАК Задание
|ГДЕ
| Задание.Родитель = &Родитель
| И Задание.Родитель <> ЗНАЧЕНИЕ(Документ.Задание.ПустаяСсылка)
| И НЕ Задание.ПометкаУдаления
|
|УПОРЯДОЧИТЬ ПО
| Дата,
| Номер,
| Задание.Ссылка
|АВТОУПОРЯДОЧИВАНИЕ";

Запрос.УстановитьПараметр("Родитель", ОбъектКопирования.Ссылка);
РезультатЗапроса = Запрос.Выполнить();       
Если НЕ РезультатЗапроса.Пустой() Тогда
СкопированОт = ОбъектКопирования.Ссылка;
КонецЕсли
//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
#КонецОбласти
КонецПроцедуры

Процедура ПриЗаписи(Отказ)
#Область ДОБАВЛЕНИЯ
Если ЗначениеЗаполнено(ЭтотОбъект.СкопированОт) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Задание.Ссылка КАК Задание,
| Задание.Номер КАК Номер,
| Задание.Дата КАК Дата,
| Задание.Выполнено,
| Задание.ТекущийИсполнитель,
| Задание.ТекущийЭтап,
| Задание.Тема,
| Задание.ТекущийЭтап.НавСсылка КАК НавСсылка,
| Задание.Процесс,
| Задание.Сервис
|ИЗ
| Документ.Задание КАК Задание
|ГДЕ
| Задание.Родитель = &Родитель
| И Задание.Родитель <> ЗНАЧЕНИЕ(Документ.Задание.ПустаяСсылка)
| И НЕ Задание.ПометкаУдаления
|
|УПОРЯДОЧИТЬ ПО
| Дата,
| Номер,
| Задание.Ссылка
|АВТОУПОРЯДОЧИВАНИЕ";
Запрос.УстановитьПараметр("Родитель", ЭтотОбъект.СкопированОт.Ссылка);
РезультатЗапроса = Запрос.Выполнить();       
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Задание = ВыборкаДетальныеЗаписи.Задание.Скопировать();
Задание.Дата = ТекущаяДата();
Задание.Родитель = ЭтотОбъект.Ссылка;
Задание.Записать();
КонецЦикла;
ЭтотОбъект.СкопированОт = NULL;
ЭтотОбъект.Записать();
КонецЕсли;
#КонецОбласти
КонецПроцедуры

В общем как то так получилось. Протестировал - полёт нормальный.

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск