Имя: Пароль:
1C
1С v8
Модифицированность у объекта при открытии
0 Rendalina
 
22.01.15
14:06
Понадобилось добавить печатную форму в типовой справочник "Договоры контрагентов" (конфигурация на основе УПП 1.3.58)

Сделала внешнюю печатную форму, добавила код, чтобы кнопки печати появились на форме элемента справочника "Договоры контрагентов".
В принципе печатная форма формируется, но перед этим спрашивает "Объект изменен. Для печати его необходимо записать. Записать?"

Код печати типовой, проверка на модифицированность тоже типовая из общих модулей типа "Работа с диалогами". Хочется ими воспользоваться без изменений.


В модуле формы элемента справочника "Договоры контрагентов" в процедуре "Перед открытием" есть такой типовой код:


Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)

    ЗаполнитьСписокВыбораВидаДоговора();
    ЗаполнитьСписокВыбораВедениеВзаиморасчетов();
    
    ЭлементыФормы.ВидДоговора.Значение = ВидДоговора;            // вот здесь ЭтотОбъект.Модифицированность() становится ИСТИНА
    ЭлементыФормы.ВедениеВзаиморасчетов.Значение = ВедениеВзаиморасчетов;

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

Т.е. после того, как отработает процедура "ПередОткрытием", 1С уже считает, что объект модифицировался.

При этом сообщение об измененном объекте выходит когда нажимаешь на кнопку "Печать по умолчанию", т.е. которая с названием печатной формы.
А если нажать на кнопку "Печать", то выведется список форм, и при выборе той же формы она без всяких ругачек прекрасно формируется, так как там проверка идет на модифицированность формы, а не объекта.

Вот теперь сообразить не могу, как сформировать внешнюю печатную форму с минимальными изменениями типового кода?
1 aka AMIGO
 
22.01.15
14:11
КО - не трогать элементы формы документа/элемента справочника и т.д.
2 Адский плющ
 
22.01.15
14:17
ЭлементыФормы.ВидДоговора.Значение = ВидДоговора;

Глубоко.
3 Fish
 
22.01.15
14:18
(0) А у поля ВидДоговора в свойствах стоит галочка "ИзменяетДанные"? В типовой не стоит.
4 Rendalina
 
22.01.15
14:20
(1) А я их не трогаю, они трогаются типовым кодом УПП в процедуре "Перед открытием"

(3) Нет, не стоит, это проверила уже
5 Fish
 
22.01.15
14:22
(4) Значит, модифицированность возникает не в ЭлементыФормы.ВидДоговора.Значение = ВидДоговора;, а раньше.
6 Rendalina
 
22.01.15
14:42
(5) Раньше (на предыдущей строчке) она Ложь, а после Истина, я не знаю, где оно ещё может меняться...

Вообще галочка "Изменяет данные" видимо для других целей нужна:

"Изменяет данные — если свойство установлено, то элемент управления непосредственно не связан с данными, но косвенно изменяет их.

Самый простой пример - кнопка, по которой что-то вычисляется и на основании этого программно меняются данные объекта, отображаемого в форме. Например, вычислить цену исходя из текущих остатков, планируемых поступлений, расходов, динамики продаж и пр.

Более сложный пример - поле ввода, в котором выбираются данные, не связанные с самим объектом, например, настроение начальника. Если настроение хорошее, программно устанавливается одна цена, если настроение плохое -  другая цена.

Фактически установка этого свойства приводит к тому, что будет "взведена" модифицированность формы и пользователь, просто закрыв окно (отказавшись от редактирования формы), не сможет потерять данные, измененные программно. Система известит его о том, что данные были изменены и предложит записать их или отказаться от записи. Ведь пользователь может и не знать о том, что в результате его действий данные объекта поменялись... "
7 Fish
 
22.01.15
14:49
(6) "Раньше (на предыдущей строчке) она Ложь, а после Истина" - значит, изменение происходит в процедуре ЗаполнитьСписокВыбораВедениеВзаиморасчетов();
8 Rendalina
 
22.01.15
15:51
(7)   Нет, после выполнения процедуры ЗаполнитьСписокВыбораВедениеВзаиморасчетов() Модифицированность объекта Ложь,

а вот после
ЭлементыФормы.ВидДоговора.Значение = ВидДоговора;
Истина.

Да и вообще, в этой процедуре просто список выбора формируется, т.е. значения реквизитов формы и объекта не меняются, а  просто появляется содержимое выпадающей менюшки.
А вот в "подозреваемой" строке меняется Значение элемента формы, связанной с объектом. В принципе, логично, что там появляется модифицированность объекта. Модифицированность формы при этом так же появляется, но она уходит между процедурами "Перед открытием" и "При открытии", а модифицированность объекта - не уходит.

Процедура ЗаполнитьСписокВыбораВедениеВзаиморасчетов()
    
    СписокВыбора = Новый СписокЗначений;
    СписокВыбора.Вставить(0, Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоДоговоруВЦелом);
    СписокВыбора.Вставить(1, Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоЗаказам);
    СписокВыбора.Вставить(2, Перечисления.ВедениеВзаиморасчетовПоДоговорам.ПоСчетам);
    
    РаботаСДиалогами.УстановитьСписокПоляВыбора(ЭлементыФормы.ВедениеВзаиморасчетов, СписокВыбора);
    
КонецПроцедуры
9 Defender aka LINN
 
22.01.15
16:00
"а модифицированность объекта - не уходит" - а должна? Особенно с учетом того, что это метод, а не свойство
10 Rendalina
 
22.01.15
16:17
(9) Да наверное и не должна. Просто объект вроде как "не меняли" и я возникновения модифицированности не ожидала... В общем-то это от незнания поведения системы конечно.

Наверное проще всё-таки свою процедуру печати внешней формы на основе типовой добавить, где бы проверялась  модифицированность формы.
Закон Брукера: Даже маленькая практика стоит большой теории.