8.х Кнопка на форме к общему модулю обработки.

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Саша82, 13 дек 2007.

  1. TopicStarter Overlay
    Саша82
    Offline

    Саша82 Активный ученик

    Регистрация:
    11 окт 2007
    Сообщения:
    307
    Симпатии:
    0
    Баллы:
    26
    Подскажите, а можно ли как то кнопку на форме обработки прицепить к процедуре находящейся в общем модуле этой обработки?
  2. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Через Выполнить()
  3. TopicStarter Overlay
    Саша82
    Offline

    Саша82 Активный ученик

    Регистрация:
    11 окт 2007
    Сообщения:
    307
    Симпатии:
    0
    Баллы:
    26
    А куда вставить это Выполнить()? Если можно поподробней.
  4. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Значиться... Вызвать можно только функцию модуля формы, не знаю, с чем связано - вроде в доке написано, что вызывать можно хоть глобальную функцию - главное, что бы была видимость (типа Экспорт) - но не работает...

    Лично я извратился следующим образом (применял для выбора печатных форм - ибо реализация через множественный Если ИначеЕсли - отстойно:

    Определил у всех нужны мне кнопок вызов одной и той же функции в модуле формы.
    Код:
    РаботаСДиалогами.УстановитьПодменюВыбораПечатнойФормы(ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ПодменюПечати,
    СоответствиеМакетов,
    Новый Действие("ДействияФормыДействиеВыбратьПечатнуюФормы"));
    
    Создал Соответсвие, где ключ - текст-кнопки, значение - имя вызываемой функции:
    Код:
    Функция ПолучитьСписокПечатныхФорм() Экспорт
    СоответствиеМакетов = Новый Соответствие();
    СоответствиеМакетов.Вставить("Накладная", "ПечатьНакладная");
    СоответствиеМакетов.Вставить("Накладная2", "ПечатьНакладная2");
    Возврат СоответствиеМакетов;
    КонецФункции // ПолучитьСписокПечатныхФорм()
    
    Соответственно, при нажатии кнопки получаю соответсвие по её тексту и делаю Выполнить("Объект." + Соответствие[ТекстКнопки] + "()");

    Механизм примерно такой. Использую для для имитации ООП в 1С :)
    Очень удобно - просто менять код и отслеживать его.
    Например, при создании нового документа - просто копируются функции работы (их всего 4 у меня + общий модуль, который выполняет роль менеджера) и изменяются ТОЛЬКО соответствия.

    Надеюсь, что чем-то поможет.
  5. x_under
    Offline

    x_under Модераторы Команда форума Модератор

    Регистрация:
    25 апр 2007
    Сообщения:
    2.576
    Симпатии:
    13
    Баллы:
    29
    А нельзя так:
    В модуле объекта:
    Код:
    Процедура Некоторая(...) Экспорт
    
    
    А на кнопку:
    Код:
    Процедура КнопкаНажатие(Кнопка)
    Некоторая(...)
    КонецПроцедуры
    
  6. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Собственно, можно и так - просто я описал вариант, как избавится (+ к этому) от множественного свича - который в типовых конфах меня просто убивает :)

    И отличие этого варианта: придется создавать на КАЖДУЮ кнопку обработчик нажатия + обработчик действия.
    В моем варианте - этим занимается некий общий модуль - задача прога - только добавить имя кнопки и имя функции - все остальное система суама сделает. Т.е. убираем кучу ненужны функций, которых будет очень много :) По количеству кнопок
  7. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    На самом деле все можно так сделать:
    В модуле объекта написать экспортную процедуру, а ВСЕМ нужным кнопочкам привесить одно событие (в МодулеФормы) и либо в модуле формы в зависимости от элемента распределять на нужные методы либо внутри экспортной процедуры модуля (если передавать туда элемент) делать что-то с этим.

    Это общий ответ на все затронутые темы :)
  8. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Эмин, получим сумашедший
    Если....
    ИначеЕсли....
    ИначеЕсли....
    КонецЕсли;

    Не вдаваясь в подробности - вот обработка ДЛЯ ВСЕХ КНОПОК - роли не играет, в каком документе/справочнике используется:

    Код:
    // Вызывает вызов обработки печати от кнопки
    //
    // Параметры:
    //  Кнопка                  - Кнопка, инициирующая вызов 
    //  Объект                  - Обрабатываемый объект
    //  Форма                   - Форма вызова
    // Выполняет:
    //  Вызов функции, соответствующей этой кнопки по тексту (см. ПолучитьСписокПечатныхФорм в модуле документа)
    //
    Функция ВыбратьПечатнуюФорму(Кнопка, Объект, Форма) Экспорт 
    Если Объект.ЭтоНовый() Тогда
    Предупреждение("Документ можно распечатать только после его записи", 60);
    Иначе
    Если РаботаСДиалогами.ПроверкаМодифицированности(Объект) Тогда
    Если Кнопка <> Неопределено Тогда   // найти новое значение вида операции
    Форма.ЭлементыФормы.ОсновныеДействияФормы.Кнопки.ДействиеПечать.Текст = Кнопка.Текст;
    РаботаСДиалогами.СохранитьТекущуюКнопкуПечати(Объект.Метаданные().Имя, Кнопка.Текст);
    
    СоответствиеМакетов = Объект.ПолучитьСписокПечатныхФорм();
    ИмяФункции = СоответствиеМакетов[Кнопка.Текст];
    Если ЗначениеЗаполнено(ИмяФункции) Тогда
    Попытка
    Выполнить("Объект." + ИмяФункции + "()");    
    Исключение
    Общий.СообщитьОбОшибке("Не найдена функция обработки либо ошибка выполнения!");                                                            
    КонецПопытки;                     
    КонецЕсли; 
    КонецЕсли;        
    КонецЕсли;
    КонецЕсли;    
    КонецФункции
    
    На этот код поменял стандартные обработки печати - теперь, вместо вставки сравнения просто добавляю строку в соответствие - все. Тюею единственное место в коде, где я меняю текст - это функция:
    Код:
    // Возвращает доступные варианты печати документа
    //  
    Функция ПолучитьСписокПечатныхФорм() Экспорт
    СоответствиеМакетов = Новый Соответствие();
    СоответствиеМакетов.Вставить("Акт производства", "ПечатьАктаПроизводства");
    СоответствиеМакетов.Вставить("Акт производства2", "ПечатьАктаПроизводства2");
    Возврат СоответствиеМакетов;
    КонецФункции // ПолучитьСписокПечатныхФорм()
    
    

    Соответственно, при выборе определенной кнопки (для меню - в данном случае) сработает вызов нужной функции - просто и удобно, и полностью отказ от огромной структуры сравнения.
  9. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    На самом деле все зависит от задачи!
    Иногда огромного выбора Если можно избежать. Печатные формы не единственный пример.
  10. TopicStarter Overlay
    Саша82
    Offline

    Саша82 Активный ученик

    Регистрация:
    11 окт 2007
    Сообщения:
    307
    Симпатии:
    0
    Баллы:
    26
    Ну так значит нельзя вызвать процедуру находящиюся в общем модуле обработки (даже если ей поставить Экспорт) из модуля формы этой обработки(нажатием кнопки)? У меня не получалось. В ваших вариантах процедуры с "Экспорт" где находятся? В модуле формы?
  11. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Гду угодно - хоть в обработке какой-нибудь.
    десь главное - перехватить вызов кнопки/менбю (не важно) и задать свой обработчик через Выполнить()
  12. TopicStarter Overlay
    Саша82
    Offline

    Саша82 Активный ученик

    Регистрация:
    11 окт 2007
    Сообщения:
    307
    Симпатии:
    0
    Баллы:
    26
    А как его перехватить?
  13. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    В отладчике посмотрите что происходит и почему не вызывается метод. Кстати в 8.1 уже лучше указывать не просто имя процедуры экспортной при вызове, а ЭтотОбъект.ИмяПроцедуры()
  14. BabySG
    Offline

    BabySG Администраторы Команда форума Администратор

    Регистрация:
    10 июн 2007
    Сообщения:
    11.853
    Симпатии:
    12
    Баллы:
    29
    Перехватить = назначить обработчик, можно сделать сие через УстановитьДействие() (или что-то в этом духе - навскидку не помню), либо назначить через свойства.

    ЗЫ, Я вот тут что подумал - может задачу полностью огласить: типа, для чего это нужно? А то, судя по вопросам, может быть другое решение :)
  15. TopicStarter Overlay
    Саша82
    Offline

    Саша82 Активный ученик

    Регистрация:
    11 окт 2007
    Сообщения:
    307
    Симпатии:
    0
    Баллы:
    26
    Да не для чего :unsure: Просто учусь. Хачу понять как обратится к процедуре написанной в обработки из конфигурации из других объектов. Как понял для этого надо эту процедуру поместить общий модуть обработки так как если она будет находится в модуле формы то неполучтся этого делать.? Но как понял нельзя и из формы обратится к общиму модулю.?
  16. Эмин
    Offline

    Эмин Руководитель проектов

    Регистрация:
    25 май 2007
    Сообщения:
    1.178
    Симпатии:
    1
    Баллы:
    26
    Можно.
    Смотрите - у вас допустим есть процедура опианная в модуле обработки и у нее стоит ЭКспорт.

    В любом месте системы вы делаете обработчик события или еще - где вам надо вызвать эту процедуру.

    Насчет создать объект не сильно уверен, но вроде бы так процедура зовется. 1Ски нет под рукой.
    Код:
    МояОбработка = Обработки.МояОбработка.СоздатьОбъект();
    МояОбработка.ИмяПроцедуры();
    
    
    Но вообще, если нужно вызывать процедуру из разных мест - я рекомендую ее в общий модуль помещать.

Поделиться этой страницей