| 
    
            
         
         | 
    
  | 
v7: Создание подотчетов из Йокселя | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    14:42 
 | 
         
        Добрый день! Подскажите пожалуйста можно ли запускать подотчеты из расшифровки в таблице, которую сформировал Йоксель? Он нормально входит в процедуру "ОбработкаЯчейкиТаблицы", но при попытке сформировать исходную таблицу для вложенного отчета:
  
        Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("ВзаимСотрудники"); Выдает ошибку "Неверное имя ВзаимСотрудники" Т.е. как бы не схватывает таблицу из формы. Подскажите пожалуйста если кто сталкивался с таким глюком.  | 
|||
| 
    1
    
        Mikeware    
     12.04.12 
            ✎
    14:44 
 | 
         
        А процедура "обработкаЯчейкиТаблицы" - в каком контексте?     
         | 
|||
| 
    2
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    14:47 
 | 
         
        в контексте объекта "ТабличныйДокумент", йокселевского     
         | 
|||
| 
    3
    
        Mikeware    
     12.04.12 
            ✎
    14:50 
 | 
         
        (2) у этого объекта нет контекста     
         | 
|||
| 
    4
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    14:55 
 | 
         
        Может я что-то не так понял. Я формирую отчет, используя этот объект. При вхождении в процедуру "ОбработкаЯчейкиТаблицы" сохраняются все значения и расшифровки, указанные в модуле объекта "Отчет".     
         | 
|||
| 
    5
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    15:11 
 | 
         
        Может там только из MXL файла можно подтягивать исходную таблицу?     
         | 
|||
| 
    6
    
        Ёпрст    
     гуру 
    12.04.12 
            ✎
    15:13 
 | 
         
        йоксель тут не при чем     
         | 
|||
| 
    7
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    15:33 
 | 
         
        А что не так? =)     
         | 
|||
| 
    8
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    15:35 
 | 
         
        Не знаю может этот фрагмент из отчета поможет. Во второй строке я вгружаю объект "Таблица" в объект "ТабличныйДокумент". Может из-за этого конфликт какой-то?
  
        Документ = СоздатьОбъект ("ТабличныйДокумент"); Документ.ЗагрузитьИзТаблицы(Таб); ГруппыСтрок.ВыбратьСтроки (); Пока ГруппыСтрок.ПолучитьСтроку () = 1 Цикл Документ.ДобавитьГруппуСтрок(ГруппыСтрок.Начало, ГруппыСтрок.Окончание); КонецЦикла; Документ.ПоказатьУровеньГруппировокСтрок(1); Документ.ФиксироватьСтрокиСверху = 5; Фрейм = Документ.Показать("Баланс"); Фрейм.ОтображатьСтруктуру (1); Фрейм.ОтображатьКнопкиУровней (1);  | 
|||
| 
    9
    
        Ёпрст    
     гуру 
    12.04.12 
            ✎
    15:40 
 | 
         
        обработкаЯчейкиТаблицы
  
        где описана ? В локальном контексте или в глобальнике ? Этот весь код где пишешь хоть ?  | 
|||
| 
    10
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    15:40 
 | 
         
        в локальном контексте     
         | 
|||
| 
    11
    
        Ёпрст    
     гуру 
    12.04.12 
            ✎
    15:41 
 | 
         
        И ? больше кода, в особенности, что написано в
  
        обработкаЯчейкиТаблицы  | 
|||
| 
    12
    
        Ёпрст    
     гуру 
    12.04.12 
            ✎
    15:42 
 | 
         
        И это форма чего ? Документа, отчета ? Внешнего отчета ?     
         | 
|||
| 
    13
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    15:43 
 | 
         
        Отчета     
         | 
