Имя: Пароль:
1C
1C 7.7
v7: Как по кнопке скопировать документ
,
0 exec11
 
01.03.23
17:58
v77  !!
Задача простая, надо поставить кнопку в форму документа СчетНаОплату.
Заходи в СчетНаОплату, жмем кнопку "Копировать документ".
Должен открыться СчетНаОплату, точно такой же как был. То есть все реквизиты скопированы.
Кнопка для ленивых, которым лень заполнять реквизиты, если все одинаково, надо просто пере выставить документ.

В модуле документа есть код, который определяет новый документ и копируется.
В соответствии с этим заполняет реквизиты.

Процедура ВводНового(Скопирован, ДокКоп)  
    Если Скопирован = 1 Тогда
        Сообщить("Копия !! !!");  
        Счет             = ДокКоп.Счет;
    Иначе  
        Сообщить("Новый !! !!");

    КонецЕсли;  

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

Обработчик на кнопке "Копировать документ"

?(Выбран()=1,  ОткрытьФорму("Документ.СчетНаОплату", Конт), 0   )

Но что то я проваливаюсь всегда в новый. А нужно в копию.

Как туда попасть ?
1 АгентБезопасной Нацио
 
01.03.23
18:14
Спрашивать у МужикаВКепке® не пробовал?
2 HawkEye
 
01.03.23
21:20
(0) а копия - не новый? ))
3 MWWRuza
 
гуру
01.03.23
21:58
(0) Не заю... Вообще-то работает, не понимаю, в чем у Вас проблемы: https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-484.jpg
4 MWWRuza
 
гуру
01.03.23
22:04
+(3) Ааааа.... Понял, вот это: "Обработчик на кнопке "Копировать документ""
Какой обработчик и зачем? Копирование - системная функция, вызывается кнопочкой с плюсиком... То, что Вы "пешком" открываете форму нового документа, копирование здесь ни при чем...
5 MWWRuza
 
гуру
01.03.23
22:06
+(4) Если по каким-то причинам системная функция не подходит, то нужно всю процедуру копирования так-же "пешком" писать...
6 andrewalexk
 
02.03.23
07:22
:) понаберут из восьмерки мучайся потом с ними
7 exec11
 
02.03.23
08:16
(3) с плюсиком это из журнала. А если открывается документ для размножения из отчета ?
Вообщем не суть. Надо размножить документ по кнопке из формы документа.

На самом деле я уже решил эту задачку, дополнительной проверкой в разделе "Новый". Но как то "Костыль".
Если по плюсику из журнала, то попадаешь в раздел копирование.
Если по кнопке, то попадаешь с начало в раздел новый, а потом по условию проваливаешься дальше.
Получается заполнение при копировании должно быть одинаковое, а описывается в разных местах кода.
Не красиво как то.
Может кто знает как сделать красиво и правильно ?
8 Калиостро
 
02.03.23
08:23
(0) Если нет реквизитов неопределенного вида, то примерно так:
Процедура Скопировать(ДокИсточник, ДокПриемник)
    
    ВидДок=ДокИсточник.Вид();                                                      
    Для к=1 по Метаданные.ОбщийРеквизитДокумента() Цикл
        ИдМетаРекв=Метаданные.ОбщийРеквизитДокумента(к).Идентификатор;
        ДокПриемник.УстановитьАтрибут(ИдМетаРекв, ДокИсточник.ПолучитьАтрибут(ИдМетаРекв));
    КонецЦикла;
    МетаДок=Метаданные.Документ(ВидДок);
    Для к=1 по МетаДок.РеквизитШапки() Цикл
        ИдМетаРекв=МетаДок.РеквизитШапки(к).Идентификатор;
        ДокПриемник.УстановитьАтрибут(ИдМетаРекв, ДокИсточник.ПолучитьАтрибут(ИдМетаРекв));
    КонецЦикла;

    ДокИсточник.ВыбратьСтроки();
    Пока ДокИсточник.ПолучитьСтроку() = 1 Цикл
        МетаДок=Метаданные.Документ(ДокИсточник.Вид());
        Для к=1 по МетаДок.РеквизитТабличнойЧасти() Цикл
            ИдМетаРекв = МетаДок.РеквизитШапки(к).Идентификатор;
            
            ДокПриемник.НоваяСтрока();
            ДокПриемник.УстановитьАтрибут(ИдМетаРекв, ДокИсточник.ПолучитьАтрибут(ИдМетаРекв));
        КонецЦикла;
    КонецЦикла;
    
