Имя: Пароль:
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)ДокументОбъект и ДокументСсылка
Тип значения Опер.Документ = "Документ", однако, видимо, инициируется он типа как СоздатьОбъект("Документ.Операция"), при выходе из функции и, соответственно, уничтожении выборки, эти объекты разрушаются
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn