Имя: Пароль:
1C
1C 7.7
v7: Программно вывести на форму кнопку с привязкой обработчика можно?
,
0 Chai Nic
 
22.08.23
17:04
Используя formex и т.п. внешние компоненты, хочется, чтобы в каждом документе (без ручного прописывания) появилась некая кнопка, которая бы открывала скажем общий журнал документов, с позиционированием на текущем. Идеально было бы разместить эту кнопку в панели инструментов формы.
Это возможно сделать?
1 Chai Nic
 
22.08.23
19:42
Нашел способ. Можно вызвать нижеуказанную процедуру в ПослеОткрытия(Конт), убедившись что находимся в контексте формы документа. Не идеально (после изменения размера формы кнопка не переползает), но работает.

Процедура ДобавитьКнопкуПереходаВЖурнал(Конт)
       Расш=СоздатьОбъект("РасширениеФормы");
       Расш.УстановитьФорму(Конт.Форма);
       
    Кнопка=Расш.ДобавитьАтрибут("КнопкаПерейтиКЖурналу",3);
    Кнопка.Формула="ОткрытьФорму(""Журнал.Общий"",ТекущийДокумент());";
    Кнопка.Заголовок="Ж";
    Кнопка.Подсказка="Перейти в  журнал";
    Кнопка.УстановитьКоординаты(Расш.Ширина-20,1,20,20);
КонецПроцедуры
2 Злопчинский
 
22.08.23
23:22
Поздравляю!
3 Duke1C
 
23.08.23
12:42
(0) Конфигурация не типовая чтоль?
4 Duke1C
 
23.08.23
12:44
А то в типовых в каждом документе есть кнопка "Действия", а там "Перейти в журнал"
5 Chai Nic
 
23.08.23
12:55
(3) Да, нетиповая.
6 Злопчинский
 
23.08.23
12:59
А смысл?
в этом самопальном велосипеде что - вмдов документов несколько сотен?
проще сваять кнопку с формулой к глобальной процедуре и полвесить жестко на форму. Потом тупо копипастом размножить на остальные документы.
чем не подходит?
7 Chai Nic
 
23.08.23
13:06
(6) А лень. Глобально проще)
8 Chai Nic
 
23.08.23
13:06
+(7) Сотен не сотен, но до полусотни наберется
9 Злопчинский
 
23.08.23
17:12
(8) один хрен код в каждый вставлять придётся тем или иным образом.
10 Злопчинский
 
23.08.23
17:13
Чисто интересно что за самопи, ка, в какой области использования?
11 Chai Nic
 
23.08.23
17:17
(9) Неа. В том то и суть, что достаточно глобального модуля. И в каждой форме появится кнопка.
12 Chai Nic
 
23.08.23
17:18
(10) Бухгалтерия и производство, с конца 90-х дорабатывается и переписывается
13 Злопчинский
 
23.08.23
17:32
(11) а Конт откуда возьмёшь? Как он в процедуру передаваться будет?
14 Chai Nic
 
23.08.23
17:56
(13) Это магия. Возникает после подключения внешней компоненты formex.
15 Djelf
 
23.08.23
20:30
Я хотел как-то такое впилить в почти типовую и убрать все кнопки, и делать их программно, но что-то меня остонавило...
Видимо лень или жаба...
Скорее первое, чем второе.
16 Злопчинский
 
23.08.23
21:19
(14) сомневаюсь, растолкуй
17 Злопчинский
 
23.08.23
21:37
Тем более что фигурирует ПослеОткрытия()
А такой глобальное пред определённой у формекса вроде нет...
18 Chai Nic
 
24.08.23
06:23
(17) Цитата из документации формекса
--
Порядок вызова
Первоначально предопределенная процедура ищется в модуле активной формы.

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

Вызов дополнительных предопределенных процедур сквозной. Т.е. не останавливается после первой найденной процедуры, а идет дальше, через локальный контекст, основной глобальный модуль и все дополнительный глобальные модули.
19 Bigbro
 
24.08.23
06:38
мне когда требовалось в ПриОткрытии в каждый объект конфы дописать вызов своей процедуры - разобрал через gcomp в тексты прописал вызов батником и собрал обратно.
или в ПриЗаписи уже не помню
20 Злопчинский
 
