Имя: Пароль:
1C
1C 7.7
v7: Программное копирование документа.
0 Eeakie
 
10.06.14
17:54
Добрый вечер.
Программно копирую документ, но не могу потом поймать его контекст.
Делаю через:
1. Открывается журнал документа и документ делается активным (АктивизироватьОбъект);
2. Копирую документ, Сервис.ЭмулироватьКлавиатуру("{F9}");
3. Журнал закрывается.

В итоге у меня есть скопированный документ, но нет к нему доступа. Пробовал через АктивныйКонтекст(), но ловится только документ-исходник.

Есть какой-нибудь вариант поймать контекст копии?

Можно, я так понимаю, сделать просто через "ОткрытьФорму()" новый документ и скопировать через метаданные все атрибуты. И контекст там будет, но это второй вариант.
1 ДенисЧ
 
10.06.14
17:55
А зачем такой гемор?
Не проще ли программно его скопировать, заполнив по метаданным?
2 Eeakie
 
10.06.14
17:57
(1) Казалось что проще сэмулировать копирование, чем заполнять по метаданным.
3 ДенисЧ
 
10.06.14
17:58
(2) хм... Ты всегда левое ухо правой ногой чешешь?
4 Eeakie
 
10.06.14
18:02
(3) Понял. Делаю через мета.
5 Fedor-1971
 
10.06.14
18:04
(0) Что сделать то хочешь?
6 Fedor-1971
 
10.06.14
18:05
(5)+ В смысле какая исходная задача для копирования документа?
7 Ёпрст
 
10.06.14
18:06
всего-то примитивный запрос на insert в пару-тройку табличек.
8 Eeakie
 
10.06.14
18:22
(6) Надо в документе сделать кнопку, которая будет делать идентичный документ, но разбивать табличную часть по условию. Т.е. какая-то часть строк останется в первом документе, а остальные перейдут в копию.
(7) Да я был бы рад сделать прямым, но пока что не имею представления как это сделать.
9 Fedor-1971
 
10.06.14
18:33
(8) ВводНаОсновании(ДокОснование) - почитай в справке, там есть документ основание и твой новый документ - новый заполняй как тебе нужно.
10 Eeakie
 
10.06.14
18:38
(9) В моём документе не прописана процедура ввода на основании документа такого же вида. Писать её не вижу смысла. Надо всего-то сделать копию текущего документа, а там уже с табличной частью разбираться.
11 Eeakie
 
10.06.14
18:38
Что не так?

КонтКопии = "";
    ОткрытьФорму("Документ.Заявка", КонтКопии);
    
    МД_Документ = Метаданные.Документ(ДокИсточник.Вид());
    
    Для Ъ = 1 По Метаданные.ОбщийРеквизитДокумента() Цикл
        ИдентификаторРеквизита = Метаданные.ОбщийРеквизитДокумента(Ъ).Идентификатор;
        Значение = ДокИсточник.ПолучитьАтрибут(ИдентификаторРеквизита);
        КонтКопии.УстановитьАтрибут(ИдентификаторРеквизита, Значение);
    КонецЦикла;
    
    Для Ъ = 1 По МД_Документ.РеквизитШапки() Цикл
        ИдентификаторРеквизита = МД_Документ.РеквизитШапки(Ъ).Идентификатор;
        Значение = ДокИсточник.ПолучитьАтрибут(ИдентификаторРеквизита);
        Если МД_Документ.РеквизитШапки(Ъ).Тип = "Неопределенный" Тогда
            КонтКопии.НазначитьТип(ИдентификаторРеквизита, ТипЗначенияСтр(Значение)  + "." + Значение.Вид());        
        КонецЕсли;
        КонтКопии.УстановитьАтрибут(ИдентификаторРеквизита, Значение);
    КонецЦикла;
    
    ДокИсточник.ВыбратьСтроки();
    Пока ДокИсточник.ПолучитьСтроку() = 1 цикл
        КонтКопии.НоваяСтрока();
        Для Ъ = 1 По МД_Документ.РеквизитТабличнойЧасти() Цикл
            ИдентификаторРеквизита = МД_Документ.РеквизитТабличнойЧасти(Ъ).Идентификатор;
            Значение = ДокИсточник.ПолучитьАтрибут(ИдентификаторРеквизита);
            КонтКопии.УстановитьАтрибут(ИдентификаторРеквизита, Значение);
        КонецЦикла;
    КонецЦикла;
12 Eeakie
 
10.06.14
18:40
У меня есть подозрение, что работа с атрибутами через КонтекстФормы это хреновое занятие.
13 ДенисЧ
 
10.06.14
18:45
(11) Ты на пальцах расскажи, занафея тебе форму открывать??
14 Eeakie
 
10.06.14
18:48
(13) Знаю, уже много раз получал в морду эту фразу, но тут надо именно так.

Можно создать программно через Новый() и заполнить, но этот документ (копию) нужно будет сразу выдать на экран. А для этого его нужно будет сохранить после создания. Нафига мне это надо? Надо открыть форму, заполнить чё надо и думать писать его в базу или нет.
15 Fedor-1971
 
10.06.14
18:50
(14) в (9) же сказал - откроется форма нового документа заполненная как написано в процедуре ВводНаОсновании. Пользователь примет решение - сохранять или нет.
16 Eeakie
 
10.06.14
19:13
(15) Я, возможно, как-то неправильно поставил вопрос. Мне надо просто скопировать документ, на который есть ссылка и получить контекст формы полученного копированием документа.
17 Eeakie
 
10.06.14
19:15
+(15) Зачем мне дописывать ВводНаОсновании()? Можно и через метаданные скопировать.
18 Eeakie
 
10.06.14
19:17
++(15) Это сродни тому, что я и хочу: "ОткрытьФорму() и через контекст делать что угодно", но только без переписи ВводНаОсновании().
19 Chai Nic
 
10.06.14
19:20
Через контекст, вроде как, будет работать только если formex подключен..
Ошибка? Это не ошибка, это системная функция.