Изменение статуса клиента

1. user1268186 05.09.23 11:17 Сейчас в теме
Здравствуйте!

Есть справочник "Контрагенты", в котором записаны клиенты. В числе реквизитов присутствует реквизит "Статус" со значениями "Новый клиент", "Постоянный клиент", "Ключевой клиент" и "Потерянный клиент". Значения статусов заданы в Перечислении "СтатусКлиента".

Нужно, чтобы изменения статуса клиента автоматически фиксировались в Регистре сведений "ИзменениеСтатуса" (Измерение - Контрагент (берётся из справочника "Контрагенты"), Ресурс - Статус (берётся из Перечисления "СтатусКлиента"). Для этого в модуле формы справочника "Контрагенты" написана процедура:
&НаСервере
Процедура СтатусКлиентаПриИзмененииНаСервере()
	РегистрыСведений.ИзменениеСтатуса.ПолучитьПоследнее();
КонецПроцедуры

&НаКлиенте
Процедура СтатусКлиентаПриИзменении(Элемент)
	СтатусКлиентаПриИзмененииНаСервере();
КонецПроцедуры
Показать


Однако при изменении никакие записи в Регистр автоматически не добавляются, а при открытии сам Регистр предлагает добавлять их вручную. Есть чёткое ощущение, что что-то где-то не доделано, но что?
По теме из базы знаний
Найденные решения
13. user620512 05.09.23 14:22 Сейчас в теме
(9) Я тоже по
 РегистрыСведений.ИзменениеСтатуса.ПолучитьПоследнее();
мог догадаться, но не дошло.

Вот простейший тогда пример, он будет создавать запись при любом сохранении контрагента

&НаСервере
Процедура ПриЗаписиНаСервере()
	
	НаборЗаписей = РегистрыСведений.ИзменениеСтатуса.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Контрагент.Установить(Объект.Ссылка);
	НаборЗаписей.Прочитать();
	
	ЗаписьРегистра = НаборЗаписей.Добавить();  
	ЗаписьРегистра.Период = ТекущаяДата();	
	ЗаписьРегистра.Контрагент = Объект.Ссылка;
	ЗаписьРегистра.Статус = Объект.Статус;
	НаборЗаписей.Записать(); 
		
КонецПроцедуры 
 
Показать


По хорошему надо проверять сменился статус или нет, а то будет много записей.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 05.09.23 11:55 Сейчас в теме
(1)
СтатусКлиентаПриИзмененииНаСервере()
В этой процедуре смотрите как записывается.
3. user620512 05.09.23 12:03 Сейчас в теме
Примерно вот так. Но все таки лучше это выполнять не при измении реквизита, а при записи объекта справочника т.к. можно изменить реквизит и не сохранить объект, а данные в регистре изменятся.

&НаСервере
Процедура СтатусПриИзмененииНаСервере()
	
	НаборЗаписей = РегистрыСведений.ИзменениеСтатуса.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Контрагент.Установить(Объект.Ссылка);
	НаборЗаписей.Прочитать();
	
	Если НаборЗаписей.Количество() > 0 Тогда
		
		ЗаписьРегистра = НаборЗаписей[0];
		ЗаписьРегистра.Контрагент = Объект.Ссылка;
		ЗаписьРегистра.Статус = Объект.Статус;
		НаборЗаписей.Записать();
		
	Иначе
		
		ЗаписьРегистра = НаборЗаписей.Добавить();
		ЗаписьРегистра.Контрагент = Объект.Ссылка;
		ЗаписьРегистра.Статус = Объект.Статус;
		НаборЗаписей.Записать(); 
		
	КонецЕсли;
	
	
КонецПроцедуры

&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
	СтатусПриИзмененииНаСервере();
КонецПроцедуры
Показать
4. user1268186 05.09.23 12:53 Сейчас в теме
(3)
(3)
То есть, нужно описать событие ПриЗаписи?
5. user620512 05.09.23 13:20 Сейчас в теме
(4) ПриЗаписиНаСервере

В коде Объект.Ссылка и Объект.Статус по тексту заменить на ТекущийОбъект.Ссылка и ТекущийОбъект.Статус
6. user1268186 05.09.23 13:52 Сейчас в теме
&НаСервере
Процедура ПриЗаписиНаСервере()
    
    НаборЗаписей = РегистрыСведений.ИзменениеСтатуса.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Контрагент.Установить(Объект.Ссылка);
    НаборЗаписей.Прочитать();
    
    Если НаборЗаписей.Количество() > 0 Тогда
        
        ЗаписьРегистра = НаборЗаписей[0];
        ЗаписьРегистра.Контрагент = Объект.Ссылка;
        ЗаписьРегистра.Статус = Объект.Статус;
        НаборЗаписей.Записать();
        
    Иначе
        
        ЗаписьРегистра = НаборЗаписей.Добавить();
        ЗаписьРегистра.Контрагент = Объект.Ссылка;
        ЗаписьРегистра.Статус = Объект.Статус;
        НаборЗаписей.Записать(); 
        
    КонецЕсли;
    
    
КонецПроцедуры
Показать


При замене Объект на ТекущийОбъект выдаётся ошибка о незаданной переменной.

А если оставить так, то при открытии РегистраСведений пишет о том, что период не может быть пустым:

"{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(20)}: Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать();
по причине:
Запись не верна! Период не может быть пустым!: ИзменениеСтатуса: 01.01.0001"
7. user620512 05.09.23 14:02 Сейчас в теме
(6)
При замене Объект на ТекущийОбъект выдаётся ошибка о незаданной переменной.


Просто когда выбираешь в верхней части окна нужную процедуру он добавляет

&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)


Если руками писать, то тогда да, оставляем везде Объект.Ссылка.
Прикрепленные файлы:
8. user620512 05.09.23 14:03 Сейчас в теме
(6) А нигде информации не было что регистр периодический
9. user1268186 05.09.23 14:15 Сейчас в теме
(8) Да, извиняюсь, что не указал это. Нужна именно история изменений статусов, так как при непериодическом он только одну строку записывает про каждого клиента и в ней меняет статус. При этом статус меняется только после обновления страницы.
Как сделать именно историю изменений (допустим, раз в секунду или раз в день - это сейчас неважно)?
Период "раз в секунду" я поставил для наглядности - просто чтобы видно было, что статус меняется.
13. user620512 05.09.23 14:22 Сейчас в теме
(9) Я тоже по
 РегистрыСведений.ИзменениеСтатуса.ПолучитьПоследнее();
мог догадаться, но не дошло.

Вот простейший тогда пример, он будет создавать запись при любом сохранении контрагента

&НаСервере
Процедура ПриЗаписиНаСервере()
	
	НаборЗаписей = РегистрыСведений.ИзменениеСтатуса.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Контрагент.Установить(Объект.Ссылка);
	НаборЗаписей.Прочитать();
	
	ЗаписьРегистра = НаборЗаписей.Добавить();  
	ЗаписьРегистра.Период = ТекущаяДата();	
	ЗаписьРегистра.Контрагент = Объект.Ссылка;
	ЗаписьРегистра.Статус = Объект.Статус;
	НаборЗаписей.Записать(); 
		
КонецПроцедуры 
 
Показать


По хорошему надо проверять сменился статус или нет, а то будет много записей.
10. user1826630 05.09.23 14:19 Сейчас в теме
11. user1268186 05.09.23 14:19 Сейчас в теме
(10)
Да. С изменением раз в секунду (для наглядности).
12. user1826630 05.09.23 14:21 Сейчас в теме
(11) Тогда нахрена тебе реквизит в самом справочнике?
14. user1268186 05.09.23 14:27 Сейчас в теме
(12)Такое условие поставлено. :) Так как, кроме всего прочего, требуется ещё вывод списка контрагентов с указанием их статуса. Поэтому и добавлен был этот реквизит.
15. user1826630 05.09.23 14:28 Сейчас в теме
(14) Что запрещает выводить список контрагентов со статусом из РС?
17. user1268186 05.09.23 14:38 Сейчас в теме
(16) Я понимаю, но задача у меня стоит сейчас следующая:

Для каждого покупателя должна быть история статусов, статусы со временем могут меняться. Всю историю статусов нужно видеть из карточки клиента.

(15) Ничто не запрещает, но задача стоит - см. выше, какая.
18. user1826630 05.09.23 14:47 Сейчас в теме
(17) И? Что мешает в карточке клиента показывать текущий статус из РС? И рядом кнопочку/ссылочку нарисовать на историю?
19. user1268186 05.09.23 15:01 Сейчас в теме
(18)Именно показывать текущий статус ничего не мешает. Вопрос больше с историей изменений, ради которой и создан этот РС. В нём нужно именно историю изменений показывать, а не просто последний статус. А у меня только текущий статус там отражается, а те, что были до этого, нет. А надо, чтобы всё отражалось.
20. user1826630 05.09.23 15:04 Сейчас в теме
21. user1268186 05.09.23 15:41 Сейчас в теме
Хм... каким-то странным образом всё заработало. :)

Всем спасибо. Особое спасибо "user620512". :) Отметил Ваш ответ, как решение.
22. user1826630 05.09.23 15:48 Сейчас в теме
(21) Что заработало? Запись? Но ведь ты хотел ещё и отображение истории где-то "там"...
16. user1826630 05.09.23 14:29 Сейчас в теме
(14) Ты понимаешь, что статус может изменяться какой-то периодической регламентной обработкой?
Как думаешь, что правильнее делать такой обработкой - переписывать объекты справочника совместно с добавлением записи в РС, или просто добавлять записи в РС?
23. user1268186 05.09.23 20:20 Сейчас в теме
(22) Да. И запись заработала, и отражение истории. Во вложении скрин этого РС: первые 2 строки – как было сперва, вторые 3 – как должно быть.
Прикрепленные файлы:
24. user1268186 05.09.23 22:47 Сейчас в теме
Хммм... Похоже, я рано обрадовался: из 4-х контрагентов только 2 работают, как надо. А по 2-м остальным выдаётся ошибка
"{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(12)}: Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать();
по причине:
Запись не верна! Период не может быть пустым!: ИзменениеСтатуса: 01.01.0001 0:00:00, ООО "Всё для дома" (Регистр сведений: Изменение статуса; Номер строки: 1)"

Все 4 контрагента созданы по одному шаблону, примерно в одно и то же время, но 2 из них нормально отрабатывают, а 2 других вываливаются в ошибку. Отладка тоже показывает 2-х "правильных" контрагентов, а 2-х "неправильных" нет. :-( Период не указывается ни для одного контрагента
25. user1826630 05.09.23 23:07 Сейчас в теме
(24) Продолжай наблюдать!
Если не умеешь записывать периодические регистры...
26. user1268186 06.09.23 01:07 Сейчас в теме
(25) Это, конечно, очень полезная информация – то, что я не умею... Только я бы здесь и не писал, если бы всё знал и умел. :-)
А по существу моего вопроса? Каким образом моё умение/неумение влияет на то, что 2 контрагента нормально отрабатывают, а ещё 2 требуют указать период при том, что период не указывается ни в том, ни в другом случае? Ведь по идее работать всё должно одинаково – сведения о статусах должны фиксироваться для каждого контрагента независимо от того, что это за контрагент.
27. user620512 06.09.23 05:37 Сейчас в теме
(24) А записи без даты откуда появились? Попробуй руками любую дату меньше текущей занести у них и потом изменить статус через карточку контрагента.

п.с. такую ошибку можно получить если не устанавливать значение ЗаписьРегистра.Период, проверь что установка даты на месте.
28. user1268186 07.09.23 09:52 Сейчас в теме
(27) Записи без даты появились, когда РС был непериодическим.