24.08.23
08:09
(18) ты ж смотри, действительно!
.
вот это не понял
"Вызов дополнительных предопределенных процедур сквозной. Т.е. не останавливается после первой найденной процедуры, а идет дальше, через локальный контекст, основной глобальный модуль и все дополнительный глобальные модули."
21 Злопчинский
 
24.08.23
08:10
(19) у Альфа для этого вроде как раз был сделан Inserter
22 Chai Nic
 
24.08.23
08:11
Я вообще хотел в "ПослеОбновленияФормы" вписать, чтобы кнопка всегда была в правом верхнем углу даже при изменении размеров окна,  но там при попытке изменения размеров и положения кнопки наглухо вылетает 1с. Очевидно, изменение элемента формы вызывает событие обновления, и происходит внутреннее зацикливание.
23 АгентБезопасной Нацио
 
24.08.23
08:23
Такое замечательно делается через Перехватчик. С анализом прав пользователя (т.е. кнопки только у тех документов, в которых пользователям разрешены действия, с учетом даты запрета, персональных разрешений) и всё такое
24 Chai Nic
 
24.08.23
19:34
(23) Перехватчик тут не нужен, и без него всё перехватывается.
25 Злопчинский
 
24.08.23
22:08
(24) Перехватывается что?
(22) изменил размеры окна, через ОО (например, или как-то иначе) считал новые координаты, переместил кнопку...
26 Chai Nic
 
24.08.23
22:22
(25)
"Перехватывается что?"
ПослеОткрытия срабатывает в глобальном модуле с автоматической передачей контекста.

"изменил размеры окна, через ОО (например, или как-то иначе) считал новые координаты, переместил кнопку."
Можно пример? Каким событием ловится изменение размера окна? Я пробовал через ПослеОбновленияФормы, но 1с вылетает при попытке изменить положение кнопки в этом обработчике.
27 Злопчинский
 
24.08.23
23:06
(26) для начала тупо
в ПослеОбновленияФормы запустить ОО с коротким таймингом (50-100-200 подобрать, 50 обычно хватает) и уже в ОО, когда обновление формы отработало - отрисовать кнопку на новом месте. Ну и держать флажок 1/0 чтобы в цикл обновления не уйти...
.
событие размера окна - ну так же ж формексовская же ж
Процедура ПриИзмененииРазмераОкна(<Контекст>,<ТипСобытия>,<Ширина>,<Высота>)
.
?
28 victuan1
 
25.08.23
04:16
(27) Возможно, не все поняли что такое ООО (обработка ожидания).
29 DJ Anthon
 
25.08.23
05:38
я делал контекстное меню для правой кнопки мыши, где можно было прямо из формы записать, провести, пометить на удаление, перейти в список, получить инфу об объекте, и т. д.
30 Chai Nic
 
25.08.23
06:30
(29) Хорошая идея, надо будет так тоже сделать. Только придется для сохранения стандартного поведения перебирать атрибуты формы с проверкой, не попал ли курсор мыши на то, где ПКМ должна отрабатывать штатно.
31 DJ Anthon
 
25.08.23
07:58
а где в v7 она отрабатывает штатно? могу скинуть код, мне он уже не нужон
32 Chai Nic
 
25.08.23
08:02
(31) Ну например на полях ввода появляется контекстное меню с копировать-вставить. Или на табличных частях, где то же, плюс возможность двигать строки. Это штатное поведение ПКМ, которое надо сохранить.

"могу скинуть код"
Да, было бы неплохо
33 vladmenleo
 
