Кречетов Максим

9
Рейтинг

piloturs
Максим Кречетов



  •   Регистрация: 03.02.2013 (11 лет назад)

  •   Был(а) на сайте: 06.01.2022

Подписчики 1

Рейтинг 9

1Cv77. Исправление поведения множественного фильтра (МФ) типовых отчетов в части сохранения/восстановления настроек.

Инструменты и обработки Программист Платформа 1С v7.7 Конфигурации 1cv7 Россия Windows Абонемент ($m) Внешний отчет (ert,erf) Адаптация типовых решений

В большинстве российских типовых конфигураций для 1Сv7.7 (ТиС, ПУБ, Комплекс и др.) в отчетах используется множественный фильтр (МФ). Впервые он появился, более 10 лет назад, еще в ТиС 8.7, придя на смену МФ ТиС 8.6. С тех пор, аж до сего дня (24.03.2013) типовой механизм МФ содержит глюк связанный с восстановлением сохраненных настроек, хотя разработчики поют нам об обратном.

1 стартмани

26.03.2013    16809    7    piloturs    8       

9

Комментарии

Devстроки с ОДИНАКОВЫМИ номерами#33 17.12.13 22:46
(28) pisarevEV, я у себя просто удалил вышеприведенный код, и с тех пор этого глюка нет
если, же Вам расчет регистров важен, то попробуйте делать перерасчет регистров в процедуре ПриПовторномОткрытии()
Devстроки с ОДИНАКОВЫМИ номерами#32 17.12.13 22:41
(28)
Цитата
глюк встречается только в одной, причем только в одном виде документов и уже не первый раз

если конфигурации этих баз идентичны, то просто пользователи других баз не обращают внимания на этот глюк.
Только кладовщики, у которых накладная на сотни позиций, и в которой печенюшки абы-как перемешаны с мороженой рыбой и колбасой могут быть недовольны. А если в накладной десяток позиций, то можно и забить. Тем более, что глюк моделируется не так часто: у нас, когда был еще в доке, приведенный в (31) код, где-то 1 раз на 200 доков. Это те случаи, на которые обращали внимание.
Devстроки с ОДИНАКОВЫМИ номерами#31 17.12.13 21:54
(22)
Торговля+Склад, ред. 9.39. Документ - Реализация.
Текстовые реквизиты на форме смотреть на скриншоте.
Код модуля формы документа:

Перем мОстаткиТоваров, мОбщийРег; // для получения остатков
//******************************************************************************
Процедура ПересчетРегистров()
мОбщийРег = СоздатьОбъект("Регистры");
мОстаткиТоваров = мОбщийРег.ОстаткиТМЦ;
Если Выбран() = 0 Тогда
// Новый документ
Если ДатаДок < ПолучитьДатуТА() Тогда
// выписываемый задним числом
мОстаткиТоваров.ВременныйРасчет();
мОбщийРег.РассчитатьРегистрыПо(ДатаДок);
КонецЕсли;
ИначеЕсли ДатаДок < ТекущийДокумент().ДатаДок Тогда
// Поменяли дату документа.
Если ДатаДок < ПолучитьДатуТА() Тогда
// выписываемый задним числом
мОстаткиТоваров.ВременныйРасчет();
мОбщийРег.РассчитатьРегистрыПо(ДатаДок);
КонецЕсли;
ИначеЕсли СравнитьТА() < 1 Тогда
//Позиция не больше ТА.
мОстаткиТоваров.ВременныйРасчет();
мОбщийРег.РассчитатьРегистрыНа(ТекущийДокумент());
КонецЕсли;

КонецПроцедуры // ПересчетРегистров()

//******************************************************************************
Функция ОстатокПоСкладу(пОстТоваров)
_Результат = "";
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Возврат _Результат;
КонецЕсли;
_ОстатокТовараСкл = пОстТоваров.СводныйОстаток(Фирма, Номенклатура, Склад, , "Количество");
Если Коэффициент <> 1 Тогда // пересчитаем остаток в единицы документа
_ОстатокТовараСкл = ?(Коэффициент = 0, 0, _ОстатокТовараСкл / Коэффициент);
КонецЕсли;
Если _ОстатокТовараСкл < 0 Тогда
Форма.ТекстОстНаСкладе.Цвет(255);
Иначе
Форма.ТекстОстНаСкладе.Цвет(0,0,128);
КонецЕсли;
_Результат = СокрЛП(Формат(_ОстатокТовараСкл,"Ч-17.3")) + " " + Единица;
Возврат _Результат;

КонецФункции // ОстатокПоСкладу()

//******************************************************************************
Функция ОстатокПоФирме(пОстТоваров)
_Результат="";
Если ПустоеЗначение(Номенклатура) = 1 Тогда
Возврат _Результат;
КонецЕсли;
_ОстатокТовараФир = пОстТоваров.СводныйОстаток(Фирма, Номенклатура, , , "Количество");
Если Коэффициент <> 1 Тогда // пересчитаем остаток в единицы документа
_ОстатокТовараФир = ?(Коэффициент = 0, 0, _ОстатокТовараФир / Коэффициент);
КонецЕсли;
Если _ОстатокТовараФир < 0 Тогда
Форма.ТекстОстНаФирме.Цвет(255);
Иначе
Форма.ТекстОстНаФирме.Цвет(0,0,128);
КонецЕсли;
_Результат = СокрЛП(Формат(_ОстатокТовараФир,"Ч-17.3")) + " " + Единица;
Возврат _Результат;

КонецФункции // ОстатокПоФирме()

//******************************************************************************
Процедура ПриОткрытии()

........

ПересчетРегистров();

КонецПроцедуры // ПриОткрытии()

Прикрепленные файлы:

scrin.gif
Devстроки с ОДИНАКОВЫМИ номерами#30 17.12.13 21:26
(28) pisarevEV, Вы пробовали воспроизвести глюк, следуя шагам в (18), или просто посчитали "ситуацию, описанную в (17) как минимум "странной""?
Devстроки с ОДИНАКОВЫМИ номерами#26 16.12.13 18:51
надеюсь, что короткие сообщения доходят до тебя лучше. чем длинные
Devстроки с ОДИНАКОВЫМИ номерами#24 16.12.13 18:49
и вообще, мне не нравится твой высокомерный тон.
будь проще, и люди потянутся к тебе
Devстроки с ОДИНАКОВЫМИ номерами#23 16.12.13 18:47
(19) Ёпрст, ты видал в живую описанное топикстартером?
если не видал, то какое отношение твои посты имеют к этой теме?
Devстроки с ОДИНАКОВЫМИ номерами#18 16.12.13 18:27
(17) осмелюсь предположить, что Ваш документ относится к оперативному учету, и двигает регистры.
В модуле формы дока, есть модульные переменные "ОбщРег", "РегОтданные"
У меня пресчет регистров схож с Вашим (только я апеллирую к регистру ОстаткиТМЦ). У меня пресчет регистров оформлен отдельной процедурой и запускается в предопределенной процедуре ПриОткрытии(), а также в процедуре ПриИзмененииДаты(). Смею предположить, что у Вас, что-то подобное.

Давайте поразмыслим, какие состояния пройдет этот документ, прежде чем будет записан в базу и закрыт.

Т.е. открыта форма нового документа -> ПриОткрытии() -> ПересчетРегистров()
Добавляем штук 50 номенклатурных позиций и просто записываем документ.
Дальше, предположим, мы получаем задание выписать еще один такой же "быстрый" документ, на 1-2 строки. Мы не закрывая форму предыдущего записанного документа, создаем новый док, набиваем эти 2 номенклатурные позиции, проводим, распечатываем и закрываем второй док.
Что мы имеем - наш первый записанный док оказывается отодвинут за ТА.
Мы, не задумываясь над этим, переключаемся на первый док и продолжаем с ним работать дальше. Н-р добавляем еще несколько номенклатурных позиций, сортируем (обязательно!!!), проводим, внимательно просматриваем табличную часть ища глюки описанные Вами в (1), удостоверившись, что глюков нет, со спокойной совестью распечатываем и закрываем документ. Отдаем бумажные накладные на склад, и с чувством хорошо проделанной работы наслаждаемся кофе.
Но через несколько секунд/минут/часов, наш кайф обрывает возмущенный кладовщик, обзывая нас всякими нехорошими словами. В его накладной-простыне на > 50 наименований, последние отсортированы, так, как будто Вы специально корпели над тем, чтобы усложнить его и без того тяжелую (его имхо) жизнь.
Вы в недоумении берете бумажную накладную. Глядя на отсортированные абы-как данные, Вы вспоминаете, что четко проверили форму документа перед распечаткой и все было отсортировано нормально.
Момент истины: Вы открываете этот электронный документ и наблюдаете в ТЧ туже картину, что и в бумажной накладной. Помимо сбившейся сортировки, идет задвоение нумерации строк.

Резюме: тяжело сказать, почему это происходит (нужно наверно копаться в кишках одноэсины). Но если мы проводим ЗАПИСАННЫЙ документ (записанный до ТА и датированный рабочим днем) - срабатывает:
Если ( Проведен() = 0 ) Тогда
ПроводитьПослеТА(1,1);
КонецЕсли;
И именно в этот момент (при перемещении документа по шкале ТА) происходит все Выше описанное.
При этом ВАЖНО: изменения уже зафиксированы в БД, но форма не обновилась и нам визуально глюк не виден.

зы: уфф, запарился писать
Devстроки с ОДИНАКОВЫМИ номерами#16 15.12.13 22:50
(15) у меня просто такая же петрушка. Я сам запихнул временный расчет регистров в форму, для красивого вывода остатков ТМЦ. И после этого начал наступать на описанные Вами грабли. Только Вы скорее всего не заметили, что кроме задвоения нумерации, есть еще глюк с сортировкой строк.

Насчет переиндексации БД - это устранение следствий, а не причины.
Чтобы устранить причину, нужно исправить (или удалить нафиг) код временного расчета регистров.
если выложите кусок кода из модуля формы, где происходит временный расчет регистров, я Вам объясню конкретно на примере, почему так происходит.
Devстроки с ОДИНАКОВЫМИ номерами#12 08.12.13 3:21
(1) случайно, в модуле формы проблемных видов документов, не происходит ли временный расчет регистров?