Вход | Регистрация



не работает ЭтаФорма.Модифицированность.

не работает ЭтаФорма.Модифицированность.
Я
   andron81_81
 
09.11.18 - 13:58
всем добра.

У меня так устроено, что при открытии документа в него подтягивается данные из регистров сведений в табличные части (почему так сделано - отдельная тема). Тем самым документ как бы уже "редактировался" - это понятно.
Поэтому при закрытии документа даже если пользователем там ничего не изменялось система предлагает сохранить документ - высвечивая звездочку на форме. Поэтому я свойство ЭтаФорма.Модифицированность сбрасываю в ложь.
Но это не работает.

Процедура ПриОткрытии()
ОбновимПараметры();
ПрайсМатериалов    = Новый ТаблицаЗначений;
ЭтаФорма.Модифицированность=Ложь;
КонецПроцедуры



процедура ОбновимПараметры(); как раз и подтягивает из регистра сведений данные в таб. части. Я думал , что не важно что там в ней происходит, если в конце ЭтаФорма.Модифицированность=Ложь - должен быть выполнен сброс в ложь ; а не тут - то было. После этого события никакой код более не выполняется(проверял отладкой). а "звездочка" появляется это значит , что ЭтаФорма.Модифицированность каким-то образом обратилась в истину.
Проверял отладкой работу события ПриОткрытии(). на строке ЭтаФорма.Модифицированность=Ложь; присвоение происходит - вижу в табло. затем происходит завершение процедуры - форма документа. ВСЁ !!! на этой стадии ЭтаФорма.Модифицированность=истина;
пробовал чистить кэш, "тестирование и исправление" . ничего не помогает.
 
 
   Cyberhawk
 
1 - 09.11.18 - 13:59
Подключи однократный обработчик ожидания и ужк там сбрось модифицированность
   andron81_81
 
2 - 09.11.18 - 14:15
(1) костыль, но если ничего не выйдет, то придется.
может ещё версии будут ? ))
   Ns33
 
3 - 09.11.18 - 14:15
НовСтр=Услуги.Добавить();
Контрагент=Справочники.Контрагенты.ПустаяСсылка();
Модифицированность=ложь; 

Странно, добавил код в ПриОткрытии(), визуально видно что он отработал, но документ закрывается без вопросов. Возможно где-то модифицируется позже, ПриВыводеСтроки(), например.
   Ns33
 
4 - 09.11.18 - 14:18
А если закоментить ОбновимПараметры() ? Дело точно в них? Там никакой обработчик ожидания не подключается?
   andron81_81
 
5 - 09.11.18 - 14:19
(3) да в пустой базе у меня тоже работает ! при выводе строки есть, конечно,  но почему я по кнопке Ф11 туда не проваливаюсь
после выполнения строки
ЭтаФорма.Модифицированность=Ложь; 

из моего события приОткрытии() .
   Kigo_Kigo
 
6 - 09.11.18 - 14:20
А так
Форма.Модифицированность=Ложь;
   andron81_81
 
7 - 09.11.18 - 14:21
(4) комментил уже . да в этом случае работает. но странность в том , что чтобы там не делалось - какая разница. за ней ведь идет ЭтаФорма.Модифицированность=Ложь;
   andron81_81
 
8 - 09.11.18 - 14:24
(6) а "Форма" это что ? моя конфига не знает такую
   Cyberhawk
 
9 - 09.11.18 - 14:24
(8) Он брешет, не слушай его
   Cyberhawk
 
10 - 09.11.18 - 14:25
Какой релиз платформы?
 
 Рекламное место пустует
   Cyberhawk
 
11 - 09.11.18 - 14:25
В порядке бреда: "ЭтаФорма" заменить на "ЭтотОбъект"
   andron81_81
 
12 - 09.11.18 - 14:28
(11) в ЭтотОбъект там модифицируемость не свойство , а метод-функция. только на чтение.
   andron81_81
 
13 - 09.11.18 - 14:28
(10) 1С:Предприятие 8.3 (8.3.10.2667)
   Kigo_Kigo
 
14 - 09.11.18 - 14:29
(8) С клюшками попутал
   Ns33
 
15 - 09.11.18 - 14:30
Значит ОбновимПараметры() какой-то обработчик добавляет.
Коментить по частям код этой функции пока не найдешь нужное место.
   Cyberhawk
 
16 - 09.11.18 - 14:30
(12) Не в коня корм, ясно
   andron81_81
 