|||
| 
    14
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    15:44 
 | 
         
        Процедура ОбработкаЯчейкиТаблицы(Зн , Фл , ТабОбр , АдрЯч)
  
        Фл = 0; Если ТипЗначенияСтр(Зн) = "Документ" Тогда ОткрытьФорму(Зн); ИначеЕсли ТипЗначенияСтр(Зн) = "Справочник" Тогда Если Зн.Вид() = "Персонал" Тогда ОблШапки = ТабОбр.Область("R1C1").Текст; ВетрВР = Число(Сред(АдрЯч , 2 , Найти(АдрЯч , "C") - 2)); ТипВР = ТабОбр.Область("R" + ВетрВР + "C6").Текст; Если ТипВР = "П" Тогда ТипВР = "(подотчет)"; ИначеЕсли ТипВР = "К" Тогда ТипВР = "(кредит)"; ИначеЕсли ТипВР = "Т" Тогда ТипВР = "(ТМЦ)"; КонецЕсли; Если Лев(ОблШапки , 6) = "Баланс" Тогда АктСторона = Число(Сред(АдрЯч , Найти(АдрЯч , "C") + 1 , 1)); Если АктСторона < 3 Тогда Стор = "сотрудников"; Иначе Стор = "фирмы"; КонецЕсли; Иначе Если Найти(ОблШапки , "(кредит)") > 0 Тогда ТипВР = "(кредит)"; ИначеЕсли Найти(ОблШапки , "(подотчет)") > 0 Тогда ТипВР = "(подотчет)"; ИначеЕсли Найти(ОблШапки , "(ТМЦ)") > 0 Тогда ТипВР = "(ТМЦ)"; КонецЕсли; Если Лев(ОблШапки , 16) = "Долг сотрудников" Тогда Стор = "сотрудников"; Иначе Стор = "фирмы"; КонецЕсли; КонецЕсли; Если Зн.ЭтоГруппа() = 1 Тогда Табл = СоздатьОбъект("Таблица"); Табл.ИсходнаяТаблица("ВзаимСотрудники"); Заг = "По сотрудникам группы " + Зн.Наименование; Табл.ВывестиСекцию("Отчет"); Табл.ВывестиСекцию("Шапка"); ВсегоДолг = 0; УрОткрПапки = Зн.Уровень(); Если (ТипВР = "(кредит)" ) ИЛИ (ТипВР = "(ТМЦ)" ) Тогда Если ТипВР = "(кредит)" Тогда ЗапросСотрТМП = ЗапросСотр; Иначе ЗапросСотрТМП = ЗапросСотрТМЦ; КонецЕсли; Пока ЗапросСотрТМП.Группировка(1) = 1 Цикл Если ЗапросСотрТМП.Сотрудник.ПринадлежитГруппе(Зн) = 1 Тогда Если ЗапросСотрТМП.Сотрудник.Уровень() = УрОткрПапки + 1 Тогда Если ЗапросСотрТМП.ДолгКон = 0 Тогда Продолжить КонецЕсли; ТекОбъект = ЗапросСотрТМП.Сотрудник; Если ЗапросСотрТМП.Сотрудник.ЭтоГруппа() = 1 Тогда ТекГр = ЗапросСотрТМП.Сотрудник; //Вычисляем реальную + и - суммы группы т.к. изначально они в виде сводного результата ЗапросСотрСуммаПлГр = 0; ЗапросСотрСуммаМиГр = 0; Пока ЗапросСотрТМП.Группировка(1) = 1 Цикл Если ЗапросСотрТМП.Сотрудник.ЭтоГруппа() = 1 Тогда Продолжить КонецЕсли; Если ЗапросСотрТМП.Сотрудник.ПринадлежитГруппе(ТекГр) = 0 Тогда Продолжить КонецЕсли; Если ЗапросСотрТМП.Сотрудник.Выбран() = 0 Тогда Продолжить КонецЕсли; Если ЗапросСотрТМП.ДолгКон = 0 Тогда Продолжить КонецЕсли; Если ЗапросСотрТМП.ДолгКон < 0 Тогда ЗапросСотрСуммаМиГр = ЗапросСотрСуммаМиГр + (-ЗапросСотрТМП.ДолгКон); Иначе ЗапросСотрСуммаПлГр = ЗапросСотрСуммаПлГр + ЗапросСотрТМП.ДолгКон; КонецЕсли; КонецЦикла; //Вычисляем реальную + и - суммы группы т.к. изначально они в виде сводного результата// ЗапросСотрТМП.Получить(ТекГр , ); Расш = ЗапросСотрТМП.Сотрудник; Если Стор = "фирмы" Тогда Если ЗапросСотрСуммаПлГр > 0 Тогда СуммаДолгСотр = ЗапросСотрСуммаПлГр; Табл.ВывестиСекцию("Строка2"); Иначе СуммаДолгСотр = 0; КонецЕсли; Иначе Если ЗапросСотрСуммаМиГр > 0 Тогда СуммаДолгСотр = ЗапросСотрСуммаМиГр; Табл.ВывестиСекцию("Строка2"); Иначе СуммаДолгСотр = 0; КонецЕсли; КонецЕсли; Иначе СуммаДолгСотр = ?(ЗапросСотрТМП.ДолгКон < 0 , - ЗапросСотрТМП.ДолгКон , ЗапросСотрТМП.ДолгКон); Если Стор = "фирмы" Тогда Если ЗапросСотрТМП.ДолгКон < 0 Тогда Продолжить КонецЕсли; Иначе Если ЗапросСотрТМП.ДолгКон > 0 Тогда Продолжить КонецЕсли; КонецЕсли; Расш = ПолучитьПустоеЗначение(); Табл.ВывестиСекцию("Строка1"); КонецЕсли; ВсегоДолг = ВсегоДолг + СуммаДолгСотр; КонецЕсли; КонецЕсли; КонецЦикла; Иначе//Подотчет Пока ЗапросСотрПодотч.Группировка(1) = 1 Цикл Если ЗапросСотрПодотч.Сотрудник.ПринадлежитГруппе(Зн) = 1 Тогда Если ЗапросСотрПодотч.Сотрудник.Уровень() = УрОткрПапки + 1 Тогда Если ЗапросСотрПодотч.ДолгКон = 0 Тогда Продолжить КонецЕсли; ТекОбъект = ЗапросСотрПодотч.Сотрудник; Если ЗапросСотрПодотч.Сотрудник.ЭтоГруппа() = 1 Тогда ТекГр = ЗапросСотрПодотч.Сотрудник; Расш = ЗапросСотрПодотч.Сотрудник; Если Стор = "фирмы" Тогда Если ЗапросСотрПодотч.ДолгКон > 0 Тогда СуммаДолгСотр = ЗапросСотрПодотч.ДолгКон; Табл.ВывестиСекцию("Строка2"); Иначе СуммаДолгСотр = 0; КонецЕсли; Иначе Если ЗапросСотрПодотч.ДолгКон < 0 Тогда СуммаДолгСотр = -ЗапросСотрПодотч.ДолгКон; Табл.ВывестиСекцию("Строка2"); Иначе СуммаДолгСотр = 0; КонецЕсли; КонецЕсли; Иначе СуммаДолгСотр = ?(ЗапросСотрПодотч.ДолгКон < 0 , - ЗапросСотрПодотч.ДолгКон , ЗапросСотрПодотч.ДолгКон); Если Стор = "фирмы" Тогда Если ЗапросСотрПодотч.ДолгКон < 0 Тогда Продолжить КонецЕсли; Иначе Если ЗапросСотрПодотч.ДолгКон > 0 Тогда Продолжить КонецЕсли; КонецЕсли; Расш = ПолучитьПустоеЗначение(); Табл.ВывестиСекцию("Строка1"); КонецЕсли; ВсегоДолг = ВсегоДолг + СуммаДолгСотр; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли;//ТипВР Табл.ВывестиСекцию("Итоги"); Табл.Опции(0,0,0,0,ПарСтрОтчДлинн); Табл.ТолькоПросмотр(1); Табл.ПараметрыСтраницы(1,,10,10,10,10,,,,1); Табл.Показать("По сотрудникам группы " + Зн.Наименование , ""); КонецЕсли; КонецЕсли;//Справочник.Персонал Если Зн.Вид() = "СтатьиРасходов" Тогда ЗапросЗатраты.ВНачалоВыборки(); Табл=СоздатьОбъект("Таблица"); Табл.ИсходнаяТаблица("Таблица3"); Заг="По затратам группы "+Зн.Наименование; Табл.ВывестиСекцию("Отчет"); Табл.ВывестиСекцию("Шапка"); ВсегоРасх=0; УрОткрПапки = Зн.Уровень(); Пока ЗапросЗатраты.Группировка(1)=1 Цикл Если ЗапросЗатраты.Статья.ПринадлежитГруппе(Зн) = 1 Тогда Если ЗапросЗатраты.Статья.Уровень() = УрОткрПапки + 1 Тогда СуммаСтатья =ЗапросЗатраты.РасхНал; ВсегоРасх =ВсегоРасх + СуммаСтатья; Если ЗапросЗатраты.Статья.ЭтоГруппа() = 1 Тогда Расш = ЗапросЗатраты.Статья; Табл.ВывестиСекцию("Строка2"); Иначе Расш = ПолучитьПустоеЗначение(); Табл.ВывестиСекцию("Строка1"); КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; Табл.ВывестиСекцию("Итоги"); Табл.Опции(0,0,0,0,ПарСтрОтчДлинн); Табл.ТолькоПросмотр(1); Табл.ПараметрыСтраницы(1,,10,10,10,10,,,,1); Табл.Показать("По затратам группы "+Зн.Наименование,""); КонецЕсли; Иначе //Расшифровка зашифрованного типа Если Зн = "РасхождениеПодробно" Тогда Табл = СоздатьОбъект("Таблица"); Табл.ИсходнаяТаблица("РасхождениеПодр"); Табл.ВывестиСекцию("Шапка"); СуммаИзменВзаимИт = 0; //Ввод остатков взаиморасчетов ДокВводОстатковВзаиморасчетов = СоздатьОбъект("Документ.ВводОстатковВзаиморасчетов"); ДокВводОстатковВзаиморасчетов.УстановитьФильтр(1,0,,,); ДокВводОстатковВзаиморасчетов.ВыбратьДокументы(ДатаНачало , ДатаКонец); Пока ДокВводОстатковВзаиморасчетов.ПолучитьДокумент() = 1 Цикл РегВзРасч = СоздатьОбъект("Регистр.Взаиморасчеты"); РегВзРасч.ВыбратьДвиженияДокумента(ДокВводОстатковВзаиморасчетов.ТекущийДокумент()); СуммаИзменВзаим = 0; Пока РегВзРасч.ПолучитьДвижение() = 1 Цикл СуммаИзменВзаим = СуммаИзменВзаим + РегВзРасч.СуммаБазовая; КонецЦикла; ПечДок = ДокВводОстатковВзаиморасчетов.ТекущийДокумент(); //Сообщить("" + ДокВводОстатковВзаиморасчетов.ТекущийДокумент() + ", Клиент: " + ДокВводОстатковВзаиморасчетов.Клиент + ", Сумма: " + СуммаИзменВзаим); Табл.ВывестиСекцию("Строка"); СуммаИзменВзаимИт = СуммаИзменВзаимИт + СуммаИзменВзаим; КонецЦикла; //Ввод остатков товаров ДокВводОстатковТоваров = СоздатьОбъект("Документ.ВводОстатковТоваров"); ДокВводОстатковТоваров.УстановитьФильтр(1,0,,,); ДокВводОстатковТоваров.ВыбратьДокументы(ДатаНачало , ДатаКонец); Пока ДокВводОстатковТоваров.ПолучитьДокумент() = 1 Цикл //Если ДокВводОстатковТоваров.Склад <> Константа.ОснСклад Тогда Продолжить КонецЕсли; Если ДокВводОстатковТоваров.Акт = 1 Тогда Продолжить КонецЕсли; РегВзРасч = СоздатьОбъект("Регистр.ОстаткиТоваров"); РегВзРасч.ВыбратьДвиженияДокумента(ДокВводОстатковТоваров.ТекущийДокумент()); СуммаИзменВзаим = 0; Пока РегВзРасч.ПолучитьДвижение() = 1 Цикл Если РегВзРасч.Приход = 1 Тогда СуммаИзменВзаим = СуммаИзменВзаим + РегВзРасч.БазоваяСтоимость; Иначе//Расход (На случай Акта) СуммаИзменВзаим = СуммаИзменВзаим - РегВзРасч.БазоваяСтоимость; КонецЕсли; КонецЦикла; ПечДок = ДокВводОстатковТоваров.ТекущийДокумент(); Табл.ВывестиСекцию("Строка"); СуммаИзменВзаимИт = СуммаИзменВзаимИт + СуммаИзменВзаим; КонецЦикла; Табл.ВывестиСекцию("Подвал"); Табл.Опции(0,0,4,0); Табл.ТолькоПросмотр(1); Табл.Показать(); Иначе//Взаиморасчеты Поз = Найти(Зн , "~"); //Сообщить(Поз); Если Поз = 0 Тогда Возврат; КонецЕсли; Код = Лев(Зн , Поз-1); Признак = Число(Прав(Зн,1)); Если Признак = 0 Тогда Возврат; ИначеЕсли (Признак = 1) ИЛИ (Признак = 2) Тогда//Взаиморасчеты с клиентами КлиентыДетально(Запрос , Признак , Код); ИначеЕсли (Признак = 5) ИЛИ (Признак = 6) Тогда//Взаиморасчеты с клиентами по ТМЦ КлиентыДетально(ЗапросТМЦ , Признак , Код); ИначеЕсли (Признак = 3) ИЛИ (Признак = 4) Тогда//Подотчет ПодотчетДетально(Признак, Код); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры  | 
|||
| 
    15
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    15:46 
 | 
         
        Глючить начинает при попытке вызвать исходные таблицы, как тут:
  
        Табл.ИсходнаяТаблица("Таблица1"); Табл.ИсходнаяТаблица("Таблица2"); Табл.ИсходнаяТаблица("Таблица3");  | 
|||
| 
    16
    
        Ёпрст    
     гуру 
    12.04.12 
            ✎
    15:50 
 | 
         
        теперь тест на вшивость:
  
        Перем ИмяТаблички; Процедура ОбработкаЯчейкиТаблицы(Зн , Фл , ТабОбр , АдрЯч) фл=0; ИмяТаблички = "Таблица1"; Форма.Закрыть(0); КонецПроцедуры Процедура ПриЗакрытии() Если ПустоеЗначение(ИмяТаблички)=0 Тогда СтатусВозврата(0); Т = СоздатьОбъект("Таблица"); Т.ИсходнаяТаблица(ИмяТаблички); Т.Вывести(); Т.Показать(); ИмяТаблички=""; КонецЕсли; КонецПроцедуры  | 
|||
| 
    17
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    15:55 
 | 
         
        Да, таблицу он открыл     
         | 
|||
| 
    18
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    15:55 
 | 
         
        Через ложное закрытие все отчеты сделать?     
         | 
|||
| 
    19
    
        Ёпрст    
     гуру 
    12.04.12 
            ✎
    15:57 
 | 
         
        (18) можно и так..
  
        У тебя изначальная таблица как формировалась ? Из процы или операторов основной программы ? Или.. по проце на радиобуттоне.. ?  | 
|||
| 
    20
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    16:00 
 | 
         
        С процедуры на кнопке     
         | 
|||
| 
    21
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    16:00 
 | 
         
        Там весь отчет в одной процедуре     
         | 
|||
| 
    22
    
        Ёпрст    
     гуру 
    12.04.12 
            ✎
    16:02 
 | 
         
        можно еще так попробовать:
  
        Перем Т; Процедура ПриОткрытии() Т = СоздатьОбъект("Таблица"); КонецПроцедуры Процедура ОбработкаЯчейкиТаблицы(Зн , Фл , ТабОбр , АдрЯч) фл=0; Т = Очистить(); Т.ИсходнаяТаблица("Таблица1"); Т.Вывести(); Т.Показать(); КонецПроцедуры  | 
|||
| 
    23
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    16:11 
 | 
         
        (22) Нет, так не хочет ((     
         | 
|||
| 
    24
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    16:14 
 | 
         
        Буду через закрытие делать. Спасибо огромное     
         | 
|||
| 
    25
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    16:48 
 | 
         
        Оказывается можно не через закрытие сделать, а просто вынести формирование вложенных отчетов из процедуры "ОбработкаЯчейкиТаблицы" в отдельную процедуру. Всё летает, всем спасибо!     
         | 
|||
| 
    26
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    17:13 
 | 
         
        Нифига =) Только с внешним отчетом это прокатило. Отчет в составе конфигурации все равно пришлось делать через ложное закрытие.     
         | 
|||
| 
    27
    
        Mikeware    
     12.04.12 
            ✎
    17:19 
 | 
         
        (26) а переменные модуля - видятся?     
         | 
|||
| 
    28
    
        antoneus    
     12.04.12 
            ✎
    17:23 
 | 
         
        (0) было такое. победил тем, что все таблицы сделал переменными модуля, проинициализировал приоткрытии(), а в обработке ячейки таблицы делал таб.очистить()     
         | 
|||
| 
    29
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    17:23 
 | 
         
        Перем Зн;
  
        Перем ТабОбр; Перем АдрЯч; Процедура ВложенныйОтчет(); .... КонецПроцедуры Процедура ОбработкаЯчейкиТаблицы(ВыбЗн , Фл , ТабОбработки , АдресЯчейки) Фл = 0; Если ТипЗначенияСтр(ВыбЗн) = "Документ" Тогда ОткрытьФорму(ВыбЗн); ИначеЕсли ТипЗначенияСтр(ВыбЗн) = "Справочник" Тогда Зн = ВыбЗн; АдрЯч = АдресЯчейки; ТабОбр = ТабОбработки; ВложенныйОтчет(); //Форма.Закрыть(0); КонецЕсли; КонецПроцедуры  | 
|||
| 
    30
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    17:26 
 | 
         
        (28) О сейчас попробую.     
         | 
|||
| 
    31
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    17:47 
 | 
         
        Да так тоже работает ))     
         | 
|||
| 
    32
    
        Seeker_
 Of_Truth 12.04.12 
            ✎
    17:52 
 | 
         
        (22) Почти как тут, только при открытии нужно ещё и исходную таблицу сразу прописывать.
  
        Перем Т; Процедура ПриОткрытии() Т = СоздатьОбъект("Таблица"); Т.ИсходнаяТаблица("Таблица1"); КонецПроцедуры Процедура ОбработкаЯчейкиТаблицы(Зн , Фл , ТабОбр , АдрЯч) фл=0; Т = Очистить(); //Т.ИсходнаяТаблица("Таблица1"); Т.Вывести(); Т.Показать(); КонецПроцедуры  | 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |