Имя: Пароль:
1C
1C 7.7
v7: ТЗ.ПолучитьЗначение(1,"Документ") = <Объект не найден>(2109/КПД)
0 а кому щас легко
 
28.09.11
08:10
Вот кусок кода.
Когда в этой строке (ТЗ.Документ = Опер.Документ;) меняется документ при переходе на следующую проводку, то значение этого документа меняется во всех строках таблицы значений на текущий документ. Когда выходит из цикла, то объект не найден (как в сабже).

Что за глюк? В остальной части все отрабатывает нормально.

//////////////////////////////////////////////////////////////////////
Процедура СобратьДанныеПосчету(счетВыплаты)
   
   Сч70 = СчетПоКоду("70");
   Опер = СоздатьОбъект("Операция");
   Опер.ВыбратьОперацииСПроводками (НачДата, КонДата, Сч70, СчетВыплаты);
   Пока Опер.ПолучитьПроводку()=1 Цикл
   
       ТЗ.НоваяСтрока();
       ТЗ.Сотрудник = Опер.Дебет.Сотрудники;
       ТЗ.СчетВыплаты = счетВыплаты;
       ТЗ.Документ = Опер.Документ;
       ТЗ.ДатаДок = Опер.Документ.ДатаДок;
       ТЗ.Сумма = Опер.Сумма;    
       
   КонецЦикла;
   
КонецПроцедуры

/////////////////////////////////////////////////////////////////////////////////////////////
Процедура СобратьДанныеОВыплатах()
   
   
   СчетВыплаты =  СчетПоКоду("50");
   
   СобратьДанныеПоСчету(СчетВыплаты);
   
   СчетВыплаты =  СчетПоКоду("51");
   
   СобратьДанныеПоСчету(СчетВыплаты);
   
   ТЗ.Сортировать("Сотрудник,СчетВыплаты,ДатаДок");
   
КонецПроцедуры

//*******************************************
2 а кому щас легко
 
28.09.11
08:18
ТЗ.Документ = Опер.Документ заменил на:

ТЗ.Документ = Строка(Опер.Документ);

Теперь заработало. Почему ТЗ.Документ = Опер.Документ не работает?
3 andrewks
 
28.09.11
08:19
как типизируешь колонку ТЗ.Документ ?
4 Lepochkin
 
28.09.11
08:22
Опер.Документ.ТекущийДокумент() попробуй. Хотя вряд ли поможет, но и времени много не займет.
5 1Сергей
 
28.09.11
08:23
(3)+ как создается и заполняется ТЗ?
6 а кому щас легко
 
28.09.11
08:26
(3) никак не типизирую, там могут быть документы разных типов (в 1с77 давно не был, сильно не пинать)

Вот весь код:


Перем ТЗ;


/////////////////////////////////////////////////////////////////////////////////////////////
Процедура СобратьДанныеПосчету(счетВыплаты)
   
   Сч70 = СчетПоКоду("70");
   Опер = СоздатьОбъект("Операция");
   Опер.ВыбратьОперацииСПроводками (НачДата, КонДата, Сч70, СчетВыплаты);
   Пока Опер.ПолучитьПроводку()=1 Цикл
   
       ТЗ.НоваяСтрока();
       ТЗ.Сотрудник = Опер.Дебет.Сотрудники;
       ТЗ.СчетВыплаты = счетВыплаты;
       ТЗ.Документ = Строка(Опер.Документ);
       ТЗ.ДатаДок = Опер.Документ.ДатаДок;
       ТЗ.Сумма = Опер.Сумма;    
       
   КонецЦикла;
   
КонецПроцедуры

/////////////////////////////////////////////////////////////////////////////////////////////
Процедура СобратьДанныеОВыплатах()
   
   
   СчетВыплаты =  СчетПоКоду("50");
   
   СобратьДанныеПоСчету(СчетВыплаты);
   
   СчетВыплаты =  СчетПоКоду("51");
   
   СобратьДанныеПоСчету(СчетВыплаты);
   
   ТЗ.Сортировать("Сотрудник,СчетВыплаты,ДатаДок");
   
