Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Интересный глюк в документе "Расходы на приобретение"
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
VladRd
В модуле документа есть переменная модуля - РазницаНДС. Значение ей присваивается в процедуре РассчитатьСтроку(). Эта процедура вызывается не для каждой строки (там стоит условие на вызов). То есть, если для первой строки документа процедура вызывалась, переменная получила значение, а для второй строки не вызывалась, переменная осталась со значением предыдущей строки. Эта переменная выступает как сумма(или при расчете суммы) в двух проводках(строка 488 и 490 в модуле типового ПУБа). Если значение переменной 0, то проводки естественно не формируются. Формирование проводок тоже сопровождается условием.
Так вот, эта схема иногда приводит к появлению тех двух проводок для строки, в которой нет НДС(а значение РазницаНДС осталось от предыдущей строки). Но еще интересней то, что иногда при восстановлении последовательности через "Операции-Проведение документов" значение переменной РазницаНДС передается из документа в документ! Давно работаю с 1С, но с таким столкнулся впервые. Слышал что-то об особом порядке вызова процедур модуля при таком перепроведении, но увидел впервые. Проверку на наличие глобальных переменных с таким именем и реквизитов делал - нет таких.
volodya1122
ничего не понял из написаного. Но попробую чтото посоветовать. Процедуру вызиваете при переборе строк документа? Может при выборе очередной строки переменную забыли обнулить, поэтому возващается последнее значение которое было при последнем прохождении цикла?
Vofka
А я советую посмотреть что делается при этом в типовом ПУБе. Возможно, как сказал volodya1122, разработчик просто забыл обнулять переменную.
VladRd
Да, ребята, все так как вы говорите. Перебор строк идет в процедуре ПриПроведении(). Оттуда и вызывается Процедура РассчитатьСтроку(), где инициализируется переменная РазницаНДС. И переменную я уже обнулил :-) . Эффект передачи значения переменной из документа в документ при перепроведении - вот что вызывает интерес. По-этому и поднял тему. Может кто что знает об особенностях работы кода модуля документа именно при перепроведении.
Vofka
Цитата(VladRd @ 13.04.12, 11:02) необходимо зарегистрироваться для просмотра ссылки
Эффект передачи значения переменной из документа в документ при перепроведении - вот что вызывает интерес.

А может переменная это глобальная переменная?
VladRd
<А может переменная это глобальная переменная?>

Проверял... В первом посте сказал.
Vofka
Не может переменная модуля документа передаваться сама по себе, если это где-то явно не указано. При создании нового объекта происходит инициализация переменной в контексте этого объекта.
VladRd
Да я сюда специально запостил, в надежде, что у участников этого раздела форума типовой ПУБ для Украины под рукой и найдется минутка для эксперимента. У меня получился такой результат, который я описал. Пользуясь отладчиком я увидел значение переменной РазницаНДС в начале работы процедуры ПриПроведении(). Она должна была быть неопределенной, но на самом деле ее значение равнялось числу из последней строки предыдущего дока. Причем, если документ проводить групповым проведением, а открыть и провести, то все нормально. Естественно операция будет отличаться на 2 проводки...

Поправка к сообщ №8.
Причем, если документ проводить НЕ групповым проведением, а открыть и провести, то все нормально. Естественно операция будет отличаться на 2 проводки...
XBrut
Слышал неподтвержденное мнение, что в модуле документа вообще переменные объявлять нежелательно.
В ответ на моё удивление , что мол в типовых украинских их есть ))
Источник заявил : "А Вы зайди в любую российскую типовую и посмотри, есть объявления или нету"
Как человек не очень дотошный я зашел в рос. торговлю.. и таки не увидел их там много crazy.gif

А теперь факты:
У меня был премерзкий случай с переменной модуля документа, когда я понадеялся, что если переменная модуля документа не инициализирована явно, то там ПУСТОТА.
При пакетном проведении там оказалась очень даже не пустота.
...и с тех пор я инициализирую переменные модуля документа явно (и шёпотом добавляю парочку матов для надёжности)
VladRd
То XBrut. Вот точное определение- премерзкий случай. Как-то начинаешь сомневаться в незыблемости знаний... Основ, что-ли :-)
И дело даже не в ошибке в типовой конфиге. Их много было. А в непонятном поведении платформы(вроде все нормально, 27-й релиз на ХР-юше)...
alex040269
Цитата(XBrut @ 13.04.12, 12:12) необходимо зарегистрироваться для просмотра ссылки
При пакетном проведении там оказалась очень даже не пустота.

Это означает только, то что переменные нужно таки инициализировать перед первым использованием
XBrut
не поленился туда залезть и посмотреть

    
        ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        Если глСчетаПоставщиковПокупателей.Принадлежит(Число(Счет.Код)) = 1 Тогда
            РассчитатьСтроку(); //ВОТ ТУТ ИНИЦИАЛИЗИРУЕТСЯ ПЕРЕМЕННАЯ
        КонецЕсли;        
        ПроводкиСтрока();        //А ВОТ ТУТ ОНА ИСПОЛЬЗУЕТСЯ    
    КонецЦикла;


Ну так всё сходится ... переменная инициализируется иногда, а используется всегда.




VladRd
Да, а объявление как для переменной модуля

Перем РазницаНДС;
//===================
//здесь процедуры-функции модуля
...
...
//дальше
Процедура ОбработкаПроведения()
...
       ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
    
        //сюда вставил первичную инициализацию для каждой строки, в типовой ее нету
        РазницаНДС = 0;    
    
        Если глСчетаПоставщиковПокупателей.Принадлежит(Число(Счет.Код)) = 1 Тогда
            РассчитатьСтроку(); //ВОТ ТУТ ИНИЦИАЛИЗИРУЕТСЯ ПЕРЕМЕННАЯ
        КонецЕсли;        
        ПроводкиСтрока();        //А ВОТ ТУТ ОНА ИСПОЛЬЗУЕТСЯ    
    КонецЦикла;
...
КонецПроцедуры



 i 

Выделяем же код, ё-маё
 


<Выделяем же код, ё-маё>
Прошу прощения. Я "не писатель". Читал форум часто...
Появился повод сообщить коллегам(посоветоваться) - зарегистрировался...
Как собственно и на мисте, а ранее на Т1С...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.