|   |   | 
| 
 | 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"); Т.Вывести(); Т.Показать(); КонецПроцедуры | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |