Имя: Пароль:
1C
1C 7.7
v7: Перенести процедуру в глобальный модуль.
0 JuixyJes
 
28.10.19
14:40
Добрый день, имеется процедура в модуле формы документа, выводящая печатную форму. Имеются еще два подобных документа, для которых нужна такая же процедура. Она завязана на табличной чатси документа, но загвоздка в том, что во всех документах она называется по разному и изменять это нельзя. Потому спрошу, как перенести процедуру в Глобальный Модуль и использовать ее для 3 документов? Код процедуры прилагаю:


Процедура Направления()
    Таб=СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Направления");
    
    ФактВ="";
    НомерСтр=1;
    Ит=0;
    Сумма=0;
    
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("Услуга","строка",150);
    ТЗ.НоваяКолонка("СпрДолжн","Справочник.Должности",50);
    ТЗ.НоваяКолонка("СпрУсл","Справочник.Номенклатура",50);
    ТЗ.НоваяКолонка("Отдел","Справочник.ГруппировкаБегунка");
    ВыбратьСтроки();
    
    Пока ПолучитьСтроку()=1 Цикл
        Если (ФакторВредности.Код = "10893") или (ФакторВредности.Код = "10894") или (ФакторВредности.Код = "9209") Тогда
        Иначе    
            СпцВр=СоздатьОбъект("Справочник.СпискиСпецВрачей");
            СпцВр.ИспользоватьВладельца(ФакторВредности);
            СпцВр.ВыбратьЭлементы();
            Пока СпцВр.ПолучитьЭлемент()=1 Цикл
                ТЗ.НоваяСтрока();
                ТЗ.Услуга=СпцВр.Должность.Наименование;
                ТЗ.СпрДолжн=СпцВр.Должность;
                
                Должн=СоздатьОбъект("Справочник.Должности");
                Должн.ИспользоватьДату(ДатаДок);
                Если Должн.НайтиЭлемент(СпцВр.Должность) = 1 тогда
                    ТЗ.СпрУсл=Должн.Услуга;
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
        
        
        СпУсл=СоздатьОбъект("Справочник.СпискиУслуг");
        СпУсл.ИспользоватьВладельца(ФакторВредности);
        СпУсл.ВыбратьЭлементы();
        Пока СпУсл.ПолучитьЭлемент()=1 Цикл
            Если СпУсл.Услуга.ВключатьВБегунок = 1 Тогда
                ТЗ.НоваяСтрока();
                ТЗ.Услуга=СпУсл.Услуга.Наименование;
                ТЗ.СпрДолжн="";
                ТЗ.СпрУсл=СпУсл.Услуга;
                //ТЗ.Отдел = СпУсл.Услуга.ОтделыПодразделений.Получить(ДатаДок);
                ТЗ.Отдел = СпУсл.Услуга.ГруппировкаБегунка;
            КонецЕсли;
        КонецЦикла;
        ФактВ=ФактВ+" / "+ФакторВредности;
    КонецЦикла;
    
    //ТЗ.ВыбратьСтроку();
    //Таб.ВывестиСекцию("Шапка");
    
    Если ТЗ.КоличествоСтрок() = 0 Тогда
        Сообщить("отсутствует Номенклатура для бегунка");
        Возврат;
    КонецЕсли;
    
    ТЗ.Свернуть("СпрДолжн,СпрУсл, Отдел","Услуга");
    ТЗ.Сортировать("Отдел");
    //ТЗ.ВыбратьСтроку();
    
    ТЗ.ВыбратьСтроки();
    ТЗ.ПолучитьСтрокуПоНомеру(1);
    ТекОтдел = ТЗ.Отдел;
    УслугаСтр = ""+ Симв(13) + Симв(10) + Строка(ТЗ.СпрУсл.Код) + " " + Строка(ТЗ.СпрУсл.Наименование) + " " + Симв(13) + Симв(10) + Симв(13) + Симв(10);
    //сообщить(УслугаСтр);
    
    КолБегНаСтр = 0;
    Должн=СоздатьОбъект("Справочник.Должности");
    Должн.ИспользоватьДату(ДатаДок);
    Ном=СоздатьОбъект("Справочник.Номенклатура");
    Ном.ИспользоватьДату(ДатаДок);
    
    Пока ТЗ.ПолучитьСтроку()=1 Цикл //услуга
        Если ТекОтдел <> ТЗ.Отдел Тогда
            ТекОтдел = ТЗ.Отдел;
            Таб.ВывестиСекцию("Строка");
            КолБегНаСтр = КолБегНаСтр + 1;
            
            
            Если КолБегНаСтр%(Константа.ПозицийВБегунке+1) = 0 Тогда
                Таб.НоваяСтраница();
            КонецЕсли;
            
            НомерСтр=НомерСтр+1;
            УслугаСтр = Строка(тз.СпрУсл.Код) + " " + Строка(тз.СпрУсл.Наименование) + " " + Симв(13) + Симв(10) + Симв(13) + Симв(10);
        Иначе
            УслугаСтр = УслугаСтр + Строка(тз.СпрУсл.Код) + " " + Строка(тз.СпрУсл.Наименование) + " " + Симв(13) + Симв(10) + Симв(13) + Симв(10);
            //Сообщить(УслугаСтр);
        КонецЕсли;
        
    КонецЦикла;
    Таб.ВывестиСекцию("Строка");
    //Таб.ВывестиСекцию("Подвал");

    Таб.ТолькоПросмотр(1);
    Таб.Опции(0,0,0,0,,);
    Таб.ПараметрыСтраницы(2,,,5,5,5,5,,,1,,);
    Таб.Показать("Реестр факторов риска",);
    
    
КонецПроцедуры //Направления
1 Prog111
 
28.10.19
14:49
(0) Ну в зависимости от вида документа сделай выбор условия и названия в этой процедуре.
2 JuixyJes
 
28.10.19
15:04
(1) подскажите как мне сделать это, я 7ку не трогала давно очень,а с глобальным модулем и вовсе не связывалась
3 Злопчинский
 
28.10.19
15:08
поток 77 какой-то.
стучись в скайп Zlopun  сейчас прямо
4 Злопчинский
 
28.10.19
15:09
(2) Борман сел в машину к Штрилицу и сказал "Трогайте"!
Штирлиц не смутился и потрогал
5 Злопчинский
 
28.10.19
15:12
" что во всех документах она называется по разному и изменять это нельзя"
кто она? в разных документах по разному называется процедура печати?
если в докуиментах в модулях ВООБЩЕ ничего изменять нельзя и процедуры печати сделаны "криво" - то в ГМ не удастся перенести.
потому что в ГМ не будет виден контекст документа, если он не передается...
6 Злопчинский
 
28.10.19
15:17
удяляешь процедуру из модуля формы документа
перемещаешь ее в ГМ. называешь

Процедура УниверсальнаяПечать(ПараметрДокумент) Экспорт
//тут твой код печати
КонецПроцедуры

Делаешь процедуры типа

Процедура МояПроцедураПечатиИзДокументА(ПараметрДокумент) Экспорт
   УниверсальнаяПечать(ПараметрДокумент);
КонецПроцедуры

Процедура МояПроцедураПечатиИзДокументБ(ПараметрДокумент)
   УниверсальнаяПечать(ПараметрДокумент);
КонецПроцедуры
7 Злопчинский
 
28.10.19
15:20
только нафига делать как в (0) - если
можно тупо в модуле формы документа или сразу вызвать УниверсальнаяПечать()

или в локальной процедуре печати сразу написать

Процедура МояПроцедураПечатиИзДокумент(ПараметрДокумент)
   УниверсальнаяПечать(ПараметрДокумент);
   Возврат;
   //тут оставить весь старый код археологам на память
КонецПроцедуры
8 JuixyJes
 
28.10.19
15:44
(7) Мне вот эту процедуру, которая в (0) нужно в ГМ пихнуть, а в документе ее вызвать, правильно?
9 Злопчинский
 
28.10.19
15:47
(8) у тя постановка задачи описана так мутоно что можно только длгадываться что можно делать а что нельзя. отсюда - разные варианты решения. описаны выше.
есть вопросы - звони на скайп. контакт дал.
10 MWWRuza
 
гуру
28.10.19
19:26
Я вообще не понимаю смысла переноса в ГМ процедур из трех!!! документов, если они все три разные... Такой перенос имеет смысл тогда, когда код в нескольких местах программы написан один и тот-же, тогда проще его убрать из этих мест, перенести в ГМ, а в тех местах, где он раньше был, вызывать его. Это, к тому-же, упрощает дальнейшее сопровождение - достаточно в ГМ поменять что-то, и во всех местах, откуда это вызывается, все будет автоматом "по новой" работать. Но, если во всех(трех, в данном случае) местах код разный - то в чем смысл этого действа? Лучше привести код к одному стандарту, и перенести в ГМ, чем в самой процедуре ГМ изобретать что-то, что должно "разбираться", откуда эта процедура/функция вызвана, или если это сложно или лень, то оставить как есть... Печатная форма, хотя-бы, надеюсь, в общих таблицах?
2 + 2 = 3.9999999999999999999999999999999...