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

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 человек.
Рекламное место пустует