Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 2
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Интересный глюк в документе "Расходы на приобретение" , Производство + Услуги + Бухгалтерия          
VladRd Подменю пользователя
сообщение 13.04.12, 9:10
Сообщение #1

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

В модуле документа есть переменная модуля - РазницаНДС. Значение ей присваивается в процедуре РассчитатьСтроку(). Эта процедура вызывается не для каждой строки (там стоит условие на вызов). То есть, если для первой строки документа процедура вызывалась, переменная получила значение, а для второй строки не вызывалась, переменная осталась со значением предыдущей строки. Эта переменная выступает как сумма(или при расчете суммы) в двух проводках(строка 488 и 490 в модуле типового ПУБа). Если значение переменной 0, то проводки естественно не формируются. Формирование проводок тоже сопровождается условием.
Так вот, эта схема иногда приводит к появлению тех двух проводок для строки, в которой нет НДС(а значение РазницаНДС осталось от предыдущей строки). Но еще интересней то, что иногда при восстановлении последовательности через "Операции-Проведение документов" значение переменной РазницаНДС передается из документа в документ! Давно работаю с 1С, но с таким столкнулся впервые. Слышал что-то об особом порядке вызова процедур модуля при таком перепроведении, но увидел впервые. Проверку на наличие глобальных переменных с таким именем и реквизитов делал - нет таких.

Сообщение отредактировал Vofka - 17.04.12, 7:56

volodya1122 Подменю пользователя
сообщение 13.04.12, 9:25
Сообщение #2

Оратор
Иконка группы
Группа: Местный
Сообщений: 354
Из: Тернопіль
Спасибо сказали: 141 раз
Рейтинг: 143.7

ничего не понял из написаного. Но попробую чтото посоветовать. Процедуру вызиваете при переборе строк документа? Может при выборе очередной строки переменную забыли обнулить, поэтому возващается последнее значение которое было при последнем прохождении цикла?

Vofka Подменю пользователя
сообщение 13.04.12, 9:28
Сообщение #3

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14050
Из: Киев
Спасибо сказали: 4612 раз
Рейтинг: 3748.8

А я советую посмотреть что делается при этом в типовом ПУБе. Возможно, как сказал volodya1122, разработчик просто забыл обнулять переменную.

VladRd Подменю пользователя
сообщение 13.04.12, 10:02
Сообщение #4

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

Да, ребята, все так как вы говорите. Перебор строк идет в процедуре ПриПроведении(). Оттуда и вызывается Процедура РассчитатьСтроку(), где инициализируется переменная РазницаНДС. И переменную я уже обнулил :-) . Эффект передачи значения переменной из документа в документ при перепроведении - вот что вызывает интерес. По-этому и поднял тему. Может кто что знает об особенностях работы кода модуля документа именно при перепроведении.

Vofka Подменю пользователя
сообщение 13.04.12, 10:19
Сообщение #5

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14050
Из: Киев
Спасибо сказали: 4612 раз
Рейтинг: 3748.8

Цитата(VladRd @ 13.04.12, 11:02) *
Эффект передачи значения переменной из документа в документ при перепроведении - вот что вызывает интерес.

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

VladRd Подменю пользователя
сообщение 13.04.12, 10:28
Сообщение #6

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

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

Проверял... В первом посте сказал.

Vofka Подменю пользователя
сообщение 13.04.12, 10:31
Сообщение #7

У нас здесь своя атмосфера...
***********
Группа: Основатель
Сообщений: 14050
Из: Киев
Спасибо сказали: 4612 раз
Рейтинг: 3748.8

Не может переменная модуля документа передаваться сама по себе, если это где-то явно не указано. При создании нового объекта происходит инициализация переменной в контексте этого объекта.

VladRd Подменю пользователя
сообщение 13.04.12, 10:53
Сообщение #8

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

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

Поправка к сообщ №8.
Причем, если документ проводить НЕ групповым проведением, а открыть и провести, то все нормально. Естественно операция будет отличаться на 2 проводки...

XBrut Подменю пользователя
сообщение 13.04.12, 11:12
Сообщение #9

Статус
**********
Группа: Пользователи
Сообщений: 1543
Спасибо сказали: 256 раз
Рейтинг: 0

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

А теперь факты:
У меня был премерзкий случай с переменной модуля документа, когда я понадеялся, что если переменная модуля документа не инициализирована явно, то там ПУСТОТА.
При пакетном проведении там оказалась очень даже не пустота.
...и с тех пор я инициализирую переменные модуля документа явно (и шёпотом добавляю парочку матов для надёжности)

Сообщение отредактировал XBrut - 13.04.12, 11:29

VladRd Подменю пользователя
сообщение 13.04.12, 11:29
Сообщение #10

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

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

alex040269 Подменю пользователя
сообщение 13.04.12, 14:38
Сообщение #11

Крутой
Иконка группы
Группа: Местный
Сообщений: 1626
Из: Гуляйполе
Спасибо сказали: 236 раз
Рейтинг: 0

Цитата(XBrut @ 13.04.12, 12:12) *
При пакетном проведении там оказалась очень даже не пустота.

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


Signature
Никогда не бойся делать то, что не умеешь, помни - Ноев ковчег был построен любителем, профессионалы построили Титаник.
ЗиУП

XBrut Подменю пользователя
сообщение 13.04.12, 15:47
Сообщение #12

Статус
**********
Группа: Пользователи
Сообщений: 1543
Спасибо сказали: 256 раз
Рейтинг: 0

не поленился туда залезть и посмотреть

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


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





VladRd Подменю пользователя
сообщение 17.04.12, 8:19
Сообщение #13

Молчаливый
*
Группа: Пользователи
Сообщений: 6
Спасибо сказали: 0 раз
Рейтинг: 0

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

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



 i 

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


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


Сообщение отредактировал Vofka - 17.04.12, 7:56

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 16.06.25, 1:43
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!