Имя: Пароль:
1C
 
не работает ЭтаФорма.Модифицированность.
0 andron81_81
 
09.11.18
13:58
всем добра.

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

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



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

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

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

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

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


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

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



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



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

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

            

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

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

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

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

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

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