КонецПроцедуры
9 exec11
 
02.03.23
08:27
А в кнопке что пишем ?
10 АгентБезопасной Нацио
 
02.03.23
09:31
(7) читать инструкцию-то - не пробовал?
Ну там же русским языком написано, что коприрование только при интерактивных действиях
11 uno-group
 
02.03.23
10:16
(9) ОткрытьФорму(<ОписательОбъекта>,<КонтекстФормы>,<ДокументОснование>)
В контекст загоняешь признак копирования в документ основание копируемый документ
и обробатываешь все в привводе на основании
12 АгентБезопасной Нацио
 
02.03.23
11:03
(11) агащаззблин!
Спроси у МужикаВКепке, и он тебе скажет, что ВводНаОсновании работает только при интерактивном вводе.
13 exec11
 
02.03.23
11:19
ОткрытьФорму(<ОписательОбъекта>,<КонтекстФормы>,<ДокументОснование>)
Так сейчас у меня реализовано, через ввод Нового и доп условие.

Но, как через ОткрытьФорму() попасть в раздел кода Копирование.
Я пока не придумал.

Как передать значения в переменные ДокИсточник и ДокПриемник
Процедура Скопировать(ДокИсточник, ДокПриемник)
и что передавать.

Лучше пример. А то домысливать сложно, есть нюансы.

(8) - ну и у меня код по меньше и по проще .. ну и по наглядней ..
рек = Копия.рек
рек1 = Копия.рек1
рек2 = Копия.рек2
....
14 Bigbro
 
02.03.23
11:26
ну так через ввод нового же работает, в параметры туда передавай что хочешь и разбирай потом соответствено.
15 Злопчинский
 
02.03.23
11:56
(13) не надо ничего придумывать.
в зависимости от отого как открываетяс форма - отрабатывают предопределенные процедуры в определенном порядке.
если просто октрываешт форму НОВОГО документа по кнопке - отрабатывает ВводНового(), потом ПриОткрытии()
если открываешь форму по кнокпе с передачей третьего параметра ДокументОснование - первой отрабатывает ВводНаОсновании(), потом ПриОткрытии()
.
а дальше - как хочешь так и делай.
для копирования текущего документа ___по кнопке в форме текущего документа____ - я бы воспользовался
ОткрытьФорму(<ОписательОбъекта>,<КонтекстФормы>,<ДокументОснование>) - при этом к документу-основанию ясен пень не привязывался бы, ибо это ввод нового независимого документа, а далюше в предопределенной ВводНаОсновании() как в (8).
16 exec11
 
02.03.23
12:29
(15) Какой то примерчик кода, как передавать параметры из кнопки в процедуру можете написать.

Инструкции в интернете я читал. Встроенную помощь 1с тоже. Есть нюансы в понимании и реализации. Иной раз тяжко без примера.
17 Fedor-1971
 
02.03.23
14:09
(16) ОткрытьФорму("Документ.СчетНаОплату", "ЭтоБлинКопия", ТекущийДокумент())

в ВводНаОсновании  проверь Форма.Параметр = "ЭтоБлинКопия" и в (8) описали как универсально заполнить новый документ
18 exec11
 
02.03.23
14:27
Ну.. у меня по сути почти то же самое ..

ОткрытьФорму("Документ.СчетНаОплату", ТекущийДокумент())

