Вход | Регистрация

1С:Предприятие ::

Метки:

У меня глюк?!?! Проблема при проведении документов

Я
   Arhitektor
 
09.01.04 - 09:27
Здраствуйте, уважаемые эксперты!

Это снова я :-)

Вопрос:
Посмотрите, пожалуйста, следующую процедуру, которая вызывается при проведении документов ВозвратОтПокупателя, Реализация, РеализацияПрочее и измененяет реквизиты справочника Договоры, подчиненные справочнику Контрагенты.
При этом иногда документы проводятся нормально, а иногда выскакивает ошибка:

СпрД.СуммаС01012004 = СпрД.СуммаС01012004 + Конт.Итог("Сумма");
(Глобальный модуль(14547)): Не выбран элемент!

При этом информация из отладчика:

Конт.Контрагент = ИП Майстер Е.Н.
Конт.Проведен() = 0
Конт.Договор = Основной договор
СпрД.НайтиЭлемент(Конт.Договор) = 1

то есть договор найден!!!

Сама процедура:
//******************************************************************************

// глИзмСуммы(Конт, Передача, ФлагПМ)
//

// Параметры: 
// Конт - контекст документа

// Передача - список значений, в котором хранятся 
// Контрагент, Договор, Итог("Сумма") документа

// ФлагПМ - флаг +(1)/-(0) сумму
//

// Возвращаемое значение:
//  Нет

//
// Описание:

//  ТекстОписания
//

Процедура глИзмСуммы(Конт, Передача, ФлагПМ) Экспорт

Перем Контр, Дог, СумДок, Лок;
    
Если Конт.ДатаДок >= Дата("01.01.2004") Тогда
 Если Конт.Проведен() = 0 Тогда
  СпрД = СоздатьОбъект("Справочник.Договоры"); 
  СпрД.ИспользоватьВладельца(Конт.Контрагент); 
  СпрД.НайтиЭлемент(Конт.Договор);
  Если Конт.Вид() = "ВозвратОтПокупателя" Тогда
   СпрД.СуммаС01012004 = СпрД.СуммаС01012004 -                         Конт.Итог("Сумма");
  Иначе                              
   СпрД.СуммаС01012004 = СпрД.СуммаС01012004 +   Конт.Итог("Сумма");
  КонецЕсли;
            
  Если СпрД.УчитыватьСкидки = 1 Тогда 
   Спр = СоздатьОбъект("Справочник.Скидки"); 
    
   Сум = СпрД.СуммаНа01012004+СпрД.СуммаС01012004;    
                
   Номер = -1; 
                    
   Спр.ВыбратьЭлементы(); 
   Пока Спр.ПолучитьЭлемент() = 1 Цикл 
    Если Сум < Спр.Сумма Тогда 
     Номер = Число(Спр.Код); 
     Прервать; 
    КонецЕсли;                                       
   КонецЦикла; 
                    
   Если (Номер <> -1) и (Номер <> 1) Тогда 
    Номер = Номер - 1;                         
    Стр = "Скидка " + Строка(Номер) + "%";  
    Спр.НайтиПоНаименованию(Стр); 
    Если СпрД.Скидка <> Спр.ТекущийЭлемент() Тогда 
     СпрД.Скидка = Спр.ТекущийЭлемент(); 
    КонецЕсли;                 
   ИначеЕсли Номер = 1 Тогда 
    СпрД.Скидка = ""; 
   Иначе 
    Спр.НайтиПоНаименованию("Скидка 7%"); 
    СпрД.Скидка = Спр.ТекущийЭлемент();     
   КонецЕсли; 
  КонецЕсли; 
СпрД.Записать();
Иначе
 Контр  = Передача.ПолучитьЗначение(1);    
 Дог    = Передача.ПолучитьЗначение(2);
 СумДок = Передача.ПолучитьЗначение(3);
            
 СпрД = СоздатьОбъект("Справочник.Договоры");

 Если ФлагПМ = 0 Тогда
  СпрД.ИспользоватьВладельца(Контр); 
  СпрД.НайтиЭлемент(Дог); 
  Если Конт.Вид() = "ВозвратОтПокупателя" Тогда
   СпрД.СуммаС01012004 = СпрД.СуммаС01012004 + 
                         СумДок; 
  Иначе
   СпрД.СуммаС01012004 = СпрД.СуммаС01012004 - 
                         СумДок; 
  КонецЕсли;    
 Иначе
  СпрД.ИспользоватьВладельца(Контр); 
  СпрД.НайтиЭлемент(Конт.Договор); 
  Если Конт.Вид() = "ВозвратОтПокупателя" Тогда
   СпрД.СуммаС01012004 = СпрД.СуммаС01012004 - 
                         Конт.Итог("Сумма"); 
  Иначе
   СпрД.СуммаС01012004 = СпрД.СуммаС01012004 + 
                         Конт.Итог("Сумма"); 
  КонецЕсли;    
 КонецЕсли;
        
 Если СпрД.УчитыватьСкидки = 1 Тогда 
  Спр = СоздатьОбъект("Справочник.Скидки"); 
          
  Сум = СпрД.Суммана01012004 + СпрД.СуммаС01012004; 
                
  Номер = -1; 
                    
  Спр.ВыбратьЭлементы(); 
  Пока Спр.ПолучитьЭлемент() = 1 Цикл 
   Если Сум < Спр.Сумма Тогда 
    Номер = Число(Спр.Код); 
    Прервать; 
   КонецЕсли;                                       
  КонецЦикла; 
                    
  Если (Номер <> -1) и (Номер <> 1) Тогда 
   Номер = Номер - 1;                         
   Стр = "Скидка " + Строка(Номер) + "%"; 
   Спр.НайтиПоНаименованию(Стр); 
   Если СпрД.Скидка <> Спр.ТекущийЭлемент() Тогда 
    СпрД.Скидка = Спр.ТекущийЭлемент(); 
   КонецЕсли;                 
  ИначеЕсли Номер = 1 Тогда 
   СпрД.Скидка = ""; 
  Иначе 
   Спр.НайтиПоНаименованию("Скидка 7%"); 
   СпрД.Скидка = Спр.ТекущийЭлемент();     
  КонецЕсли; 
 КонецЕсли; 
 СпрД.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры// глИзмСуммы(Конт, Передача, ФлагПМ)


__________________________________________________
С уважением к вашим знаниям и незнаниям Arhitektor
 
  Рекламное место пустует
   345
1 - 09.01.04 - 09:36
Вообще то писать расчетные данные в справочник - моветон, коллега .... Для этого есть регистры/счета ...
Иначе тебе так юзеры там накосячат руками ....

Глобальный модуль(14547)): ... круто ... 14547 ....о как!

Суть ошибки - где то после поиска или записи не позиционирован элемент справочника ...
Рыть весь твой алгорит - лень .... а сообщение вылетает в одном из 4 мест ... которое из них строка 14547 .... не знаю ...
   Arhitektor
 
2 - 09.01.04 - 09:38
345
<Глобальный модуль(14547)): ... круто ... 14547 ....о как!>
Да, ладно, я работаю в конфигурации Торговля и Склад 7.7
:)))

Понятно, что не спозиционирован элемент справочника. Но ведь Отладчик говорит, что все ОК
   skunk
 
3 - 09.01.04 - 09:59
Если Конт.Вид()="ВозвратОтПокупателя" Тогда
  СпрД.СуммаС01012004=СпрД.СуммаС01012004-Конт.Итог("Сумма"); 
Иначе
 СпрД.СуммаС01012004=СпрД.СуммаС01012004+Конт.Итог("Сумма"); - есть 14547 строка
КонецЕсли; 

тогда договор не причем. точно незнаю но попробуй при вызвове данной функции из модуля документа попробуй вместо контекста передать ТекущийДокумент()
   Arhitektor
 
4 - 09.01.04 - 11:51
skunk, ты крут!!!

Поменял и пока тьфу-тьфу все ОК!!!

Будешь проезжать мимо, заходи в гости!!!
   skunk
 
5 - 09.01.04 - 17:45
нет мы просто с питом долго за подобное бились, как он сразу не вкурил, наверное настроения не было


Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует