Отладка кода: НДС в УТП

12971069114KVyP2Необычная проблема недавно попалась в УТП (конфигурация “Управление торговым предприятием” для Украины, платформа 8.2) – при формировании проводок в приходном документе проводка взаиморасчетов с контрагентом выполнялась с зачетом аванса, т.е. как второе событие, а проводка НДС как первое событие. В результате задваивалась сумма на дебете счета 6442, вместо того, чтобы появиться в кредите. Я рассматривал проблему “по-программерски”, изнутри, поэтому какие настройки в самой программе привели к такому положению не знаю, расскажу только, где увидеть причину.

В модуле проведения документа расчеты событий во взаиморасчетах и в учете НДС производятся отдельно и используются разные регистры, поэтому и стала возможной такая проблема. Расчет движений по НДС выполняется в общем модуле “НалоговыйУчет”, если вы ведете обычный учет, без пропорционального распределения, то последовательность в алгоритме расчета приведет вас к процедуре ДвиженияПоРегистрамНалоговогоУчетаУпрощенныйНалоговыйУчет(). Кстати, отслеживать последовательность выполнения команд в модуле очень легко: если запустить из конфигуратора сеанс предприятия в режиме отладки (клавиша F5), то находясь в коде, клавишей F9 можно ставить точки останова – теперь при выполнении модуля в указанной точке программа остановится и можно будет просмотреть содержимое переменных. Если в тексте модуля вызывается какая-либо процедура, клавишей F12 можно перейти к ней и так далее по цепочке.

Так вот, в упомянутой выше процедуре производится выборка остатков из регистров “ПродажиНалоговыйУчет” и “ПриобретенияНалоговыйУчет”, в зависимости от того, какая операция обрабатывается – покупка или продажа, затем для каждого движения текущего документа делается выборка из полученных остатков регистров по таким параметрам:

 

2011-06-08_112738

 

Именно в этом месте можно в режиме отладки увидеть полученные остатки регистров и сформированную структуру отбора. Для того чтобы увидеть ТаблицуОстатков поставьте точку останова на строку, где формируется значение переменной СтрокаОстатков, запустите проведение документа, когда выполнение остановится на отметке, двойным щелчком выделите переменную ТаблицаОстатков:

 

2011-06-08_113249

 

и нажмите сочетание клавиш Shift+F9, откроется окно, показывающее значение переменной:

 

2011-06-08_113529

В поле “Результат” видно, что переменная имеет тип “ТаблицаЗначений”, чтобы увидеть саму таблицу нужно выделить строку со значением в поле “Результат” и нажать клавишу F2, откроется содержимое таблицы:

 

2011-06-08_113823

Здесь уже можно увидеть значение каждого поля таблицы. Обратите внимание на кнопки в окне, есть возможность даже распечатать содержимое или хотя-бы оставить содержимое в отдельном окне для последующего анализа или сравнения. Таким-же образом можно проверить содержание структуры отбора и, далее по коду процедуры, проверить, какие строки были отобраны – именно по отобранным строкам определяется первое или второе событие наступило в этом движении документа.

В моем случае выяснилось, что оплата, прошедшая первым событием была проведена в разрезе заказа, а поступление товара проходило с учетом по договору в целом. Кто и как это смог сделать, будем выяснять, а тут я просто хотел показать, как несколько простых функций – быстрый переход по программному коду по имени процедуры, просмотр значений переменных со “сложной” структурой при отладке: таблицы, структуры или массивы; облегчают работу программиста при поиске причин событий в программе.