...
    Иначе  
        Сообщить("Новый !! !!");
        Если ПустоеЗначение(Форма.Параметра)=0 Тогда
            рек = Форма.Параметр.рек;
            рек1 = Форма.Параметр.рек1;
            рек2 = Форма.Параметр.рек2;
                        ...
               Иначе
19 exec11
 
02.03.23
14:36
А если делаем так:
ОткрытьФорму("Документ.СчетНаОплату", Скопирован, ТекущийДокумент())

Процедура ВводНового(Скопирован, ДокКоп)  
    Если Скопирован = 1 Тогда
        Сообщить("Копия !! !!");

Валимся в ошибку:
ОткрытьФорму("Документ.СчетНаОплату", Скопирован<<?>>, ТекущийДокумент())

Переменная не определена(Скопирован)

Такой вариант тоже не проходит:
ОткрытьФорму("Документ.СчетНаОплату", Скопирован=1, ТекущийДокумент())

Такой вариант тоже не проходит:
Скопирован=1; ОткрытьФорму("Документ.СчетНаОплату", Скопирован, ТекущийДокумент())
20 exec11
 
02.03.23
14:38
"ЭтоБлинКопия" - что это такое блин. Не понимаю. Инструкцию 10 раз перечитал. Их определение.
21 АгентБезопасной Нацио
 
02.03.23
14:40
(20) напиши ЭтоЛятьКопияПонялДаБегомМля
22 АгентБезопасной Нацио
 
02.03.23
14:42
Хотя предложение передавать в качестве контекста константную строку - забавно. Может и будет работать - а может, и нет...
23 mishaPH
 
02.03.23
15:36
(0) ввод копированием никакого не имеет отношения к статусу копия! ввод копированием это = ввод на основании самого себя же. Полученный док = новый
24 mishaPH
 
02.03.23
15:37
т.к. получает новый код и т.п. а не версия на основании которого введен. Если вы конечно не городите какой-то велосипед
25 uno-group
 
02.03.23
16:00
ВВодеНового Признак того что это копия просто говорит о том что документ введен нажатием "Ф9" ни какого дополнительного заполнения изменение этого флага программно не делает.
То что ты передал в Скопирован в Открыть форму в открытой форме читается из форма.параметр.
(12) из 0 -"Должен открыться СчетНаОплату" если форма открывается то это уже интерактивный ввод и процедура ввод на основании срабатывает.
26 Fedor-1971
 
02.03.23
18:11
(20)(22) Если очень нужно получить дополнительный признак, что документ создаём копией именно по кнопке, а не через Ф9,
тогда в параметр открытия формы отправляем текстовую строку (или что-нить другое) для определения, что нажата именно наша кнопка

Дальше, в процедуре ВводНаОсновании через Форма.Параметр отлавливаем сей признак, ну и строим алгоритм с учётом оного
Если алгоритм не зависит от "По нашей кнопке скопировали", то и передавать в параметр ничего не нужно
27 Fedor-1971
 
02.03.23
18:14
(22) нам не нужен контекст текущей формы в создаваемом документе, мы отправили ссылку на исходный док в 3-м параметре
28 АгентБезопасной Нацио
 
02.03.23
18:21
(27) просто по мурзилке там должна быть переменная. Ибо пока форма открыта - в этуой переменной контекст открытой (новой, а не текущей) формы.
29 HawkEye
 
02.03.23
19:08
(19) Через открытьФорму() не передается признак копирования, читай СП там описаны все параметры ОткрытьФорму...


Скопирован в ВводНового() только при интерактивном копировании через "+", тоже писали выше...
ОткрытьФорму - это не копирование, это ВводНаОсновании...
30 Злопчинский
 
03.03.23
00:05
(28) не обязательно, второй параметр можно не передавать
31 Злопчинский
 
03.03.23
00:06
(20) ну, блин, стучись в скайп Zlopun - накидаем за минут 10 твой вариант
32 big
 
03.03.23
08:23
Через метаданные ещё не советовали копию документа делать?
33 Злопчинский
 
03.03.23
11:06
(32) в (8)
34 Остап Ибрагимович
 
03.03.23
22:02
открыть форму списка, активизировать через контекст нужный док - и сэмулирровать нажатие F9 - предлагали?
35 Злопчинский
 
03.03.23
22:36
(34) прочитал все буквы, но не смог прочитать слово.
есть и такой вариант.
Только надо учесть что форма списка может открываться с разными режимами и чтобы попасть на нужный док через контекст - надо будет знать чтоименно происходит в списке доков при открытии
36 MWWRuza
 
гуру
04.03.23
00:15
(34) Это, наверное, самый просто вариант. Будет копирование штатной функцией, не нужно реквизиты перебирать, ни пешком, ни через метаданные, но ФормЕх нужен, иначе как F9 эмулировать(можно конечно и через винскрипт, но ФормЕксом изящьнее) :-)
37 Злопчинский
 
04.03.23
00:17
(36) Rwidjets еще можно, посылку команд сооветсвующих меню.
и Через 1С++ вроде тоже можно
;-)
Широк и бескраен мир клюшек.
Это вам не снеговик...
38 АгентБезопасной Нацио
 
04.03.23
10:38
Трое суток обсуждать задачу, решаемую примерно за 10 минут?.
39 Злопчинский
 
04.03.23
12:58
многие знания - многие печали :-)
автор, видимо, осилил - я ему предлагал скайп
40 alyuev
 
16.03.23
13:14
Процедура ОткрытьСистемноеОкно(КодОкна=32854) Экспорт //Получить номер команды можно с помощью метода ПриПолученииКоманды() ВК RWidjets //+Al 2014-07-11 11:33:15
    //или ПриПолученииКомандыГлавнымОкном(wParam, lParam) //событие от Formex (v142)
    //или ПриПолученииСистемнойКомандыГлавнымОкном(wParam, lParam) //событие от Formex (v142)
    //32854 - команда открытия списка пользователей из конфигуратора
    //32865 - команда открытия окна формул
    //32876 - меню "Подчиненные документы"
    //32880 - меню "Движения документа" (Document Movements)
    //32912 - окно Операции проводок документа
    //32918 - окно проводок документа
    //57600 - команда "Новый документ" для открытия текстового окна или таблицы
    //57601 - меню "Открыть файл..."
    //57603 - Сохранение (напр. печатной формы)
    //57664 - кнопка ? на стандартной панели. Или меню "Помощь/О программе..."
    //57669 - кнопка Стрелка со знаком вопроса для принудительного вызова подсказки элемента
    //57670 - нажата F1
    //99298 - нажата F8 в журнале Операций = отключение проводок
    //123170 - копирование в буфер обмена при нажатии Ctrl+C
    //32790 (98326?) - нажата F9 - копирование

    //а так же в новом FormEx (120 и выше) появился аналогичный обработчик-перехватчик ПриПолученииКоманды и ПриПолученииСистемнойКоманды
    //Или с помощью ResHacker.exe в разделе Menu рядом с пунктом идет номер, например MENUITEM "&Интервал",  32881
    //Вот здесь было обсуждение http://1c.alterplast.ru/faq/tlpt_t1c/tlpt_t1c_6.html
    ТекстМодуля = "
    |Public Const WM_COMMAND = &h111
    |Public Sub GetUsersWindow()
    |    Set Wrap = CreateObject(""DynamicWrapperX"")
    |    Wrap.Register ""USER32"", ""GetForegroundWindow"", ""f=s"", ""r=l""
    |    Wrap.Register ""user32"", ""SendMessage""     ,  ""i=hull""    , ""r=l""
    //|    Wrap.Register ""Kernel32"", ""GetProcAddress"" , ""i=hl""    , ""r=u""
    //|    Wrap.Register ""Kernel32"", ""LoadLibrary""    , ""i=s""    , ""r=h""
    //|    handle  = Wrap.LoadLibrary(""mfc42"")
    //|    func    = Wrap.GetProcAddress(handle, 6575) 'AfxGetMainWnd(void)
    //|    Res = Wrap.RegisterAddr(func, ""AfxGetMainWnd"", ""r=l"")
    //|    h1C = Wrap.NumGet(Wrap.AfxGetMainWnd(), 32)
    |    Res = Wrap.SendMessage(Wrap.GetForegroundWindow(), WM_COMMAND, "+КодОкна+", 0)
    |End Sub";
    мScrptCtrl = СоздатьОбъект("MSScriptControl.ScriptControl");
    мScrptCtrl.Language = "vbscript";мScrptCtrl.AddCode(ТекстМодуля);
    мScrptCtrl.CodeObject.GetUsersWindow();
КонецПроцедуры
41 Arbuz
 
16.03.23
16:10
(40) Дык, а зачем? Если в формексе есть
ОтправитьОконноеСообщение(<?>,,,)
Синтаксис:
ОтправитьОконноеСообщение(<Дескриптор>,<Сообщение>,<wParam>,<lParam>)
Назначение:
Отправляет окну сообщение через функцию WinAPI SendMessage()
Параметры:
<Дескриптор> - дескриптор окна;
<Сообщение> - передаваемое окну сообщение;
<wParam>,<lParam> - параметры сообщения.
Подробней см. в описании функции SendMessage() в документации по WinAPI.
Возвращает:
Результат выполнения функции WinAPI.
ПРИМЕР:
атр = СоздатьОбъект(''АтрибутФормы'');
атр.УстановитьАтрибут(Форма, ''ТабличноеПоле'');
WM_LBUTTONUP = 514;
глСервис.ОтправитьОконноеСообщение(атр.Дескриптор,WM_LBUTTONUP,0,0);
42 Djelf
 
16.03.23
16:21
(41) Дык, и это зачем? Если в формексе есть

Сервис.КопироватьОбъект(<?>,)
Синтаксис:
КопироватьОбъект(<Объект>, <КонтекстФормы>)
Назначение:
Открывает форму нового объекта, созданного путем копирования указанного объекта. Аналогично нажатию кнопки ''Копировать строку (F9)'' в панели инструментов журнала документов.
Работает только для документов.
Параметры:
<Объект> - копируемый объект;
<КонтекстФормы> - имя переменной, куда можно задать значение любого типа для передачи в открываемую форму. Данное значение будет доступно в открытой форме как атрибут Форма.Параметр. После исполнения данного метода система вернет в данную переменную контекст открытой формы (необязателен).
43 Arbuz
 
16.03.23
17:07
(42) Ладно )))
ТС лучше всего подходит КопироватьОбъект(), т.к. можно передать параметр для автоматической обработки и, например, после закрыть форму.
Но с помощью ОтправитьОконноеСообщение() можно запускать любые действия изначально активируемые только интерактивно из меню/тулбара.
Но с помощью DynamicWrapperX можно вообще практически всё, в том числе "ин мемори патчинг бай роп гаджетс". )))
44 Djelf
 
16.03.23
17:14
(43) Я просто иногда читаю изменения в formex, и иногда их даже запоминаю ;)
P.S. Не использую DynamicWrapperX, хрен его знает как он поведет себя в моей среде 1С 7.7, а у меня же он под wine!
P.P.S. А вот то что Robert в RWidjets сначала потерял подписки на кнопки формы, потом потерял весь код, а потом и весь потерялся, вот это печально ;(
45 alyuev
 
16.03.23
18:04
(44) Да. Люди они такие (это по поводу Роберта)...
46 Злопчинский
 
16.03.23
19:27
(42) капец. Форекс неисчерпаем как атом
47 Pit0n_08
 
17.03.23
10:45
(46) Да, биржа она такая...)
2 + 2 = 3.9999999999999999999999999999999...