17 - 09.11.18 - 14:38
(15) я находил уже ту часть таким образом как рекомендуешь .
Распишу процедуры
Процедура ОбновимПараметры()
        СейчасСтраница=0;
    ЗаполнитьТаблицуПараметровЗаказа();
    ЗаполнитьТаблицуПараметровДетали(false,); 
КонецПроцедуры

если закомментить ЗаполнитьТаблицуПараметровЗаказа(); , то работает . То есть суть в ней (что странно).
Таким образом :
ЗаполнитьТаблицуПараметровЗаказа(); - виновата
ЗаполнитьТаблицуПараметровДетали(false,); - проходит успешно.

теперь привожу их :


Процедура ЗаполнитьТаблицуПараметровЗаказа()
        Объект = ЭтаФорма.ДокументОбъект;

Реквизиты = Новый Запрос(
        "Выбрать  Различные
            | ОТ.ПометкаУдаления,СВР.ТипРеквизита , СВР.Ссылка Реквизит, знРекв.Значение, СВР.Код ,
            | NULL как Отображать 
            | из 
         | Справочник.БЗ_СвойстваРеквизитов СВР
        |    левое соединение Справочник.БЗ_ОтображениеИПоследовательностьРеквизитов.РеквизитыЗаказа РЗ ПО СВР.Ссылка=РЗ.Реквизит
        |    левое соединение Справочник.БЗ_ОтображениеИПоследовательностьРеквизитов.СоставРеквизитовНаПараметрах СРНП ПО СВР.Ссылка=СРНП.Реквизит
        |    Левое соединение Справочник.БЗ_ОтображениеИПоследовательностьРеквизитов ОТ  ПО ОТ.Ссылка=РЗ.Ссылка или СРНП.Ссылка=ОТ.Ссылка
        |   Левое соединение РегистрСведений.БЗ_ЗначенияРеквизитов знРекв ПО знРекв.Заказ=&заказ и знРекв.Реквизит=СВР.Ссылка и знРекв.Объект=-1
        |    где 
        |   ОТ.ПометкаУдаления=&пометканаудаление и СВР.ПометкаУдаления=&пометканаудаление 
        |    и
        |  (РЗ.Отображать = &отображать или СРНП.Отображать=&отображать или  (Не (знРекв.Значение ЕСТЬ NULL )))"    );
    Реквизиты.УстановитьПараметр("заказ",                  Объект.Ссылка); 
    Реквизиты.УстановитьПараметр("отображать",         истина); 
    Реквизиты.УстановитьПараметр("пометканаудаление",     Ложь); 
    Реквизиты.УстановитьПараметр("пренадл",             "з"); 
    РеквизитыЗаказа.Очистить();
    РезультатЗапроса = Реквизиты.Выполнить(); 
              Выборка = РезультатЗапроса.Выбрать();             
        
            Пока Выборка.Следующий() Цикл
                СтрокаПараметров = Объект.РеквизитыЗаказа.Добавить();
                СтрокаПараметров.Реквизит = Выборка.Реквизит;
                СтрокаПараметров.Значение = Выборка.Значение;
                СтрокаПараметров.Код  = Выборка.Код;
                 СтрокаПараметров.ТипПоля = Выборка.ТипРеквизита;                
            КонецЦикла;



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



Процедура ЗаполнитьТаблицуПараметровДетали(НоваяДеталь, номердетали)
    Объект = ЭтаФорма.ДокументОбъект;
    Если НоваяДеталь тогда//Если деталь новая (нажата кнопка добавить деталь) , то добавляем один комплект реквизитов для этой новой детали

        
        
Реквизиты = Новый Запрос(
        "Выбрать Различные  СВР.ТипРеквизита , СВР.Ссылка Реквизит, NULL как Значение, СВР.Код  из
         | Справочник.БЗ_СвойстваРеквизитов СВР
         | левое соединение Справочник.БЗ_ОтображениеИПоследовательностьРеквизитов.РеквизитыДетали РЗ ПО СВР.Ссылка=РЗ.Реквизит
         | Левое соединение Справочник.БЗ_ОтображениеИПоследовательностьРеквизитов ОТ  ПО ОТ.Ссылка=РЗ.Ссылка
         | где СВР.ОтдельноеЗначениеДляОбъекта=Истина и
         | СВР.Пренадлежность=&пренадл И СВР.ОтдельноеЗначениеДляОбъекта=Истина И ((ОТ.ПометкаУдаления=&пометканаудаление и СВР.ПометкаУдаления=&пометканаудаление и РЗ.Отображать = &отображать))");
    //Реквизиты.УстановитьПараметр("заказ",                  Объект.Ссылка); 

    Реквизиты.УстановитьПараметр("пометканаудаление",     False); 
    Реквизиты.УстановитьПараметр("пренадл",             "д"); 
    Реквизиты.УстановитьПараметр("отображать",             истина); 

    РезультатЗапроса = Реквизиты.Выполнить();
              Выборка = РезультатЗапроса.Выбрать();             
            Пока Выборка.Следующий() Цикл
                СтрокаПараметров = Объект.РеквизитыДетали.Добавить();
                СтрокаПараметров.Реквизит = Выборка.Реквизит;
                  СтрокаПараметров.БылоИзменение=Ложь;
                СтрокаПараметров.ТипПоля = Выборка.ТипРеквизита;
                СтрокаПараметров.НомерДетали = номердетали;
                СтрокаПараметров.Код = Выборка.Код;
            

            

            КонецЦикла;
        
        
        
        
    Иначе                        //Если деталь не новая (это происходит при запуске заказа) значит выдадим по всем листам

    Объект.РеквизитыДетали.Очистить();
    
    Для  Каждого Деталь из Объект.Детали  цикл 
    //Пока Деталь из Объект.Детали  цикл

        Реквизиты = Новый Запрос(
        "Выбрать Различные  СВР.ТипРеквизита , СВР.Ссылка Реквизит, знРекв.Значение Значение, СВР.Код из         
         | Справочник.БЗ_СвойстваРеквизитов СВР
         | левое соединение Справочник.БЗ_ОтображениеИПоследовательностьРеквизитов.РеквизитыДетали РЗ ПО СВР.Ссылка=РЗ.Реквизит
         | Левое соединение Справочник.БЗ_ОтображениеИПоследовательностьРеквизитов ОТ  ПО ОТ.Ссылка=РЗ.Ссылка
         |  Левое соединение РегистрСведений.БЗ_ЗначенияРеквизитов знРекв ПО знРекв.Заказ=&заказ и знРекв.Реквизит=СВР.Ссылка и знРекв.Объект=&коддетали
         | где СВР.ОтдельноеЗначениеДляОбъекта=Истина И 
         | СВР.Пренадлежность=&пренадл И СВР.ОтдельноеЗначениеДляОбъекта=Истина И ((ОТ.ПометкаУдаления=&пометканаудаление и СВР.ПометкаУдаления=&пометканаудаление и РЗ.Отображать = &отображать) или  (Не (знРекв.Значение ЕСТЬ NULL )))"    );
         
    Реквизиты.УстановитьПараметр("заказ",                  Объект.Ссылка); 
    Реквизиты.УстановитьПараметр("коддетали", Деталь.ИДДетали); 
    Реквизиты.УстановитьПараметр("отображать", истина); 
    

    Реквизиты.УстановитьПараметр("пометканаудаление",     Ложь); 
    Реквизиты.УстановитьПараметр("пренадл",             "д"); 
    РезультатЗапроса = Реквизиты.Выполнить();
    //Сообщить(Реквизиты.Текст);

              Выборка = РезультатЗапроса.Выбрать();             
            //Сообщить(Выборка.Количество());     

            Пока Выборка.Следующий() Цикл
            СтрокаПараметров = Объект.РеквизитыДетали.Добавить();
                СтрокаПараметров.Реквизит = Выборка.Реквизит;
                СтрокаПараметров.Значение = Выборка.Значение;
                   СтрокаПараметров.БылоИзменение=Ложь;

                СтрокаПараметров.ТипПоля = Выборка.ТипРеквизита;
                СтрокаПараметров.НомерДетали = Деталь.ИДДетали;
                СтрокаПараметров.Код = Выборка.Код;
              // СтрокаПараметров.ОтдельноеЗначениеДляОбъекта = Выборка.ОтдельноеЗначениеДляОбъекта;

                
            КонецЦикла;
            
            
            КонецЦикла;    
    КонецЕсли;//конец блока деталь не новая новаядеталь=false

КонецПроцедуры
   andron81_81
 
18 - 09.11.18 - 14:44
то есть процедуры аналогичные . что одна , что вторая выполняют заполнения двух разных таб. частей.
после этих заполнений не делаю ничего кроме Форма.Модифицированность=Ложь; и это проверено отладчиком . хотя есть в одной из таб. частей событие ПриАктивизацииЯчейки, но туда при отладке не залезает ход выполнения.
Форма.Модифицированность=Ложь; должно отработоть. а ни фига (((
   Ns33
 
19 - 09.11.18 - 14:52
Та вроде норм, единственное что возможно может быть - это обработчик ПриВыводеСтроки() табл. части. РеквизитыЗаказа.
Получается если процедуру не вызвать (кстати, а что там содержится в сохраненном документе?), то обработчик не вызывается.

А что будет если РеквизитыЗаказа.Очистить(); добавить в самый конец процедуры, т.е. заполнили и сразу очистили?
   hhhh
 
20 - 09.11.18 - 14:56
(18) проверь при выводе строки, чего там. и другие похожие процедуры
   andron81_81
 
21 - 09.11.18 - 14:58
(20) почему события при выводе строки нету. Есть
ПриАктивизацииЯчейки , но как писал ранее отладчик туда не лезет.
   andron81_81
 
22 - 09.11.18 - 14:59
(21) перепишу : события при выводе строки нету. Есть
ПриАктивизацииЯчейки , но как писал ранее отладчик туда не лезет.
   Buster007
 
23 - 09.11.18 - 14:59
если предполагается, что данные не должны сохраняться, то использование такого подхода вообще не оправдано.
С учетом того, что это Объект.РеквизитыДетали.Добавить(); то это вообще полная №%;
   andron81_81
 
24 - 09.11.18 - 15:01
(23) почему ? у меня в документе в таб. частях данные не хранятся . и на это есть причины.
   andron81_81
 
25 - 09.11.18 - 15:01
они хранятся в регистрах сведений
   andron81_81
 
26 - 09.11.18 - 15:02
(23) какой подход вы предлагаете ?
   Buster007
 
27 - 09.11.18 - 15:03
(26) сделай набор записей
   andron81_81
 
28 - 09.11.18 - 15:04
(27) то есть ?
   Buster007
 
29 - 09.11.18 - 15:05
(26) еще можешь сделать реквизит формы, у которого снять галку "Сохраняемые данные"
   andron81_81
 
30 - 09.11.18 - 15:10
(19) будет всё такой же косяк.
   andron81_81
 
31 - 09.11.18 - 15:11
не, я все же не пойму. выходит Форма.Модифицированность=Ложь; работает с причудами ?
   andron81_81
 
32 - 09.11.18 - 15:13
(29) объясните чуть подробнее и про набор записей тоже
   Sayan_mi
 
33 - 09.11.18 - 15:22
А если в табличных частях не храните данные зачем в них вообще пишите, добавите реквизит формы таблица значений и отображайте его, вообще ничего не будет модифицироваться.
 
 
   andron81_81
 
34 - 09.11.18 - 15:24
(33) потому что я зелень . Но тоже репу чешу уже по этому поводу.
   andron81_81
 
35 - 09.11.18 - 15:24
(33) то есть на форме размещаем скажем табличное поле РеквизитыЗаказа и связываем его не с таб. частью документа , а с реквизитом формы. так ?

выходит форма перестанет вообще реагировать на какие-либо изменение в таб.поле формы. Верно я понял ?
   andron81_81
 
36 - 09.11.18 - 15:27
(33) тогда необходимо свой велосипед делать в виде глобальной переменной Модифицированность . и его сам я должен ставить в истину в событиях на изменении в таб. части . верно я понимаю ?
   Sayan_mi
 
37 - 09.11.18 - 15:28
(35) да.
   andron81_81
 
38 - 09.11.18 - 15:29
(37) спасибо. думаю это верно !
   Sayan_mi
 
39 - 09.11.18 - 15:29
(36) или ставить модифицированность в истину при редактировании этих полей.
   andron81_81
 
40 - 09.11.18 - 15:30
(39) ну да
   andron81_81
 
41 - 09.11.18 - 16:12
(33) а отбор строк можно осуществлять в таком случае ? пусть элемент формы это ЭлементФормыРеквизитыЗаказа. он связан с реквизитом формы РеквизитыЗаказа.
вот такое перестало прокатывать :

ЭлементыФормы.ЭлементФормыРеквизитыЗаказа.ОтборСтрок.Отображать.Использование=Истина;
ЭлементыФормы.ЭлементФормыРеквизитыЗаказа.ОтборСтрок.Отображать.ВидСравнения= ВидСравнения.Равно;
ЭлементыФормы.ЭлементФормыРеквизитыЗаказа.ОтборСтрок.Отображать.Значение= Истина;
   andron81_81
 
42 - 10.11.18 - 15:06
сделаю отдельную тему


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует