Вход | Регистрация


1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Получить ссылку на новый элемент справочника ПриЗаписи

v7: Получить ссылку на новый элемент справочника ПриЗаписи
Я
   azernot
 
14.06.18 - 18:35
Добрый день.
Такая проблема.
Нужна регистрация новых и изменённых элементов справочников. Для этого заведён отдельный справочник, у которого есть реквизит неопределённого типа, куда записывается ссылка на модифицированный элемент справочника.

Теперь, в предопределённой процедуре ПриЗаписи() я отлавливаю ТекущийЭлемент() и передаю его в процедуру глобального модуля.
С изменением элементов - всё хорошо. Но в от с новыми элементами - засада.
Для новых элементов ТекущийЭлемент() - пустой.

Пытался организовать ОбработчкиОжидания, записывал в глобальные переменные  код или иной идентификационный признак вновь созданного элемента, подключал обработчик, в процедуре обработчика находил элемент, передавал в глобальную процедуру. Всё хорошо работает, если нажимать кнопку "Записать".
Но если нажимать при создании новых элементов кнопку "Ок", обработчик ожидания не срабатывает...

Что-нибудь посоветуете? Как отловить ТекущийЭлемент() для нового элемента справочника и передать в свою глобальную процедуру?
 
 
   Djelf
 
1 - 14.06.18 - 18:46
(0) Так он же Новый и его в базе нет, ПриЗаписи это фактически ДоЗаписи, делай в ПриЗакрытии.
   _KSA_
 
2 - 14.06.18 - 18:49
(0) посмотри в СП ПолучитьСсылкуНового.

А еще лучше почитай про ПланыОбмена.
   azernot
 
3 - 14.06.18 - 18:50
(2) Это 1С 7.7
   mehfk
 
4 - 14.06.18 - 18:57
   azernot
 
5 - 14.06.18 - 19:08
(4) Суть метода принудительно вызавть Записать() перед вызовом своей процедуры понятна. Спасибо.
Но в итоге, это приводит по сути к двойной записи новых элементов (сначала я принудительно, потом стандартный механизм), чего хочется избежать...
   azernot
 
6 - 14.06.18 - 19:10
(1) (4) Да, похоже придётся делать ещё и ПриЗакрытии(), если не сработал обработчик ожидания... Пока более приемлемого варианта не вижу.
   Djelf
 
7 - 14.06.18 - 19:40
(5) Не надо двойную двойную, крошечный анализ различия или признак ЭтоНовый.
   HawkEye
 
8 - 14.06.18 - 23:58
(5) не пиши элемент, пиши его код/наименование и значения реквизитов...
   Попытка1С
 
9 - 15.06.18 - 00:54
(0) Скуль?
   Aleksey
 
10 - 15.06.18 - 01:01
пометку на удаление и физическое удаление уже придумал как регистрировать и обрабатывать?
 
 Рекламное место пустует
   NSSerg
 
12 - 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) "Нужна регистрация новых и изменённых элементов справочников."
- а юзать УРБД для такой регистрации - позволяет религия?
   big
 
17 - 15.06.18 - 05:09
(16) Придётся потом "вручную" updts чистить, для ТС это будет новой темой для обсуждения. Так же, как и по выбору что туда надо записывать, а что нет
   HawkEye
 
18 - 15.06.18 - 09:02
(10) приудаленииобъекта\документа - а в чем проблема?
   Карст
 
19 - 15.06.18 - 09:10
(16) (0) есть еще МОД
   azernot
 
20 - 15.06.18 - 10:16
(13) А разве если пользователь ответил НЕТ, вызывается обработчик ПриЗаписи()?
Я что-то не могу воспроизвести..
   Злопчинский
 
21 - 15.06.18 - 16:46
(20) вставь в Призаписи или в Призакрытии принудительную Запись элемента. В кнопке закрытия напиши "#закрыть".
открой новый элемент, заполни поле, нажми закрыть. прога спросит "сохранить сделанные изменения" - скажи нет. наслаждайся появлением нового элемента справочника, хотя ты в вопросе системы отказался
   azernot
 
22 - 15.06.18 - 16:55
(21) Как-то сложно... В общем я понял, для того, чтобы воспроизвести проблему надо принудительно записывать.. я от этого отказался.
Сделал в итоге так:


Перем КодОбъекта;

Процедура ПриЗаписи() 
    
    ...
    Если СтатусВозврата() = 1 Тогда
        Если ПустоеЗначение(ТекущийЭлемент()) = 1 Тогда
            КодОбъекта = Код;
            Форма.ОбработкаОжидания("ЗарегистрироватьИзменениеОбъектаПослеЗаписи", 1);
        Иначе
            КодОбъекта = "";
            глЗарегистрироватьИзменениеОбъекта(ТекущийЭлемент(), "Справочник", Вид())
        КонецЕсли;    
    КонецЕсли;    
КонецПроцедуры 

Процедура ЗарегистрироватьИзменениеОбъектаПослеЗаписи()
    Форма.ОбработкаОжидания("", 0);
    СпрОбъекта=СоздатьОбъект("Справочник."+Вид());
             
    Если ПустоеЗначение(Владелец) = 0 Тогда
        СпрОбъекта.ИспользоватьВладельца(Владелец);
    КонецЕсли;    
    Если ПустоеЗначение(Родитель) = 0 Тогда
        СпрОбъекта.ИспользоватьРодителя(Родитель);
    КонецЕсли;    
    Если СпрОбъекта.НайтиПоКоду(КодОбъекта, 1) = 1 ТОгда
        глЗарегистрироватьИзменениеОбъекта(СпрОбъекта.ТекущийЭлемент(), "Справочник", Вид())
    КонецЕсли;
КонецПроцедуры

Процедура ПриЗакрытии()
...
    Если ПустоеЗначение(КодОбъекта) = 0 Тогда
        глЗарегистрироватьИзменениеОбъекта(ТекущийЭлемент(), "Справочник", Вид())
    КонецЕсли;
КонецПроцедуры
   NSSerg
 
23 - 15.06.18 - 16:56
(21) Ничего подобного. ПриЗаписи() при ответе "нет" не вызывается.
   NSSerg
 
24 - 15.06.18 - 16:57
Поэтому добавление Записать() в ПриЗаписи() - совершенно безопасно, и не ломает штатные механизмы.
   NSSerg
 
25 - 15.06.18 - 16:59
Процедура ПриЗакрытии()  
    сообщить("Закрыли");
КонецПроцедуры
Процедура ПриЗаписи()
    сообщить("Записали");
КонецПроцедуры

Создаю новый элемент справочника, либо меняю. Закрываю. Задает вопрос о сохранении. Если да, то в окне сообщений
Записали
Закрыли
Если нет, то в окне сообщений
Закрыли
   Попытка1С
 
26 - 15.06.18 - 18:10
Автор на вопрос ответишь который в (9)?
   azernot
 
27 - 15.06.18 - 20:39
(9) Да, он. Но меня интересует только решение штатными механизмами 1С.
   Злопчинский
 
28 - 15.06.18 - 21:10
(23) напряг... проверю..
   Cthulhu
 
29 - 15.06.18 - 23:18
а навесить на кнопку не ублюдочную решёточную недокоманду, а вызов собственных процедур - в которых кодом можно что угодно сделать - религия не позволяет?
прим.: из них можно и стандартный "ПриЗаписи" вызвать - с последующей проверкой статуса возврата и по нему либо "Записать()" либо нет... и вопросы какие надо и сколько надо позадавать... и передать куда надо и что надо...
   Cthulhu
 
30 - 15.06.18 - 23:19
(26): лол дашь текст хранимки и инструкцию как ее навесить?
   ADirks
 
31 - 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
|
|";


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует