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