КонецПроцедуры

//*******************************************

Функция ПолучитьСписокСотрудников()
   
   СЗ = СоздатьОбъект ("СписокЗначений");
   ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       
       Если СЗ.НайтиЗначение(ТЗ.Сотрудник) = 0 Тогда
           СЗ.ДобавитьЗначение(ТЗ.Сотрудник);            
       КонецЕсли;
       
   КонецЦикла;
   
   Возврат СЗ;
   
КонецФункции

//*******************************************

Функция ПолучитьСуммуВыплатПоСотруднику(ТекСотрудник)  

   ИтСумма = 0;
   
   ТЗ.ВыбратьСтроки();
   Пока ТЗ.ПолучитьСтроку() = 1 Цикл
       
       Если ТЗ.Сотрудник <> ТекСотрудник Тогда
           Продолжить;
       КонецЕсли;
       
       ИтСумма = ИтСумма + ТЗ.Сумма;    
   
   КонецЦикла;
   
   Возврат ИтСумма;
   
КонецФункции    


//*******************************************

Процедура ВывестиВТаблицу()  
   
   ном = 0;
   
   Таб = СоздатьОбъект ("Таблица");
   
   Таб.ВывестиСекцию ("Секция_Шапка");
   
   СписокСотрудников = ПолучитьСписокСотрудников();
   
   Для н = 1 По СписокСотрудников.РазмерСписка() Цикл
       
       ТекСотрудник = СписокСотрудников.ПолучитьЗначение(н);
   
       СуммаВыплатПоСотруднику = ПолучитьСуммуВыплатПоСотруднику(ТекСотрудник);
   
       Таб.ВывестиСекцию("Секция_ИтогоПоСотруднику");
       
       /////////////////////////////////////////////
       //Выведем строки выплат по сотруднику
       
       ТЗ.ВыбратьСтроки();
       Пока ТЗ.ПолучитьСтроку() = 1 Цикл
           Если ТЗ.Сотрудник <> ТекСотрудник Тогда
               Продолжить;
           КонецЕсли;
           
           ном = ном + 1;
           Сотрудник = ТЗ.Сотрудник;
           ДатаДок  = ТЗ.ДатаДок;
           Документ = ТЗ.Документ;    
           Сумма    = ТЗ.Сумма;
           
           Таб.ВывестиСекцию("Секция_Строка");            
           
       КонецЦикла;
   
   КонецЦикла;
   
   ВсегоСумма = ТЗ.Итог("Сумма");
   Таб.ВывестиСекцию("Секция_Итого");
   
   Таб.Показать();
   
КонецПроцедуры

//*******************************************
Процедура Сформировать()
   
   
   Если (ПустоеЗначение(НачДата) = 1) или
       (ПустоеЗначение(КонДата) = 1) Тогда
           Предупреждение ("Не выбрана дата");
           Возврат;
   КонецЕсли;
   
   ТЗ = СоздатьОбъект ("ТаблицаЗначений");
   ТЗ.НоваяКолонка("Сотрудник");
   ТЗ.НоваяКолонка("СчетВыплаты");
   ТЗ.НоваяКолонка("Документ");
   ТЗ.НоваяКолонка("ДатаДок");
   ТЗ.НоваяКолонка("Сумма");
   
   СобратьДанныеОВыплатах();
   
   ВывестиВТаблицу();

КонецПроцедуры
7 а кому щас легко
 
28.09.11
08:29
(4) так работает :)
8 andrewks
 
28.09.11
08:44
(7)ДокументОбъект и ДокументСсылка
Тип значения Опер.Документ = "Документ", однако, видимо, инициируется он типа как СоздатьОбъект("Документ.Операция"), при выходе из функции и, соответственно, уничтожении выборки, эти объекты разрушаются
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.