![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Сообщение
#1
|
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 ![]() |
Вообщем столкнулся с этой ситуацией, когда разбирался почему у клиентов часть счет-фактур не попадает в Книгу продаж в Торговля и Склад 7.7. Выяснилось что есть некая ошибка при наложении фильтров. В модуле проведения регламентного документа КнигаПродаж (формирование книги продаж) есть процедура проведение по регистрам, в которой определены локальные переменные ВремРегистры и ВремКнигаПродаж. ВремКнига продаж может участвовать во временном расчете и передаваться в качестве параметра в процедуры, например, в ПроведениеПоОтгрузке ... внутри которых устанавливается значение фильтра. Так вот именно эта установка и работает некорректно (!), при наличии записей в итогах и установленном значении фильтра при определенных условиях, запись которая подпадает под фильтр может не выбраться. Удалось локализовать проблему. Объясню на простом примере:
Создадим новую внешнюю обработку. Добавим на форму ТЗ, кнопку УбратьФильтр, которая вызывает соответствующую процедуру и текст с формулой ТЗ.КоличествоСтрок(), также добавим кнопку Сформировать, которая будет вызывать соответсвующую процедуру. В модуле пропишем: Код Перем ГлВремКнигаПродаж; Процедура УбратьФильтр() ГлВремКнигаПродаж.УстановитьЗначениеФильтра("КредДокумент",,0); ГлВремКнигаПродаж.УстановитьЗначениеФильтра("ВидДолга",,0); ГлВремКнигаПродаж.ВыгрузитьИтоги(ТЗ,1,1); КонецПроцедуры //******************************************* Процедура Сформировать() Перем ВремРегистры; // из ПроведениеПоРегистрам() модуля документа КнигаПродаж ВремРегистры = СоздатьОбъект("Регистры"); ГлВремКнигаПродаж = ВремРегистры.КнигаПродаж; ГлВремКнигаПродаж.ВременныйРасчет(); ВремРегистры.РассчитатьРегистрыНа(ПолучитьДатуТА()); ГлВремКнигаПродаж.ВыгрузитьИтоги(ТЗ,1,1); // ПроведениеПоОтгрузке(ГлВремКнигаПродаж); КонецПроцедуры На то что здесь временный расчет выполняется на ТА (что создает лишний пересчет регистров и т.д. и т.п.) - не обращаем внимания, это просто для примера, чтобы временный расчет все-таки выполнился (для эмуляции реальных условий так сказать). Теперь запускаем обработку и жмем Сформировать. ТЗ заполняется итогами регистра КнигаПродаж. Количество строк в моем случае получилось - 35864 (!) Заметим, что никаких фильтров не наложено (!) Теперь жмем кнопку УбратьФильтр ... Как мы видим по процедуре, происходит снятие значений фильтра по измерениям КредДокумент и ВидДолга, затем расчитанные итоги (а расчет не менялся) вновь выгружаются в ТЗ. И ба ... что мы видим ... ТЗ.КоличествоСтрок() = 36135 ... Почему? Модуль обработки для теста можно скачать тут: http://rghost.ru/35909281 Как исправить проблему - я понял. Если немного изменить код, и перенести определение переменной ВремРегистры из процедуры Сформировать() в начало модуля, т.е. получив код: Код Перем ВремРегистры; Перем ГлВремКнигаПродаж; Процедура УбратьФильтр() ГлВремКнигаПродаж.УстановитьЗначениеФильтра("КредДокумент",,0); ГлВремКнигаПродаж.УстановитьЗначениеФильтра("ВидДолга",,0); ГлВремКнигаПродаж.ВыгрузитьИтоги(ТЗ,1,1); КонецПроцедуры //******************************************* Процедура Сформировать() // из ПроведениеПоРегистрам() модуля документа КнигаПродаж ВремРегистры = СоздатьОбъект("Регистры"); ГлВремКнигаПродаж = ВремРегистры.КнигаПродаж; ГлВремКнигаПродаж.ВременныйРасчет(); ВремРегистры.РассчитатьРегистрыНа(ПолучитьДатуТА()); ГлВремКнигаПродаж.ВыгрузитьИтоги(ТЗ,1,1); // ПроведениеПоОтгрузке(ГлВремКнигаПродаж); КонецПроцедуры То все работает корректно. Т.е. после снятия фильтра по УбратьФильтр() количество строк в ТЗ ровно такое же что и при первой выгрузке итогов. Кто-нибудь может объяснить этот "феномен"? p.s. Т.к. точь в точь похожая ситуация присуствует в модуле проведения документа книга продаж в ТиС и в результате иногда получаем неправильную установку фильтра - то проблема достаточно серьезная. Т.к. некоторые продажи не попадают в книгу продаж. Ссылки на эту тему на специализированных форумах: -------------------- |
|
|
![]()
Сообщение
#2
|
|
![]() Администратор ![]() ![]() ![]() ![]() ![]() Группа: Главные администраторы Сообщений: 14349 Регистрация: 12.10.2007 Из: Twilight Zone Пользователь №: 1 ![]() |
А вот и объяснение, спасибо Ёпрст4 с mista.ru:
Цитата В первом случае итоги на начало даты, во втором случае - на конец даты. И нет там никакого "феномена". Цитата область видимости имен проходил в школе ? В первом случае, регистры расчитаны на начало даты ТА.. во втором случае, на конец, ибо переменной уже нет - раз её нет, нет и рассчитаных итогов, они тупо берутся актуальные итоги и привет. Во втором случае - переменная глобльная, есть рассчитанные итоги на начало даты (в твоём случае - даты ТА)..всё собственно. Я то проходил ![]() Код Процедура ПроведениеПоРегистрам() Перем ВремРегистры, ВремКнигаПродаж; // Удаление движений по регистрам. Для Номер = 1 По Метаданные.Регистр() Цикл ОчиститьДвижения("Регистр."+Метаданные.Регистр(Номер).Идентификатор); КонецЦикла; ВремРегистры = СоздатьОбъект("Регистры"); ВремКнигаПродаж = ВремРегистры.КнигаПродаж; // при необходимости делаем временный расчет итогов Если ИтогиАктуальны() = 0 Тогда ВремКнигаПродаж.ВременныйРасчет(); ВремРегистры.Актуальность(1); ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент()); КонецЕсли; // 939 -> 927 (особенности учета НДС в 2006) Если (Фирма.ЮрЛицо.МетодОпределенияВыручки.Получить(ДатаДок) = Перечисление.МетодыОпределенияВыручки.ПоОплате) И (ДатаДок < глНачало2006Года) Тогда ПроведениеПоОплате(ВремКнигаПродаж); Иначе ПроведениеПоОтгрузке(ВремКнигаПродаж); ПроведениеПоОплате(ВремКнигаПродаж); КонецЕсли; ПроведениеПоСторноАвансов(ВремКнигаПродаж); // а это надо в любом случае КонецПроцедуры При вызове ПроведениеПоОтгрузке(ВремКнигаПродаж) внутри нее устанавливаются фильтры по измерениям КредДокумент и ВидДолга, так вот внутри ПроведениеПоОтгрузке итоги уже не те, что до ее вызова. В результате часть продаж в книгу продаж не попадает. -------------------- |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 24.6.2025, 8:26 | |
|