Имя: Пароль:
1C
1C 7.7
v7: Как понять, что пользователь закрыл таблицу, сформированную отчетом?
0 Double_Medved
 
26.06.14
08:14
Добрый день! Сделал что-то вроде отчета в режиме онлайн, чтобы данные сами обновлялись, ввел нехитрую строку Форма.ОбработкаОжидания("Сформировать",3)
Работает, только теперь не могу остановить эту ужасную машину. То есть при закрытии самой таблицы через 3 или менее секунд открывается новая, и это продолжается пока не будет закрыта сама форма. Собственно вопрос: как можно отловить то, что пользователь закрыл таблицу? Пробовал
Если ПустоеЗначение(Таб)=1 , но не помогает, таблица насколько я понимаю при закрытии не рушится, просто не показывается.
1 Мимохожий Однако
 
26.06.14
08:19
Код секретный?
2 Double_Medved
 
26.06.14
08:23
Просто не хотел нагружать форумчан полотном
Процедура Запустить()  
    Форма.ОбработкаОжидания("Сформировать",3);        
КонецПроцедуры
Процедура Сформировать()  
Если ПустоеЗначение(Таб)=0 Тогда
    СтандартнаяОбработка = 0;  
    СправочникМонтажи = СоздатьОбъект("Справочник.Монтажи");
    ДатаНач = НачМесяца(МесяцВедомости);
    ДатаТек = НачМесяца(МесяцВедомости);
    ДатаКон = КонМесяца(МесяцВедомости);  
    Если ПустоеЗначение(Таб)=1 Тогда  //Обновление таблицы, очищаем и заполняем снова
        Таб = СоздатьОбъект("Таблица");
        Иначе Таб.Очистить();
    КонецЕсли;//ПустоеЗначение(Таб)=1
    R=1;
    C=1;
    Пока ДатаТек <= ДатаКон Цикл
        Таб.ВывестиСекцию("Строка");
        ОблОкрашивания = Таб.Область("R"+Строка(C)+"C"+Строка(R)+":"+"R"+Строка(C)+"C"+Строка(R));
        ДеньНедели = НомерДняНедели(ДатаТек);
        СправочникМонтажи = СоздатьОбъект("Справочник.Монтажи");  //тут будем искать и перебирать элементы справочника монтажи
        СправочникМонтажи.ВыбратьЭлементыПоРеквизиту("ДатаМонтажа",ДатаТек,0,0);
        ПерваяПоловинаДня = 0;  
        Пока СправочникМонтажи.ПолучитьЭлемент() = 1 Цикл  
            Если ((СправочникМонтажи.ПоловинаДня = 1) и (СправочникМонтажи.Отменен = 0) и (ПустоеЗначение(СправочникМонтажи.Заявка)=0)) или ((СправочникМонтажи.ПоловинаДня = 1) и (СправочникМонтажи.Отменен = 0) и (ПустоеЗначение(СправочникМонтажи.Заявка)=1) и (ПустоеЗначение(СправочникМонтажи.Контрагент)=0)) Тогда
                ПерваяПоловинаДня = 1;    
            КонецЕсли;    
        КонецЦикла;  
        СправочникМонтажи.ВыбратьЭлементыПоРеквизиту("ДатаМонтажа",ДатаТек,0,0);
        ВтораяПоловинаДня = 0;  
        Пока СправочникМонтажи.ПолучитьЭлемент() = 1 Цикл  
            Если ((СправочникМонтажи.ПоловинаДня = 2) и (СправочникМонтажи.Отменен = 0) и (ПустоеЗначение(СправочникМонтажи.Заявка)=0)) или ((СправочникМонтажи.ПоловинаДня = 2) и (СправочникМонтажи.Отменен = 0) и (ПустоеЗначение(СправочникМонтажи.Заявка)=1) и (ПустоеЗначение(СправочникМонтажи.Контрагент)=0)) Тогда
                ВтораяПоловинаДня = 1;    
            КонецЕсли;    
        КонецЦикла;  
        Если ПерваяПоловинаДня = 1  Тогда
            ПоловинаДня = "Первая половина дня";
            Таб.ВывестиСекцию("ПоловинаДня");
            C = C + 1;
            СправочникМонтажи.ВыбратьЭлементыПоРеквизиту("ДатаМонтажа",ДатаТек,0,0);
            Пока СправочникМонтажи.ПолучитьЭлемент() = 1 Цикл    
                Если (ПустоеЗначение(СправочникМонтажи.Заявка)=0)  и (СправочникМонтажи.Отменен=0) и (СправочникМонтажи.ПоловинаДня=1) Тогда
                    Монтаж = СправочникМонтажи.Заявка;  
                    ИнформацияОМонтаже = "";
                    ИнформацияОМонтаже = ИнформацияОМонтаже + Строка(СправочникМонтажи.Код) + РазделительСтрок + Строка(СправочникМонтажи.Заявка.Проект.Наименование) + РазделительСтрок + СправочникМонтажи.Заявка.Контрагент + РазделительСтрок + СправочникМонтажи.Заявка.АдресМонтажа;
                    ИнформацияОМонтаже = СокрЛП(ИнформацияОМонтаже);  
                    ИнформацияОМонт = СправочникМонтажи.ТекущийЭлемент();  
                    Оборудование="";    
                    Заявка = СправочникМонтажи.Заявка;
                    Заявка.ВыбратьСтроки();
                    Пока Заявка.ПолучитьСтроку()=1 Цикл
                        Оборудование = Оборудование + Заявка.Номенклатура + " "+ Заявка.Количество+", ";
                    КонецЦикла;    
                    Оборудование = Лев(Оборудование,СтрДлина(Оборудование)-2);  
                    Оборудование = Оборудование + РазделительСтрок + СправочникМонтажи.Комментарий;
                    Монтажники = "";
                    ТаблМонтажников = СоздатьОбъект("ТаблицаЗначений");
                    Если ТипЗначенияСтр(ЗначениеИзСтроки(СправочникМонтажи.СтрокаМонтажников))="ТаблицаЗначений" Тогда
                        ТаблМонтажников.Загрузить(ЗначениеИзСтроки(СправочникМонтажи.СтрокаМонтажников));
                    КонецЕсли;    
                    ТаблМонтажников.ВыбратьСтроки();
                    Пока ТаблМонтажников.ПолучитьСтроку()=1 Цикл
                        Монтажники = Монтажники + ТаблМонтажников.Сотрудник + " ";    
                    КонецЦикла;
                    Таб.ВывестиСекцию("ИнформацияОМонтаже");  
                    C = C + 3;  
                КонецЕсли;
            КонецЦикла;
            //только по контрагенту
            //начало
            СправочникМонтажи.ВыбратьЭлементыПоРеквизиту("ДатаМонтажа",ДатаТек,0,0);
            Пока СправочникМонтажи.ПолучитьЭлемент() = 1 Цикл    
                Если (ПустоеЗначение(СправочникМонтажи.Заявка)=1)  и (СправочникМонтажи.Отменен=0) и (СправочникМонтажи.ПоловинаДня=1) и (ПустоеЗначение(СправочникМонтажи.Контрагент)=0) Тогда
                    Монтаж = СправочникМонтажи.Заявка;  
                    ИнформацияОМонтаже = "";
                    ИнформацияОМонтаже = ИнформацияОМонтаже  +СправочникМонтажи.Проект +  РазделительСтрок + СправочникМонтажи.Контрагент +  РазделительСтрок + " ...";
                    ИнформацияОМонтаже = СокрЛП(ИнформацияОМонтаже);  
                    ИнформацияОМонт = СправочникМонтажи.ТекущийЭлемент();  
                    Оборудование="";    
                    Заявка = СправочникМонтажи.Заявка;
                    Заявка.ВыбратьСтроки();
                    Пока Заявка.ПолучитьСтроку()=1 Цикл
                        Оборудование = Оборудование + Заявка.Номенклатура + " "+ Заявка.Количество+", ";
                    КонецЦикла;    
                    Оборудование = Лев(Оборудование,СтрДлина(Оборудование)-2);  
                    Оборудование = Оборудование + РазделительСтрок + СправочникМонтажи.Комментарий;  
                    Монтажники = "";
                    ТаблМонтажников = СоздатьОбъект("ТаблицаЗначений");
                    Если ТипЗначенияСтр(ЗначениеИзСтроки(СправочникМонтажи.СтрокаМонтажников))="ТаблицаЗначений" Тогда
                        ТаблМонтажников.Загрузить(ЗначениеИзСтроки(СправочникМонтажи.СтрокаМонтажников));
                    КонецЕсли;    
                    ТаблМонтажников.ВыбратьСтроки();
                    Пока ТаблМонтажников.ПолучитьСтроку()=1 Цикл
                        Монтажники = Монтажники + ТаблМонтажников.Сотрудник + " ";    
                    КонецЦикла;
                    Таб.ВывестиСекцию("ИнформацияОМонтаже");  
                    C = C + 3;  
                КонецЕсли;
            КонецЦикла;
            //конец
        КонецЕсли;  
        Если ВтораяПоловинаДня = 1  Тогда
            ПоловинаДня = "Вторая половина дня";
            Таб.ВывестиСекцию("ПоловинаДня");
            C = C + 1;
            СправочникМонтажи.ВыбратьЭлементыПоРеквизиту("ДатаМонтажа",ДатаТек,0,0);
            Пока СправочникМонтажи.ПолучитьЭлемент() = 1 Цикл    
                Если (ПустоеЗначение(СправочникМонтажи.Заявка)=0)  и (СправочникМонтажи.Отменен=0) и (СправочникМонтажи.ПоловинаДня=2) Тогда
                    Монтаж = СправочникМонтажи.Заявка;  
                    ИнформацияОМонтаже = "";
                    ИнформацияОМонтаже = ИнформацияОМонтаже + Строка(СправочникМонтажи.Код) + РазделительСтрок + Строка(СправочникМонтажи.Заявка.Проект.Наименование) + РазделительСтрок + СправочникМонтажи.Заявка.Контрагент + РазделительСтрок + СправочникМонтажи.Заявка.АдресМонтажа;
                    ИнформацияОМонтаже = СокрЛП(ИнформацияОМонтаже);  
                    ИнформацияОМонт = СправочникМонтажи.ТекущийЭлемент();    
                    Оборудование="";    
                    Заявка = СправочникМонтажи.Заявка;
                    Заявка.ВыбратьСтроки();
                    Пока Заявка.ПолучитьСтроку()=1 Цикл
                        Оборудование = Оборудование + Заявка.Номенклатура + " "+ Заявка.Количество+", ";
                    КонецЦикла;    
                    Оборудование = Лев(Оборудование,СтрДлина(Оборудование)-2);
                        Оборудование = Оборудование + РазделительСтрок + СправочникМонтажи.Комментарий;
                        Монтажники = "";
                    ТаблМонтажников = СоздатьОбъект("ТаблицаЗначений");
                    Если ТипЗначенияСтр(ЗначениеИзСтроки(СправочникМонтажи.СтрокаМонтажников))="ТаблицаЗначений" Тогда
                        ТаблМонтажников.Загрузить(ЗначениеИзСтроки(СправочникМонтажи.СтрокаМонтажников));
                    КонецЕсли;    
                    ТаблМонтажников.ВыбратьСтроки();
                    Пока ТаблМонтажников.ПолучитьСтроку()=1 Цикл
                        Монтажники = Монтажники + ТаблМонтажников.Сотрудник + " ";    
                    КонецЦикла;
                    Таб.ВывестиСекцию("ИнформацияОМонтаже");  
                    C = C + 3;  
                КонецЕсли;
            КонецЦикла;
            //Только по контрагенту
            //начало
            СправочникМонтажи.ВыбратьЭлементыПоРеквизиту("ДатаМонтажа",ДатаТек,0,0);
            Пока СправочникМонтажи.ПолучитьЭлемент() = 1 Цикл    
                Если (ПустоеЗначение(СправочникМонтажи.Заявка)=1)  и (СправочникМонтажи.Отменен=0) и (СправочникМонтажи.ПоловинаДня=2) и (ПустоеЗначение(СправочникМонтажи.Контрагент)=0) Тогда
                    Монтаж = СправочникМонтажи.Заявка;  
                    ИнформацияОМонтаже = "";
                    ИнформацияОМонтаже = ИнформацияОМонтаже + СправочникМонтажи.Проект +  РазделительСтрок + СправочникМонтажи.Контрагент +  РазделительСтрок +"... ";
                    ИнформацияОМонтаже = СокрЛП(ИнформацияОМонтаже);  
                    ИнформацияОМонт = СправочникМонтажи.ТекущийЭлемент();  
                    Оборудование="";    
                    Заявка = СправочникМонтажи.Заявка;
                    Заявка.ВыбратьСтроки();
                    Пока Заявка.ПолучитьСтроку()=1 Цикл
                        Оборудование = Оборудование + Заявка.Номенклатура + " "+ Заявка.Количество+", ";
                    КонецЦикла;    
                    Оборудование = Лев(Оборудование,СтрДлина(Оборудование)-2);
                        Оборудование = Оборудование + РазделительСтрок + СправочникМонтажи.Комментарий;    
                        Монтажники = "";
                    ТаблМонтажников = СоздатьОбъект("ТаблицаЗначений");
                    Если ТипЗначенияСтр(ЗначениеИзСтроки(СправочникМонтажи.СтрокаМонтажников))="ТаблицаЗначений" Тогда
                        ТаблМонтажников.Загрузить(ЗначениеИзСтроки(СправочникМонтажи.СтрокаМонтажников));
                    КонецЕсли;    
                    ТаблМонтажников.ВыбратьСтроки();
                    Пока ТаблМонтажников.ПолучитьСтроку()=1 Цикл
                        Монтажники = Монтажники + ТаблМонтажников.Сотрудник + " ";    
                    КонецЦикла;
                    Таб.ВывестиСекцию("ИнформацияОМонтаже");  
                    C = C + 3;  
                КонецЕсли;
            КонецЦикла;
            //конец
        КонецЕсли;
        C = C + 1;
        ДатаТек = ДатаТек +1;
    КонецЦикла;        
    Таб.ПараметрыСтраницы(1,,,0,0,0,0,,,1,,);
    Таб.ТолькоПросмотр(1);
    Таб.Показать(,,0);
КонецЕсли;
КонецПроцедуры //Сформировать()
3 Мимохожий Однако
 
26.06.14
08:42
Попробуй разместить таблицу на форме. Еще как я бы подсмотрел как в типовых отчетах работает кнопка Обновить.
4 Мимохожий Однако
 
26.06.14
08:44
У таблицы есть метод Очистить() вместо СоздатьОбъект("Таблица")
5 Мимохожий Однако
 
26.06.14
08:45
Если (ТипЗначенияСтр(Таб) <> "Таблица") ИЛИ (Обновить = 0) Тогда
           Таб = СоздатьОбъект("Таблица");
    Иначе
         Таб.Очистить();
    КонецЕсли;
6 Double_Medved
 
26.06.14
08:50
(3)Да в том-то и дело, что в типовых на кнопку обновить надо нажимать, а я хочу в реал тайме обновлять. Про то как разместить таблицу на форме это здравая идея, теперь буду думать как это сделать
7 Double_Medved
 
26.06.14
09:45
Нашел пример размещения таблицы на форме http://infostart.ru/public/17025/
8 doctorzlo
 
26.06.14
10:16
Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0
    Тогда
        Сообщить("Не получилось загрузить FormEx.DLL ...");
    Иначе
        ИмяТаб="";
        Сервис=СоздатьОбъект("Сервис");
        СпТ=Сервис.СписокТаблиц();
        КоличествоОткрытыхТаблиц=СпТ.РазмерСписка();
        Если КоличествоОткрытыхТаблиц>0
        Тогда
            Для ы=1 По КоличествоОткрытыхТаблиц
            Цикл
                ТекТаб=СпТ.ПолучитьЗначение(ы,ИмяТаб);
                Сообщить(ИмяТаб);
            КонецЦикла;
        Иначе
            Предупреждение("Нет открытых таблиц",5);
        КонецЕсли;
    КонецЕсли;
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.