25.08.23
08:07
(32) Делал контекстное меню с табличным полем, там вообще хорошо есть событие Держи код может пригодится
Процедура КнопкаТабПолеПриКонтекстномМеню(ТП,ТипРегиона, Кол,Стр)
    Если ТипРегиона <> 3 Тогда
        Возврат;
    КонецЕсли;
    Попытка
        лДок = ТП.ТекущиеДанные.Док;
    Исключение
        лДок = ПолучитьПустоеЗначение("Документ");
    КонецПопытки;
    
    Если ПустоеЗначение(лДок) = 1 Тогда
        Возврат;
    КонецЕсли;
    Док=СоздатьОбъект("Документ");
    Док.НайтиДокумент(лДок);
    СП = СоздатьОбъект("СписокЗначений");
    СП.ДобавитьЗначение(1,"[icon:1]Новый" + СимволТабуляции + СимволТабуляции + СимволТабуляции + "Insert");
    СП.ДобавитьЗначение(12, "[icon:2]Открыть" + СимволТабуляции + СимволТабуляции + СимволТабуляции + "Shift+Enter");
    Если лДок.Проведен() = 1 Тогда
        СП.ДобавитьЗначение(10, "[icon:22]Открыть операцию");
    КонецЕсли;
    СП.ДобавитьЗначение(4,"[icon:21]Просмотр");
    СП.ДобавитьЗначение(8,"[icon:3]Копировать" + СимволТабуляции + СимволТабуляции + "F9");
    СП.ДобавитьЗначение(3, "[icon:4]" + ?(лДок.ПометкаУдаления() = 1,"Снять пометку удаления", "Пометить на удаление") + СимволТабуляции + "Del");
    СП.ДобавитьЗначение(9,"[icon:9]Ввести на основании" + СимволТабуляции + "Alt + F9");
    СП.ДобавитьЗначение("-");
    Если лДок.Проведен() = 1 Тогда
        СП.ДобавитьЗначение(2,"Сделать не проведенным");
        СП.ДобавитьЗначение(7,"[icon:19]Движения документа");
    КонецЕсли;
    СП.ДобавитьЗначение(5,"[icon:20]Подчиненные документы");
    СП.ДобавитьЗначение(6,"[icon:16]Дерево документов");
    зн = 1;
    глСервис = СоздатьОбъект("Сервис");
    Если глСервис.ВыбратьЗначение(СП,зн, "Выберите действие с докуменом        ", 0, 2, КартинкаМеню) <> 1 Тогда
        Возврат;
    КонецЕсли;
    Если зн = 1 Тогда
        НовыйДок();
    ИначеЕсли зн = 8 Тогда
        // новый копирование
        НовыйКопированием();
    ИначеЕсли зн = 9 Тогда // ввести на основании
        НовыйДок(1);
    ИначеЕсли зн = 2 Тогда
        ОтменитьПроведениеДок();
        
    ИначеЕсли зн = 3 Тогда
        УдалитьДок();
    ИначеЕсли зн = 4 Тогда // Просмотр
        ОткрытьФорму(Док.ТекущийДокумент(),,1);
    ИначеЕсли зн = 12 Тогда // Открыть
        ОткрытьФорму(Док.ТекущийДокумент());
    ИначеЕсли зн = 10 Тогда // Открыть операцию
        Конт = "";
        ОткрытьФорму("Операция", Конт, Док.ТекущийДокумент());
    ИначеЕсли зн = 5 Тогда
        ОткрытьФорму("Журнал.Подчиненные.ФормаСписка",,Док.ТекущийДокумент());
    ИначеЕсли зн = 6 Тогда
        глСформироватьДеревоДокументов(Док.ТекущийДокумент());
    ИначеЕсли зн = 7 Тогда
        глСервис.ОткрытьДвиженияОбъекта(Док.ТекущийДокумент());
    КонецЕсли;
КонецПроцедуры // КнопкаТабПолеПриКонтекстномМеню()

Процедура ПриНажатииКнопкиКлавиатуры(КодКлавиши, Alt, Shift, Ctrl, Символ, ФСО)
    Если КодКлавиши = 27 Тогда
        ФСО = 0;
    ИначеЕсли (КодКлавиши = 13) и (Shift = 1) и (Alt = 0) и (Ctrl = 0) Тогда // Открыть Shift+Enter
        ФСО = 0;
        РедактироватьДок();
    ИначеЕсли (КодКлавиши = 45) и (Shift = 0) и (Alt = 0) и (Ctrl = 0) Тогда // Новый Insert
        ФСО = 0;
        НовыйДок();
    ИначеЕсли (КодКлавиши = 46) и (Shift = 0) и (Alt = 0) и (Ctrl = 0) Тогда // Del
        ФСО = 0;
        УдалитьДок();
    ИначеЕсли (КодКлавиши = 120) и (Shift = 0) и (Alt = 0) и (Ctrl = 0) Тогда // F9
        ФСО = 0;
        НовыйКопированием();
    ИначеЕсли (КодКлавиши = 120) и (Shift = 0) и (Alt = 1) и (Ctrl = 0) Тогда // на основании Alt + F9
        ФСО = 0;
        НовыйДок(1);
    КонецЕсли;
