"Лишняя" запись объекта при интерактивной записи из формы

1. Aerisdef 14.05.15 17:27 Сейчас в теме
В управляемой форме, которая имеет ключевой реквизит объект(документ, справочник и т.д.), по-умолчанию всегда присутствует кнопка типа "Записать и закрыть". Кнопка очень большая и нравится пользователям, поэтому они тыркают по ней когда нужно и когда не нужно. К сожалению, платформа даже не модифицированный объект записывает повторно, что иногда очень накладно. Можно ли как-нибудь повлиять на поведение платформы, чтобы при не модифицированном объекте она закрывала форму без записи? Придуманная программная реализация кажется не оптимальной, т.к. в событии перед записью нельзя отловить какая кнопка была нажата "записать и закрыть" или "записать", соответственно приходится делать свои кнопки, заменять стандартные и т.д. Может есть способ проще?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ture 613 14.05.15 17:30 Сейчас в теме
(1) платформа не записывает если нет различий. Там встроена проверка. Т.е. если нет изменений то и писать не будет.
Можно управлять доступностью кнопки опираясь на признак модифицированности.
4. Aerisdef 14.05.15 17:38 Сейчас в теме
(2) ture,

Платформа записывает повторно - в этом легко убедиться, зайдя в отладчик - события записи отрабатывают при "записать и закрыть", если выходить крестиком - то не отрабатывают.
6. ture 613 14.05.15 18:29 Сейчас в теме
(4) если меняется версия в таблице на sql, то записывает. У меня случается, что после всех обработок записи версия не меняется.
8. Aerisdef 14.05.15 18:44 Сейчас в теме
(6) ture, я так понимаю, версия данных нужна на случай, если кто-то или что-то изменит объект в то время, как пользователь его уже открыл. Если версия данных объекта, который записывается и того, который уже имеется в базе данных не будет совпадать, то запись объекта произведена не будет, а пользователь получит сообщение "данные были изменены другим пользователем" или что-то в этом духе.
тестирую в файловом варианте. Поставил точку останова в процедуре "перед записью" в модуле объекта. В пользовательском режиме открываю элемент и жму "записать и закрыть". В табло отладки сравниваю Ссылка.ПолучитьОбъект().ВерсияДанных И ЭтотОбъект.ВерсияДанных. Версия объекта в базе данных совпадает с версией объекта, который собирается записаться независимо от того изменялся объект или нет. Но при записи(которая происходит в обоих случаях), присваивается новая версия данных.
9. ture 613 14.05.15 18:48 Сейчас в теме
(8) если версия изменилась, значит есть изменившийся реквизит
11. Aerisdef 14.05.15 18:51 Сейчас в теме
(9) ture, Версия данных меняется всякий раз когда объект записывается в базу данных, независимо от того менялся он или нет(проверено отладчиком).
14. AlX0id 14.05.15 21:46 Сейчас в теме
(8) Aerisdef,
Ну а просто проверить перед записью Модифицированность() и, если Ложь, то Отказ и Закрыть() - не вариант?

ЗЫ. Правда, такой подход вообще более-менее адекватен может быть только для справочников, но не для документов, ибо проведение последних может зависеть не только от их модифицированности, но и от состояния регистров, например.
15. Aerisdef 14.05.15 22:28 Сейчас в теме
(14) AlX0id,

Это вариант, но в событии "перед записью" нельзя проверить какая именно запись "записать и закрыть" или просто "записать". Не очень красиво когда по кнопке записать закрывается форма. Поэтому необходимо делать свои кнопки... и я надеюсь есть путь проще, чем править кучу форм...
16. AlX0id 15.05.15 10:18 Сейчас в теме
(15) Aerisdef,
нельзя проверить какая именно запись "записать и закрыть" или просто "записать"

Это да ) Ну нефиг будет записывать просто так немодифицированные объекты )

Поэтому необходимо делать свои кнопки... и я надеюсь есть путь проще, чем править кучу форм...

А оно вообще того стоит? Ну записали лишний раз и записали. Неужели лишние несколько записей в таблицу настолько критичны для производительности вашей системы?
17. Aerisdef 15.05.15 10:38 Сейчас в теме
(16) AlX0id,
А оно вообще того стоит? Ну записали лишний раз и записали. Неужели лишние несколько записей в таблицу настолько критичны для производительности вашей системы?


На самом деле производительность меня волнует не настолько, насколько побочные эффекты. Например, есть идея использовать версионирование объектов(подсистема БСП) для выявления кто из пользователей что правил в некоторых справочниках, из-за чего в итоге получилось "плохо". В данном случае проблема будет в том, что при каждой записи будет сохраняться копия объекта(для последующего анализа изменений). И фиг с ним с растущей базой, но ведь это элементарно неудобно иметь кучу копий объекта, который на самом деле открывали ради просмотра.
26. ekaruk 5006 17.05.15 23:58 Сейчас в теме
(1) Aerisdef, Ну так может этот вопрос логичнее решать административно?
Т.е. обучить пользователей нажимать именно кнопку "Закрыть"
Платформа все делает правильно.
Если на кнопке написано "Записать и закрыть", то нужно и записать, и закрыть.
Если пользователь хочет просто закрыть, то нужно нажать кнопку "Закрыть"
1С не может знать, какие именно действия предусмотрел программист при закрытии и нужно ли выполнять эти действия, если элемент не изменялся.
3. caponid 14.05.15 17:31 Сейчас в теме
при разрешенном оперативном проведении документа меняется время документа по этой кнопке...
5. Aerisdef 14.05.15 17:41 Сейчас в теме
(3) caponid,

В моей сфере деятельности мне не слишком нужны оперативные документы. Но я был бы рад убрать ненужную запись хотя бы в справочниках.
7. VladBD 20 14.05.15 18:38 Сейчас в теме
Вариант №1 - сделать подписку на справочники ПередЗаписью - там вызов универсальной функции, которая смотрит в цикле все реквизиты по метаданным Объекта и Ссылки -> т.е. если изменилось "Наименование", то Объект.Наименование<>Объект.Ссылка.Наименование. Делать Отказ=Истина при полном совпадении всех реквизитов Объекта и СсылкиОбъекта

Вариант №2 (геморойный) - проверять в каждой форме перед записью на клиенте модифицируемость и ругаться
10. Aerisdef 14.05.15 18:48 Сейчас в теме
(7) VladBD,
Первый вариант весьма затратен по ресурсам. Кроме того, если сделать отказ в подписке, то не только объект не запишется, но и форма не закроется. А хочется, чтобы "записать и закрыть" таки закрывало форму.

Второй вариант действительно геморойный, из-за чего я открыл эту ветку в поисках лучшей жизни :)
18. dj_serega 394 15.05.15 10:43 Сейчас в теме
(7) VladBD, Кстати по поводу варианта 2.
Можно сделать общую процедуру и вставить 1 строчку кода. Пока не вижу более удобного варианта.
19. Aerisdef 15.05.15 10:58 Сейчас в теме
(18) dj_serega,
Можно сделать общую процедуру и вставить 1 строчку кода. Пока не вижу более удобного варианта.


Вероятно, это и есть самый удобный вариант... Жаль, что у формы нет свойства типа "записывать только модифицированные". Просто как-то странно, что выполняется столько лишних действий. Ладно у нас организация маленькая, но ведь есть базы где работают сотни людей. А вдруг при записи сложные механизмы с установкой блокировок, это ведь существенно влияет на параллельность работы.
20. VladBD 20 15.05.15 14:55 Сейчас в теме
(19) Aerisdef, Если дело в регистре версионирования - то есть куча обработок, которые там сворачивают повторные записи. Либо опять таки сами на событии ПриЗаписи на сервере проходите по набору данных и очищаете набор, если запись=предыдущей записи.
21. Aerisdef 15.05.15 16:34 Сейчас в теме
(20) VladBD,

Уж проще бороться, чтобы платформа не инициализировала запись, чем после записи избавляться от последствий этого.
22. dj_serega 394 15.05.15 16:38 Сейчас в теме
(21) Aerisdef, это к Нуралиеву :)
23. Aerisdef 15.05.15 16:44 Сейчас в теме
(22) dj_serega,

Это верно :) Я, если честно, удивлен, что этот вопрос, судя по всему, не решен. Ведь посмотришь вокруг: из типовых стараются вынимать все, что только можно из записи/проведения документов в регламентные задания, а вот повторную запись не убрали...
24. AlX0id 17.05.15 12:02 Сейчас в теме
(23) Aerisdef,
Просто если подходить с точки зрения БСП - в конфигурации могут быть случаи, когда важен сам факт записи объекта - вне зависимости от его наполнения. Потому и поведение в подобных вашей ситуациях, очевидно, отдано на откуп прикладных программистов.
А так-то, кстати, в программном интерфейсе у них есть функция ВерсияОтличаетсяОтРанееЗаписанной(Объект) - по МД5 работает.
25. Aerisdef 17.05.15 22:15 Сейчас в теме
(24) AlX0id,

Изначальный вопрос как раз и состоит в том, что пользователи любят кнопку "записать и закрыть" использовать в качестве закрытия, т.е. и факта записи по-хорошему не должно состояться.
12. VladBD 20 14.05.15 19:15 Сейчас в теме
Процедура ПодпискаНаСобытиеОбработкаПолученияФормы(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт

Можно перехватить открытие формы - может так программно вставлять свои кнопки сохранения. Подписку можно на все объекты справочников оформить.
13. Aerisdef 14.05.15 20:49 Сейчас в теме
(12) VladBD,
Задумка интересная, но это не реализуемо. В качестве параметров данного события присутствует лишь название формы, а не она сама.
27. VladBD 20 22.06.15 11:39 Сейчас в теме
Вот решение твоей проблемы: Механизм расширения конфигурации в 1С 8.3.6
http://v8.1c.ru/o7/201410ext/index.htm
http://infostart.ru/public/369451/
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот