8.х Программное создание кнопки для всех документов в формах объекта

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем GiGi, 7 окт 2019.

  1. TopicStarter Overlay
    GiGi
    Offline

    GiGi

    Регистрация:
    7 мар 2017
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    1
    Всем опять привет!
    Вот пример кода:
    Код:
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    НоваяКоманда = ЭтаФорма.Команды.Добавить("ДанныеАвтозаполнения_Сохранить");
    НоваяКоманда.Действие = "ДанныеАвтозаполнения_Сохранить";
    НоваяКоманда.Заголовок = "Назначить реквизиты автозаполнения";
    НоваяКоманда.Подсказка = "Назначить реквизиты автозаполнения по указанным значениям формы";
    НоваяКоманда.Картинка = БиблиотекаКартинок.СоздатьНачальныйОбраз;
    //НоваяКоманда.Отображение = КартинкаИТекст; // Тут пожалуйста ... не получается  с отображением ... если не трудно сменить строчку
    КнопкаФормы  = Элементы.Добавить("КомандаДанныеАвтозаполнения_Сохранить", Тип("КнопкаФормы"),КоманднаяПанель);
    КнопкаФормы .ИмяКоманды = "ДанныеАвтозаполнения_Сохранить";   
    //КнопкаФормы .Вид = ВидКнопкиФормы.КнопкаКоманднойПанели;
    КонецПроцедуры
    Думаю тут все понимают назначение примера данного кода. Но вопрос в чем:
    Как сделать то что делает код, для любой ФормыОбъекта... ЛЮБОЙ! На пример по любому объекту документа.
    Как известно есть подпись на событие: "ОбработкаПолученияФормы".
    И поэтому вот процедура по стандарту:
    Код:
    Процедура ДокументПолученияФормыОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
    Если ВидФормы="ФормаОбъекта" Тогда
    // И как тут ... или это не подходит и так не получиться для указанной цели..
    //НоваяКоманда = Источник.Команды.Добавить("ДанныеАвтозаполнения_Сохранить");       
    КонецЕсли;
    КонецПроцедуры
    Короче хотел по быстрому получить ответ возможно ли это. Или великий и могучий 1С опять не позволяет сделать разумнее.
    Если да то как?
    Буду признателен!
  2. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.137
    Симпатии:
    215
    Баллы:
    104
    Нет, ОбработкаПолученияФормы предназначена главным образом для переопределения открываемой формы (например, если при каком-то условии хотите открыть одну форму вместо другой).
    То, что Вы хотите, - прописать код один раз для всех форм - не получится. Код по добавлению реквизитов на форму требует контекста самой формы. Можно, конечно, разместить эту процедуру в одном месте в общем модуле, но вызывать ее все равно придется из каждой формы, в которую надо добавить кнопку.

    Альтернативным вариантом является создание общей команды. В свойствах команды указываете тип параметра команды - ссылки на все необходимые документы. Тогда эта команда появится во всех формах в одной из командных панелей (которую укажете).
    GiGi нравится это.
  3. xaysnet
    Offline

    xaysnet Опытный в 1С

    Регистрация:
    3 июн 2019
    Сообщения:
    113
    Симпатии:
    3
    Баллы:
    29
    Добавлю к выше сказанному, можно сделать обработку (одноразовую) которая будет добавит всем форма эту кнопку.
    И замечу, не в Лазарусе, не в делфи, не в Визуал студион такого сделать нельзя... Что имелось виду под разумным..
  4. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.795
    Симпатии:
    1.022
    Баллы:
    204
    Это как?
  5. xaysnet
    Offline

    xaysnet Опытный в 1С

    Регистрация:
    3 июн 2019
    Сообщения:
    113
    Симпатии:
    3
    Баллы:
    29
    Через обработку =/ + кусочек магии матов, и не понятно по какому принципу это работает. Не всем добавилось, но большенство получили свою кнопку. Логика 1с не постижима....
  6. xaysnet
    Offline

    xaysnet Опытный в 1С

    Регистрация:
    3 июн 2019
    Сообщения:
    113
    Симпатии:
    3
    Баллы:
    29
    А и еще, это сделано было в расширении.
  7. TopicStarter Overlay
    GiGi
    Offline

    GiGi

    Регистрация:
    7 мар 2017
    Сообщения:
    24
    Симпатии:
    0
    Баллы:
    1
    Спасибо за ответ. И Вам и всем остальным....
    Проблему решил так....
    Код:
    //Команда общего модуля со свойством: "Командная панель формы.Важное"
    &НаКлиенте
    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    МетаданныеПолноеИмя=Config_МетаДанные.ОбъектМетаданных(ПараметрКоманды,"ПолноеИмяЕд");//Функция опреденения метаданных по ссылке.
    Форма=ПолучитьФорму(МетаданныеПолноеИмя+".ФормаОбъекта", Новый Структура("Ключ",ПараметрКоманды));// Туи все ясно ... объяснять не надо... потому что встроенная функция.
    Config_PrideSettingsFill_кл.НазначитьАвтозаполнение(Форма.Объект);//И наконец вызов процедуры по контексту данных самого объекта.
    КонецПроцедуры
    
    Единственное при этом проблема что происходит когда на кнопку нажимаешь не на форме уже сохраненного объекта, а на форме нового.
    Добавил вот эту строку в начале команды:
    Код:
    Если ПараметрКоманды.Пустая() Тогда Отказ=Истина; Возврат; КонецЕсли;
    Все равно выходит вопрос сохранять или нет...
    И не могу понять как вообще устранить этот диалог вопроса?
    Буду признателен!
    Последнее редактирование: 8 окт 2019
  8. 1cUserAndrew
    Offline

    1cUserAndrew Профессионал в 1С Команда форума

    Регистрация:
    27 май 2010
    Сообщения:
    5.137
    Симпатии:
    215
    Баллы:
    104
    Никак.
    Это проверяется на уровне платформы. Вопрос задается еще до того, как дело доходит до модуля Вашей команды.
    Такие глобальные команды обязательно требуют ссылку на объект в качестве параметра команды (ну, или массив ссылок).
    В любом случае, перед использованием такой команды объект должен быть записан.
    GiGi нравится это.