И опять-таки непонятно: в одно и то же время я создал 4-х контрагентов (набор реквизитов и всего прочего у всех 4-х одинаков). В итоге 2 контрагента при смене статуса отрабатывают стандартно, а ещё 2 ругаются на период. Где это чёртово значение периода нужно указать, и почему требуют указывать его только 2 контрагента из 4-х (ещё раз напишу: все 4 контрагента созданы в одно и то же время и имеют одинаковый набор характеристик)?
29. user620512 07.09.23 10:52 Сейчас в теме
(28) даты пустые заполнены и по этим котрагентам ругается?
30. user1268186 07.09.23 12:27 Сейчас в теме
(29) Всё, я понял, почему ругался Регистр. Записи об этих 2 контрагентах, на которых он ругался (ИП Иванов А. Б. и ООО "Всё для дома", были первоначально созданы мной вручную через кнопку "Создать" (для пробы). После того, как я удалил эти записи из Регистра, всё заработало, как положено.

Извините, что отнял столько времени у вас. :-) В следующий раз постараюсь быть более краток. :-) А за подсказку ещё раз спасибо (13). :-)
32. пользователь 07.09.23 13:05
Сообщение было скрыто модератором.
...
33. user1268186 07.09.23 15:48 Сейчас в теме
(32)Не путаюсь. :-) 4 контрагента были созданы в справочнике "Контрагенты", а потом 2 из этих 4-х были добавлены мной вручную в РС, чего делать не стоило. Или, по крайней мере, давно уже надо было догадаться их удалить.
36. пользователь 07.09.23 18:11
Сообщение было скрыто модератором.
...
31. soft_wind 07.09.23 12:59 Сейчас в теме
а теперь новая вводная:

допустим Статус у контрагента изменили программно! (например регламентом или групповой обработкой)
или он изменился при обмене данных!

вся эта ваша свистопляска работать не будет!

(что бы работало, необходимо перенести функционал в модуль справочника Контрагенты, осилите?)
34. user1268186 07.09.23 15:53 Сейчас в теме
(31) В модуль формы или в модуль объекта?
35. soft_wind 07.09.23 16:23 Сейчас в теме
(34) ну хорошо, если термин: в модуле справочника, вам не понятен, тогда пусть будет по вашему
в модуле объекта

(в событии ПриЗаписи(...) - здесь уже есть ссылка, даже у нового контрагента,
только добавьте проверку на то что Статус изменился)
37. truerazrab 28.03.24 23:36 Сейчас в теме
Получилось решить данную задачу?
38. user1268186 29.03.24 15:35 Сейчас в теме
(37) Да. Всё было сделано верно, а ошибка появлялась, как я понимаю, из-за того, что 2 первых записи были введены вручную. Не уверен, что причина ошибки именно в этом, но во всяком случае, после удаления этих 2-х записей всё стало работать, как надо.
39. truerazrab 29.03.24 23:31 Сейчас в теме
У тебя остался dt файл? Хотел бы разобраться подробнее
41. user1268186 31.03.24 01:28 Сейчас в теме
(39)
(40)
Поищу. Если не найду, попробую по памяти восстановить.
42. truerazrab 31.03.24 01:30 Сейчас в теме
43. user1268186 31.03.24 01:45 Сейчас в теме
(42)Нашёл.
История статусов реализована в РС "ИсторияСтатусовКлиентов", сами статусы заданы в Перечислении "СтатусКонтрагента". Контрагенты перечислены в соответствующем справочнике.
Прикрепленные файлы:
1Cv8.dt
40. truerazrab 30.03.24 20:41 Сейчас в теме
как ты реализовал историю статусов?
44. truerazrab 01.04.24 00:38 Сейчас в теме
Получается каждый раз когда меняется дата статус должен автоматически меняться? Если 01.01 он был "Новый клиент" то после записи этого контрагента 10.01 он будет иметь статус "Потерянный клиент"? как тогда так сделать, чтобы автоматически проставлялся статус с учетом времени?
Оставьте свое сообщение

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