|
v7: Получить ссылку на новый элемент справочника ПриЗаписи | ☑ | ||
---|---|---|---|---|
0
azernot
14.06.18
✎
18:35
|
Добрый день.
Такая проблема. Нужна регистрация новых и изменённых элементов справочников. Для этого заведён отдельный справочник, у которого есть реквизит неопределённого типа, куда записывается ссылка на модифицированный элемент справочника. Теперь, в предопределённой процедуре ПриЗаписи() я отлавливаю ТекущийЭлемент() и передаю его в процедуру глобального модуля. С изменением элементов - всё хорошо. Но в от с новыми элементами - засада. Для новых элементов ТекущийЭлемент() - пустой. Пытался организовать ОбработчкиОжидания, записывал в глобальные переменные код или иной идентификационный признак вновь созданного элемента, подключал обработчик, в процедуре обработчика находил элемент, передавал в глобальную процедуру. Всё хорошо работает, если нажимать кнопку "Записать". Но если нажимать при создании новых элементов кнопку "Ок", обработчик ожидания не срабатывает... Что-нибудь посоветуете? Как отловить ТекущийЭлемент() для нового элемента справочника и передать в свою глобальную процедуру? |
|||
1
Djelf
14.06.18
✎
18:46
|
(0) Так он же Новый и его в базе нет, ПриЗаписи это фактически ДоЗаписи, делай в ПриЗакрытии.
|
|||
2
_KSA_
14.06.18
✎
18:49
|
(0) посмотри в СП ПолучитьСсылкуНового.
А еще лучше почитай про ПланыОбмена. |
|||
3
azernot
14.06.18
✎
18:50
|
(2) Это 1С 7.7
|
|||
4
mehfk
14.06.18
✎
18:57
|
||||
5
azernot
14.06.18
✎
19:08
|
(4) Суть метода принудительно вызавть Записать() перед вызовом своей процедуры понятна. Спасибо.
Но в итоге, это приводит по сути к двойной записи новых элементов (сначала я принудительно, потом стандартный механизм), чего хочется избежать... |
|||
6
azernot
14.06.18
✎
19:10
|
(1) (4) Да, похоже придётся делать ещё и ПриЗакрытии(), если не сработал обработчик ожидания... Пока более приемлемого варианта не вижу.
|
|||
7
Djelf
14.06.18
✎
19:40
|
(5) Не надо двойную двойную, крошечный анализ различия или признак ЭтоНовый.
|
|||
8
HawkEye
14.06.18
✎
23:58
|
(5) не пиши элемент, пиши его код/наименование и значения реквизитов...
|
|||
9
Попытка1С
15.06.18
✎
00:54
|
(0) Скуль?
|
|||
10
Aleksey
15.06.18
✎
01:01
|
пометку на удаление и физическое удаление уже придумал как регистрировать и обрабатывать?
|
|||
12
NSSerg
15.06.18
✎
01:37
|
в призаписи() никто не мешает написать
записать(); и после этого текущийэлемент() появится. |
|||
13
Злопчинский
15.06.18
✎
03:50
|
не выйдет.
Если жмакаете на кнопку записать/закрыть и выдается ШТАТНЫЙ ВОПРОС "Записать изменения" - то при ответе "Нет" - надо понять что юзверь сказал "нет" и не исполнять дальнейший код в процедуре ПриЗаписи() - мне это штатно не удалось. В формексе есть процедура ПослеЗаписи() - вот ее и можно юзать. При создании нового взводить флажок, а в ПослеЗаписи смотреть Если Выбран()=1 и флНовый=1 Тогда //это существующий уже в базе элемент, но он новый |
|||
14
Злопчинский
15.06.18
✎
03:53
|
точно так же в кнопке "закрыть" может быть написана команда
#Закрыть и быть код процедуры ПриЗакрытии - создали новый, жмем закрыть - система спрашивает "Сохранить изменения"? говорим "НЕТ" - и вот тут надо в зависимости от ответа пользователя по разному отработать... - штатно этот ответ словить не удается... |
|||
15
Злопчинский
15.06.18
✎
03:56
|
(12) А еще интереснее будет конструкция
Процедура ПриЗаписи() НачатьТранзакцию(); //чето делаем Записать(); ЗафксироватьТранзакцию(); СтатусВозврата(0); Возврат; КонецПроцедуры |
|||
16
Злопчинский
15.06.18
✎
03:57
|
(0) "Нужна регистрация новых и изменённых элементов справочников."
- а юзать УРБД для такой регистрации - позволяет религия? |
|||
17
big
15.06.18
✎
05:09
|
(16) Придётся потом "вручную" updts чистить, для ТС это будет новой темой для обсуждения. Так же, как и по выбору что туда надо записывать, а что нет
|
|||
18
HawkEye
15.06.18
✎
09:02
|
(10) приудаленииобъекта\документа - а в чем проблема?
|
|||
19
Карст
15.06.18
✎
09:10
|
(16) (0) есть еще МОД
|
|||
20
azernot
15.06.18
✎
10:16
|
(13) А разве если пользователь ответил НЕТ, вызывается обработчик ПриЗаписи()?
Я что-то не могу воспроизвести.. |
|||
21
Злопчинский
15.06.18
✎
16:46
|
(20) вставь в Призаписи или в Призакрытии принудительную Запись элемента. В кнопке закрытия напиши "#закрыть".
открой новый элемент, заполни поле, нажми закрыть. прога спросит "сохранить сделанные изменения" - скажи нет. наслаждайся появлением нового элемента справочника, хотя ты в вопросе системы отказался |
|||
22
azernot
15.06.18
✎
16:55
|
(21) Как-то сложно... В общем я понял, для того, чтобы воспроизвести проблему надо принудительно записывать.. я от этого отказался.
Сделал в итоге так: Перем КодОбъекта; Процедура ПриЗаписи() ... Если СтатусВозврата() = 1 Тогда Если ПустоеЗначение(ТекущийЭлемент()) = 1 Тогда КодОбъекта = Код; Форма.ОбработкаОжидания("ЗарегистрироватьИзменениеОбъектаПослеЗаписи", 1); Иначе КодОбъекта = ""; глЗарегистрироватьИзменениеОбъекта(ТекущийЭлемент(), "Справочник", Вид()) КонецЕсли; КонецЕсли; КонецПроцедуры Процедура ЗарегистрироватьИзменениеОбъектаПослеЗаписи() Форма.ОбработкаОжидания("", 0); СпрОбъекта=СоздатьОбъект("Справочник."+Вид()); Если ПустоеЗначение(Владелец) = 0 Тогда СпрОбъекта.ИспользоватьВладельца(Владелец); КонецЕсли; Если ПустоеЗначение(Родитель) = 0 Тогда СпрОбъекта.ИспользоватьРодителя(Родитель); КонецЕсли; Если СпрОбъекта.НайтиПоКоду(КодОбъекта, 1) = 1 ТОгда глЗарегистрироватьИзменениеОбъекта(СпрОбъекта.ТекущийЭлемент(), "Справочник", Вид()) КонецЕсли; КонецПроцедуры Процедура ПриЗакрытии() ... Если ПустоеЗначение(КодОбъекта) = 0 Тогда глЗарегистрироватьИзменениеОбъекта(ТекущийЭлемент(), "Справочник", Вид()) КонецЕсли; КонецПроцедуры |
|||
23
NSSerg
15.06.18
✎
16:56
|
(21) Ничего подобного. ПриЗаписи() при ответе "нет" не вызывается.
|
|||
24
NSSerg
15.06.18
✎
16:57
|
Поэтому добавление Записать() в ПриЗаписи() - совершенно безопасно, и не ломает штатные механизмы.
|
|||
25
NSSerg
15.06.18
✎
16:59
|
Процедура ПриЗакрытии()
сообщить("Закрыли"); КонецПроцедуры Процедура ПриЗаписи() сообщить("Записали"); КонецПроцедуры Создаю новый элемент справочника, либо меняю. Закрываю. Задает вопрос о сохранении. Если да, то в окне сообщений Записали Закрыли Если нет, то в окне сообщений Закрыли |
|||
26
Попытка1С
15.06.18
✎
18:10
|
Автор на вопрос ответишь который в (9)?
|
|||
27
azernot
15.06.18
✎
20:39
|
(9) Да, он. Но меня интересует только решение штатными механизмами 1С.
|
|||
28
Злопчинский
15.06.18
✎
21:10
|
(23) напряг... проверю..
|
|||
29
Cthulhu
15.06.18
✎
23:18
|
а навесить на кнопку не ублюдочную решёточную недокоманду, а вызов собственных процедур - в которых кодом можно что угодно сделать - религия не позволяет?
прим.: из них можно и стандартный "ПриЗаписи" вызвать - с последующей проверкой статуса возврата и по нему либо "Записать()" либо нет... и вопросы какие надо и сколько надо позадавать... и передать куда надо и что надо... |
|||
30
Cthulhu
15.06.18
✎
23:19
|
(26): лол дашь текст хранимки и инструкцию как ее навесить?
|
|||
31
ADirks
18.06.18
✎
08:23
|
(30) Не хранимку, а триггер. Самый простой и надёжный способ, ибо в семёрке нормального события для этой цели нет.
схема такая тзп_Триггер = "Set NoCount ON | |CREATE TRIGGER спрКонтрагенты_Вставка |ON $Справочник.Контрагенты |AFTER INSERT |Begin | INSERT INTO Протокол (ид13, ....) | SELECT | ($ВидСправочника36.Контрагенты + Ins.ID) ид13, | ... | FROM | Inserted Ins --Inserted - это специальная табличка внутри триггера, в которой содержатся добавленные строки |End | |"; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |