Имя: Пароль:
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) Да наверное и не должна. Просто объект вроде как "не меняли" и я возникновения модифицированности не ожидала... В общем-то это от незнания поведения системы конечно.

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