КонецПроцедуры
34 DJ Anthon
 
25.08.23
08:12
(32) не, я сделал на свободном месте формы чтобы щелкать. между полями, например ) кажется, через формекс это было. самое интересное в том, что открытый документ блокируется и его нельзя сдвинуть по времени или пометить на удаление прямо из формы, но я нашел способ. если его развернуть во весь экран (а потом обратно), но на микросекунду он разблокируется. в этот момент и происходит выполнение контекстно зависимого кода. костыль, но я другого способа не нашёл, как не меняя форму что-то сделать с документом.
35 DJ Anthon
 
25.08.23
08:13
скину, как комп распакую, я только переехал )
36 Djelf
 
25.08.23
08:50
(1) Кнопку надо создавать в ПослеСозданияФормы(Конт), т.е. до момента автопривязок формы, а она присходить где-то в момент между ПослеСозданияФормы и ПослеОткрытия.
37 Arbuz
 
25.08.23
17:38
(34) Не в первый раз слышу уже такое ("если его развернуть во весь экран (а потом обратно), но на микросекунду он разблокируется"), вот бы увидеть подтверждение. Что-то верится с трудом.
38 Злопчинский
 
25.08.23
18:42
(34)  "в этот момент"- в какой? как отловить этот момент? и запустить в нем код?
39 DJ Anthon
 
28.08.23
21:33
md, doc, dll, exe, ert:
https://files.fm/u/327b94wep
или тестовая база, если так удобнее
https://files.fm/u/hc6wm2dyj
(37) можете проверить сами. правда, парочку действий я выполняю, закрыв просто форму и открыв снова, тут я чутка приврал по памяти,
но, например, заполнение или очистка табличной части работает именно через описанный выше механизм.
(38) в комментах всё описано (в глобальном модуле), но учтите, что это было 13 лет назад, с чувством юмора у меня тогда было плохо ;)
40 DJ Anthon
 
28.08.23
21:39
41 Злопчинский
 
29.08.23
01:01
я тут наткнулся на то, что в открытой форме элемента справочника - просто так поменять родителя - фиг вам... Говорит "Объект не может быть перепозиционирован"
.
воспроизвести: на форму элемент аспр положить кнопку с действием Родитель = "";
42 DJ Anthon
 
29.08.23
05:31
(41) а через закрытие-открытие формы?
43 Злопчинский
 
29.08.23
11:20
Это как?
44 DJ Anthon
 
29.08.23
11:47
(43) сохранить значения, закрыть форму, поменять родителя в справочнике, открыть форму, загрузить значения. ну вон как я сделал )
45 Djelf
 
29.08.23
12:09
(41) Ты хотел чего то иного, кроме того что написано в СП?

Родитель
Синтаксис:
Родитель
Назначение:
Доступ к значению родительской группы выбранного элемента справочника.
Атрибут  может быть изменен только для объектов, созданных функцией СоздатьОбъект.
Подробнее см. в документации, глава 'Работа со Справочниками'
46 Злопчинский
 
29.08.23
13:04
(44) э, это неспортивно! такой хоккей нам не нужен! ;-)
(45) вот оно что...
(44) можно и по другому, вывернуться можно различными способами
47 АгентБезопасной Нацио
 
29.08.23
14:58
(46) Пиши прямым запросом :-)
48 Arbuz
 
29.08.23
17:22
(39) Ну, как я и говорил - никакой эксклюзивной магии "микросекундного разблокирования", всё делается "закрыв просто форму и открыв снова" ;р
49 Djelf
 
29.08.23
17:46
(48) Просто не пишите в него так (с)1С ;)
50 Злопчинский
 
29.08.23
22:32
(48) сильно много гемора. надо сохранять состояние контекста формы в части измененных реквизитов...
51 Злопчинский
 
29.08.23
22:33
при этом надо понять - какие реквизиты формы есть реквизиты справочника, а какие - просто реквизиты формы...
52 АгентБезопасной Нацио
 
30.08.23
08:35
(51) Это ж просто - если Идентификатор Реквизита совпадает с идентификатором реквизита объекта - то это Реквизит справочника.
Основная теорема систематики: Новые системы плодят новые проблемы.