Скорая Компьютерная Помощь г. Калуга

Полный спектр компьютерных услуг!

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

> Внимание!

  • Вся информация, расположенная в данном и других разделах форума получена из открытых источников (интернет-ресурсы, средства массовой информации, печатные издания и т.п.) и/или добавлена самими пользователями. Администрация форума предоставляет его участникам площадку для общения / размещения файлов / статей и т.п. и не несет ответственности за содержание сообщений, а также за возможное нарушение авторских, смежных и каких-либо иных прав, которое может повлечь за собой информация, содержащаяся в сообщениях.
Ремонт компьютеров в калуге Рекламное место сдается
 
Ответить в эту темуОткрыть новую тему
> 1C 7.7. Объект регистры. Ошибка при наложении фильтров.
Decker
сообщение 15.1.2012, 0:03
Сообщение #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. Т.к. точь в точь похожая ситуация присуствует в модуле проведения документа книга продаж в ТиС и в результате иногда получаем неправильную установку фильтра - то проблема достаточно серьезная. Т.к. некоторые продажи не попадают в книгу продаж.

Ссылки на эту тему на специализированных форумах:


--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Decker
сообщение 15.1.2012, 20:05
Сообщение #2


Администратор
*****

Группа: Главные администраторы
Сообщений: 14349
Регистрация: 12.10.2007
Из: Twilight Zone
Пользователь №: 1



А вот и объяснение, спасибо Ёпрст4 с mista.ru:
Цитата
В первом случае итоги на начало даты, во втором случае - на конец даты. И нет там никакого "феномена".

Цитата
область видимости имен проходил в школе ?
В первом случае, регистры расчитаны на начало даты ТА.. во втором случае, на конец, ибо переменной уже нет - раз её нет, нет и рассчитаных итогов, они тупо берутся актуальные итоги и привет.
Во втором случае - переменная глобльная, есть рассчитанные итоги на начало даты (в твоём случае - даты ТА)..всё собственно.

Я то проходил wink.gif Т.е. я понимаю что при выходе из процедуры переменной уже нет, вот только про "раз её нет, нет и рассчитаных итогов, они тупо берутся актуальные итоги" я не додумался сам. Т.е. мне было непонятно что берется, когда переменной уже нет. А вот программисты из 1С видимо не проходили про область видимости ... ибо в модуле проведения документа КнигаПродаж (формирование книги продаж) в типовой ТиС в процедуре ПроведениеПоРегистрам() именно так и прописано:
Код
Процедура ПроведениеПоРегистрам()
    
    Перем ВремРегистры, ВремКнигаПродаж;
    
    // Удаление движений по регистрам.

    Для Номер = 1 По Метаданные.Регистр() Цикл
        ОчиститьДвижения("Регистр."+Метаданные.Регистр(Номер).Идентификатор);
    КонецЦикла;

    ВремРегистры = СоздатьОбъект("Регистры");
    ВремКнигаПродаж = ВремРегистры.КнигаПродаж;
    
    // при необходимости делаем временный расчет итогов

    Если ИтогиАктуальны() = 0 Тогда
        ВремКнигаПродаж.ВременныйРасчет();
        ВремРегистры.Актуальность(1);
        ВремРегистры.РассчитатьРегистрыНа(ТекущийДокумент());
    КонецЕсли;
    
    // 939 -> 927 (особенности учета НДС в 2006)

    Если (Фирма.ЮрЛицо.МетодОпределенияВыручки.Получить(ДатаДок) =
         Перечисление.МетодыОпределенияВыручки.ПоОплате) И (ДатаДок < глНачало2006Года)
    Тогда
         ПроведениеПоОплате(ВремКнигаПродаж);    
    Иначе    
         ПроведениеПоОтгрузке(ВремКнигаПродаж);    
         ПроведениеПоОплате(ВремКнигаПродаж);    
    КонецЕсли;
                                                    
    ПроведениеПоСторноАвансов(ВремКнигаПродаж); // а это надо в любом случае

    
КонецПроцедуры

При вызове ПроведениеПоОтгрузке(ВремКнигаПродаж) внутри нее устанавливаются фильтры по измерениям КредДокумент и ВидДолга, так вот внутри ПроведениеПоОтгрузке итоги уже не те, что до ее вызова. В результате часть продаж в книгу продаж не попадает.



--------------------

Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

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

 

Рекламное место сдается Рекламное место сдается
Текстовая версия Сейчас: 24.6.2025, 8:26
Рейтинг@Mail.ru
Яндекс.Метрика Яндекс цитирования