Имя: Пароль:
1C
1C 7.7
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");
     Т.Вывести();
     Т.Показать();
КонецПроцедуры
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший