Имя: Пароль:
1C
1C 7.7
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
|
|";