В управляемой форме, которая имеет ключевой реквизит объект(документ, справочник и т.д.), по-умолчанию всегда присутствует кнопка типа "Записать и закрыть". Кнопка очень большая и нравится пользователям, поэтому они тыркают по ней когда нужно и когда не нужно. К сожалению, платформа даже не модифицированный объект записывает повторно, что иногда очень накладно. Можно ли как-нибудь повлиять на поведение платформы, чтобы при не модифицированном объекте она закрывала форму без записи? Придуманная программная реализация кажется не оптимальной, т.к. в событии перед записью нельзя отловить какая кнопка была нажата "записать и закрыть" или "записать", соответственно приходится делать свои кнопки, заменять стандартные и т.д. Может есть способ проще?
(1) платформа не записывает если нет различий. Там встроена проверка. Т.е. если нет изменений то и писать не будет.
Можно управлять доступностью кнопки опираясь на признак модифицированности.
Платформа записывает повторно - в этом легко убедиться, зайдя в отладчик - события записи отрабатывают при "записать и закрыть", если выходить крестиком - то не отрабатывают.
(6) ture, я так понимаю, версия данных нужна на случай, если кто-то или что-то изменит объект в то время, как пользователь его уже открыл. Если версия данных объекта, который записывается и того, который уже имеется в базе данных не будет совпадать, то запись объекта произведена не будет, а пользователь получит сообщение "данные были изменены другим пользователем" или что-то в этом духе.
тестирую в файловом варианте. Поставил точку останова в процедуре "перед записью" в модуле объекта. В пользовательском режиме открываю элемент и жму "записать и закрыть". В табло отладки сравниваю Ссылка.ПолучитьОбъект().ВерсияДанных И ЭтотОбъект.ВерсияДанных. Версия объекта в базе данных совпадает с версией объекта, который собирается записаться независимо от того изменялся объект или нет. Но при записи(которая происходит в обоих случаях), присваивается новая версия данных.
(8) Aerisdef,
Ну а просто проверить перед записью Модифицированность() и, если Ложь, то Отказ и Закрыть() - не вариант?
ЗЫ. Правда, такой подход вообще более-менее адекватен может быть только для справочников, но не для документов, ибо проведение последних может зависеть не только от их модифицированности, но и от состояния регистров, например.
Это вариант, но в событии "перед записью" нельзя проверить какая именно запись "записать и закрыть" или просто "записать". Не очень красиво когда по кнопке записать закрывается форма. Поэтому необходимо делать свои кнопки... и я надеюсь есть путь проще, чем править кучу форм...
нельзя проверить какая именно запись "записать и закрыть" или просто "записать"
Это да ) Ну нефиг будет записывать просто так немодифицированные объекты )
Поэтому необходимо делать свои кнопки... и я надеюсь есть путь проще, чем править кучу форм...
А оно вообще того стоит? Ну записали лишний раз и записали. Неужели лишние несколько записей в таблицу настолько критичны для производительности вашей системы?
А оно вообще того стоит? Ну записали лишний раз и записали. Неужели лишние несколько записей в таблицу настолько критичны для производительности вашей системы?
На самом деле производительность меня волнует не настолько, насколько побочные эффекты. Например, есть идея использовать версионирование объектов(подсистема БСП) для выявления кто из пользователей что правил в некоторых справочниках, из-за чего в итоге получилось "плохо". В данном случае проблема будет в том, что при каждой записи будет сохраняться копия объекта(для последующего анализа изменений). И фиг с ним с растущей базой, но ведь это элементарно неудобно иметь кучу копий объекта, который на самом деле открывали ради просмотра.
(1) Aerisdef, Ну так может этот вопрос логичнее решать административно?
Т.е. обучить пользователей нажимать именно кнопку "Закрыть"
Платформа все делает правильно.
Если на кнопке написано "Записать и закрыть", то нужно и записать, и закрыть.
Если пользователь хочет просто закрыть, то нужно нажать кнопку "Закрыть"
1С не может знать, какие именно действия предусмотрел программист при закрытии и нужно ли выполнять эти действия, если элемент не изменялся.
Вариант №1 - сделать подписку на справочники ПередЗаписью - там вызов универсальной функции, которая смотрит в цикле все реквизиты по метаданным Объекта и Ссылки -> т.е. если изменилось "Наименование", то Объект.Наименование<>Объект.Ссылка.Наименование. Делать Отказ=Истина при полном совпадении всех реквизитов Объекта и СсылкиОбъекта
Вариант №2 (геморойный) - проверять в каждой форме перед записью на клиенте модифицируемость и ругаться
(7) VladBD,
Первый вариант весьма затратен по ресурсам. Кроме того, если сделать отказ в подписке, то не только объект не запишется, но и форма не закроется. А хочется, чтобы "записать и закрыть" таки закрывало форму.
Второй вариант действительно геморойный, из-за чего я открыл эту ветку в поисках лучшей жизни :)
Можно сделать общую процедуру и вставить 1 строчку кода. Пока не вижу более удобного варианта.
Вероятно, это и есть самый удобный вариант... Жаль, что у формы нет свойства типа "записывать только модифицированные". Просто как-то странно, что выполняется столько лишних действий. Ладно у нас организация маленькая, но ведь есть базы где работают сотни людей. А вдруг при записи сложные механизмы с установкой блокировок, это ведь существенно влияет на параллельность работы.
(19) Aerisdef, Если дело в регистре версионирования - то есть куча обработок, которые там сворачивают повторные записи. Либо опять таки сами на событии ПриЗаписи на сервере проходите по набору данных и очищаете набор, если запись=предыдущей записи.
Это верно :) Я, если честно, удивлен, что этот вопрос, судя по всему, не решен. Ведь посмотришь вокруг: из типовых стараются вынимать все, что только можно из записи/проведения документов в регламентные задания, а вот повторную запись не убрали...
(23) Aerisdef,
Просто если подходить с точки зрения БСП - в конфигурации могут быть случаи, когда важен сам факт записи объекта - вне зависимости от его наполнения. Потому и поведение в подобных вашей ситуациях, очевидно, отдано на откуп прикладных программистов.
А так-то, кстати, в программном интерфейсе у них есть функция ВерсияОтличаетсяОтРанееЗаписанной(Объект) - по МД5 работает.
Изначальный вопрос как раз и состоит в том, что пользователи любят кнопку "записать и закрыть" использовать в качестве закрытия, т.е. и факта записи по-хорошему не должно состояться.