Версия для печати темы (https://pro1c.org.ua/index.php?s=8de0f3d53018a0d3005a9595195574ff&showtopic=54576)

Нажмите сюда для просмотра этой темы в обычном формате

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

Автор: Gigi 10.10.19, 10:29

Всем опять привет!
Проблема такая ....
Вот код:

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Объект.Ссылка.Пустая()=Истина Тогда
    Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.ФормаОбщаяКомандаДанныеАвтозаполнения_Назначить.Видимость=Ложь;
    Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.ФормаОбщаяКомандаДанныеАвтозаполнения_Очистить.Видимость=Ложь;
    КонецЕсли;
КонецПроцедуры

Думаю любому на этом сайте ясно, какую цель ставит код данной процедуры. И где он обычно пишется. Да, конечно ... в самой форме.
Что нужно... Одной единственное ...
Прописать тоже самое в глобальном контексте. Т.е. на пример для всех форм объекта по всем документам.
Никто не подскажет как это реализовать?
Как это сделать в 1С? ... ВЕЛИКОМ и МОГУЧЕМ! smile.gif
Буду признателен!

Автор: andr_andrey 10.10.19, 13:51

Gigi @ Сегодня, 11:29 * ,
https://pro1c.org.ua/redirect.php?https://v8.1c.ru/metod/faq2/answer.jsp?id=541

Автор: Макс1С 10.10.19, 13:56

Gigi @ Сегодня, 11:29 * ,
В типовых(унф, ерп) реализовано достаточно неплохо. Общий модуль, в каждой форме вызов одной и той же процедуры.
Например:

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
    
    ПриЧтенииСозданииНаСервере();
    УправлениеСвойствами.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);

    МодификацияКонфигурацииПереопределяемый.ПриЧтенииНаСервере(ЭтаФорма, ТекущийОбъект);

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

А в модуле все процедуры изначально пустые. Хочешь, пили прям в модуле события форм всех доков, хочешь - вынеси в расширение и там пили.
#Область ЗаполнениеОбработчиковФормы

// Переопределяемая процедура, вызываемая из одноименного обработчика события формы.
//
// Параметры:
//     Форма - форма, из обработчика события которой происходит вызов процедуры.
//    см. справочную информацию по событиям управляемой формы.
//
Процедура ПриСозданииНаСервере(Форма, Отказ, СтандартнаяОбработка) Экспорт

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

// Переопределяемая процедура, вызываемая из одноименного обработчика события формы.
//
// Параметры:
//     Форма - форма, из обработчика события которой происходит вызов процедуры.
//    см. справочную информацию по событиям управляемой формы.
//
Процедура ПриЧтенииНаСервере(Форма, ТекущийОбъект) Экспорт
    
КонецПроцедуры

// Переопределяемая процедура, вызываемая из одноименного обработчика события формы.
//
// Параметры:
//     Форма - форма, из обработчика события которой происходит вызов процедуры.
//    см. справочную информацию по событиям управляемой формы.
//
Процедура ПередЗаписьюНаСервере(Форма, Отказ, ТекущийОбъект, ПараметрыЗаписи)Экспорт
    
КонецПроцедуры

// Переопределяемая процедура, вызываемая из одноименного обработчика события формы.
//
// Параметры:
//     Форма - форма, из обработчика события которой происходит вызов процедуры.
//    см. справочную информацию по событиям управляемой формы.
//
Процедура ПослеЗаписиНаСервере(Форма, ТекущийОбъект, ПараметрыЗаписи)Экспорт
    
КонецПроцедуры

#КонецОбласти

Автор: Gigi 10.10.19, 14:28

andr_andrey @ Сегодня, 14:51 * ,

Цитата(andr_andrey @ 10.10.19, 14:51) *
https://pro1c.org.ua/redirect.php?https://v8.1c.ru/metod/faq2/answer.jsp?id=541

Спасибо но как я понял из статьи, имеется ввиду процедура ПриСозданииНаСервере опять только в самой форме. А о глобальном контексте не сказано. Видимо такого события в глобальном контексте просто нет.
А в остальном не важно прописать так:
Если Объект.Ссылка.Пустая()=Истина Тогда

Или как в статье описано так:
Если Параметры.Ключ.Пустая() Тогда

Нужно один раз прописать код для всех форм. Для того что бы не создавать форму и в событии: ПриСозданииНаСервере по каждому доку не писать одно и то же.
Вот для чего все это.

Gigi @ Сегодня, 15:10 * ,
А это конечно же белиберда ... Но порожденная от безысходности.
Процедура ДокПолучениеФормыОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
Если ВидФормы="ФормаОбъекта" Тогда
ОбъектСсылка=Параметры.Ключ;
Если ОбъектСсылка.Пустая() Тогда  
//================================
    // 1) Определить Метаданные по ссылке - Ладно сделали        
    МетаданныеПолноеИмя=Config_МетаДанные.ОбъектМетаданных(ОбъектСсылка,"ПолноеИмяЕд");  // Функция определения метаданных
//================================
    //Дальше 2-ое
    // 2) Получить форму объекта. И это тут НЕВОЗМОЖНО естественно! Так что до третего дело и не может дойти
//Форма=ПолучитьФорму(МетаданныеПолноеИмя+".ФормаОбъекта", Новый Структура("Ключ",ОбъектСсылка));
//================================        
    // 3) Скрыть кнопри общей команды
    //Форма.Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.ФормаОбщаяКомандаДанныеАвтозаполнения_Назначить.Видимость=Ложь;
    //Да уже какая форма? Какие элементы формы что бы скрыть их. Это ведь тут невозможно
КонецЕсли;
КонецЕсли;
КонецПроцедуры

Короче то, что хотел НИКАК.
А нужно просто скрыть кнопки указанных общих команд для всех доков. ДЛЯ ВСЕХ. И прописать это ОДИН РАЗ. А не многократно для каждой формы. Создавая ее и вставляя одни и тот же для всех код
Вот что хотел...
Ладно если невозможно ... нет так нет.
Но вы извините за иронию... просто меня тоже понять можно.

Цитата(Gigi @ 10.10.19, 15:22) *
В типовых(унф, ерп) реализовано достаточно неплохо. Общий модуль, в каждой форме вызов одной и той же процедуры.
Например:

Тьфу ты .. это пока не прочел ... ладно ща прочту и проверю на деле ... если это то что нужно.. спасибо

Автор: andr_andrey 10.10.19, 14:40

Цитата(Gigi @ 10.10.19, 15:28) *
И прописать это ОДИН РАЗ. А не многократно для каждой формы. Создавая ее и вставляя одни и тот же для всех код

Вы многократно даёте советы разработчикам платформы, а сами не осилили процедурное программирование.
Невероятно.

Автор: Gigi 10.10.19, 15:25

Цитата(Gigi @ 10.10.19, 15:28) *
в каждой форме вызов одной и той же процедуры

В том и дело что опять "в каждой форме"... А я хотел что бы без такой необходимости. Точно так же как в случае с подписью на события: "ОбработкаЗаполнения"
И вот что касается этой подписи на событие оно более чем устраивает. Это без спорно очень круто сделано. Просто указал источник и делай что угодно. И более того... есть там еще и параметр: "ДанныеЗаполнения" ... это уже круто ВДВОЙНЕ. И тут тоже делай что хочешь. И самое главное, что все это можно прописать для всех доков ОДИН РАЗ! Это уже втройне круто.
Так что вот к этому никаких нареканий. Все очень просто.
Нужно тоже самое только для элементов формы. Так же что бы один раз прописал для всех.
Но этого думаю просто нет.
Ладно ... если нет так нет.


Цитата(andr_andrey @ 10.10.19, 15:40) *
Вы многократно даёте советы разработчикам платформы, а сами не осилили процедурное программирование.
Невероятно.

Да никого я не учу ... для этого у самого не так уж и большой опыт. Просто выражаю мнение и не более.
Короче не знаю как быть с проблематикой ... Не въезжаю просто ... я просто хотел без необходимости вызова из каждой формы.



Gigi @ Сегодня, 15:56 * ,
А посему .... smile.gif
Принятое решение в следующем: ... только жаль что не в микрофон шас говорю smile.gif Имею ввиду жаль что без рупора smile.gifsmile.gif..
Вот эту процедуру придется вставлять в каждую форму объекта.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Ключ.Пустая().Пустая()=Истина Тогда
    Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.ФормаОбщаяКомандаДанныеАвтозаполнения_Назначить.Видимость=Ложь;
    Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.ФормаОбщаяКомандаДанныеАвтозаполнения_Очистить.Видимость=Ложь;
    КонецЕсли;
КонецПроцедуры

Да именно ... этот один и тот же текст... по всем формам... Ибо эти кнопки будут по всем докам, но при этом они не нужны когда новый объект.
Ладно ... нет так нет ... придется вписывать по каждой.
И ничего страшного. Буду видеть то что стакан на половину полный чем то что пустой. Тем более, что он не наполовину, а почти полный.
И то, что именно так все это благодаря возможностям общих команд и подписи на событие: "ПроверкаЗаполнения".
И что касается последнего. Вот тут на самом деле доволен. И вот тут на само деле очень круто.
Так что буду оптимистом!
Ладно! Всем огромное спасибо за помощь и главное терпение smile.gif
Пока!

Автор: Макс1С 15.10.19, 15:43

Цитата(Gigi @ 10.10.19, 16:25) *
Вот эту процедуру придется вставлять в каждую форму объекта.

Предлагаю всё же вставить в каждую форму
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
       ДопОбщийМодуль.ПриСозданииНаСервере(Элементы,Параметры,Отказ, СтандартнаяОбработка);
КонецПроцедуры

а в общий модуль:
Процедура ПриСозданииНаСервере(Элементы,Параметры,Отказ, СтандартнаяОбработка)
    Если Параметры.Ключ.Пустая().Пустая()=Истина Тогда
    Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.ФормаОбщаяКомандаДанныеАвтозаполнения_Назначить.Видимость=Ложь;
    Элементы.ФормаКоманднаяПанель.ПодчиненныеЭлементы.ФормаОбщаяКомандаДанныеАвтозаполнения_Очистить.Видимость=Ложь;
    КонецЕсли;
КонецПроцедуры

В противном случае при необходимости правки, нужно не забыть прошерстить каждую форму.

Автор: Gigi 15.10.19, 20:40

Цитата(Макс1С @ 15.10.19, 16:43) *
В противном случае при необходимости правки, нужно не забыть прошерстить каждую форму.

Спасибо ... побольше бы таких дельных советов.
А то и вправду, все кодишь... кодишь... аж глаза уже в квадрате smile.gif
И иногда морально так устаешь, что весьма не маловажные мелочи упускаешь из виду..
Спасибо!

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua