Запись в регистр сведений при смене статуса документа

1. ciddex 15.09.20 13:37 Сейчас в теме
Задача: При смене статуса документа (реквизит "статус") с "в пути" на "доставлено" должна добавиться запись в регистр сведений со статусом "доставлено" и датой. Старая запись не должна удалиться при перепроведении.

В итоге должны быть 2 записи в регистре. Например,
Дата: 12.10.2020 | Статус: В пути
Дата: 15.10.2020 | Статус: Доставлено

Как реализовать подобное?
По теме из базы знаний
Найденные решения
37. ciddex 16.09.20 00:50 Сейчас в теме
(36) Решил все гораздо проще, надо было отвлечься и идея пришла сама. Пришлось выбрать немного иной путь, чтобы сохранить привязку к регистратору.

Вот само решение, если кому пригодится

Процедура ОбработкаПроведения(Отказ, Режим)

	// Проверка
	Если ПоискРаспоряженийНаДоставку(Распоряжение.Ссылка) Тогда
		Отказ = Истина;
		Сообщить("По данному документу доставка не требуется!", СтатусСообщения.Внимание);
		Возврат;
	КонецЕсли;
	
	// регистр од_РаспоряженияНаДоставку
	Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
	Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
	
	Движение.Период = Дата;
	Движение.Партнер = Партнер;
	Движение.СуммаДокумента = СуммаДокумента;
	Движение.Распоряжение = Распоряжение;
	Движение.Адрес = Адрес;
	Движение.Транспорт = Транспорт;
	Движение.СтатусДоставки = СтатусДоставки;
	Движение.ДатаС = Дата;
	
	Если СтатусДоставки = Перечисления.од_СтатусыДоставки.Доставлено Тогда
		
		Движение.ДатаПо = ТекущаяДата();
		
	КонецЕсли;	
	
КонецПроцедуры
Показать
Остальные ответы
Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
4. FatPanzer 15.09.20 13:40 Сейчас в теме
(1) Регистр готовый, или с нуля надо создать? Что будет происходить в случае отмены проведения в этом регистре - какие записи должны удаляться?
5. ciddex 15.09.20 13:42 Сейчас в теме
(4) обе записи должны удалиться при отмене проведения.
Дата: 12.10.2020 | Статус: В пути
Дата: 15.10.2020 | Статус: Доставлено
6. FatPanzer 15.09.20 13:48 Сейчас в теме
(5) А на первый вопрос ответить?

Необходим независимый периодический регистр с измерением "Документ" и ресурсом "Статус". Актуализация записей регистра в обработчике модуля объекта (документа) "ПриЗаписи()"
8. ciddex 15.09.20 13:55 Сейчас в теме
(6) А при записи как будет работать? Разве без проведения запись так не добавится?
10. FatPanzer 15.09.20 14:00 Сейчас в теме
(8)В обработчике документа ПриЗаписи() анализируйте состояние записанного документа. Проведен или не проведен. В зависимости от этого состояния обрабатываете свой регистр.
7. ciddex 15.09.20 13:52 Сейчас в теме
(4) Вот сам регистр. Дата - дата документа (на данный момент). "в пути" еще не реализовано
Прикрепленные файлы:
11. FatPanzer 15.09.20 14:05 Сейчас в теме
(7) Подчинение регистратору - не очень хорошая идея. В этом случае вам придется изменять логику проведения документа в ОбработкаПроведения(). То есть вам придется считать предыдущие движения документа, анализировать их, и на их основании формировать собственные.
Возникает опять же вопрос - откуда вы будете брать даты для статусов? Из даты документа не предлагать. Напрашивается дата фактического проведения документа, но тоже так себе достоверность.
2. Vladisa 38 15.09.20 13:39 Сейчас в теме
регистр же на дату пишется, даты-разные. не должны другие статусы удаляться.
3. FatPanzer 15.09.20 13:39 Сейчас в теме
9. zarankony 305 15.09.20 13:59 Сейчас в теме
Вообще все просто. Периодический регистр с измерением - ссылкой на Ваш документ. ПередЗаписью Проверяете старый статус:
СтарыйСтатус = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка,"Статус");
Если Статус <> СтарыйСтатус;
ДополнительныеСвойства.Вставить("СтатусИзменен",Истина);
КонецЕсли;

Потом ПриЗаписи проверяете этот признак и записываете статус:
Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен Тогда
Запись = РегистрыСведений.од_РаспоряжениеНаДоставку.СоздатьМенеджерЗаписи();
Запись.Распоряжение = Ссылка;
Запись.Период = ТекущаяДата();
Запись.СтатусДоставки = Статус;
//заполняем остальное
Запись.Записать();
КонецЕсли;

Наверное статус документа тоже нужно отслеживать таким же способом.
12. zarankony 305 15.09.20 14:06 Сейчас в теме
(9)Подчинение регистратору уберите
13. ciddex 15.09.20 14:16 Сейчас в теме
(12) а с регистратором не получится?
14. zarankony 305 15.09.20 14:39 Сейчас в теме
(13)а зачем? бессмысленно с точки зрения архитектуры. Имело бы смысл если бы у Вас был документ типа "перемещение товара", который указанным в ТЧ товарам менял бы статус.
15. ciddex 15.09.20 15:04 Сейчас в теме
(14) у меня просто на основании заказа создается документ Накладная по доставке, которая и добавляет записи в регистр. Это не будет проблемой при написании отчетов в будущем? Я же не смогу отследить ссылку на документ (это заказ или накладная по доставке).

Плюс нужно, чтобы нельзя было создать эти записи вручную и при отмене проведения удалялись все записи по данному документу.
16. zarankony 305 15.09.20 15:21 Сейчас в теме
(15)то есть на один заказ несколько накладных, тогда да, регистратор имеет смысл. Тогда получается статус - это реквизит накладной и запись регистра делать как обычно через Движения. Реквизит Статус у заказа тогда не нужен.
17. ciddex 15.09.20 15:27 Сейчас в теме
(16) У заказа реквизит статус может принять только значения "Требуется" и "Не требуется". Использую для вывода в отчет "Реестр заявок", чтобы менеджер или администратор мог увидеть список заявок и распределить их между водителями.
19. FatPanzer 15.09.20 15:38 Сейчас в теме
(17) Вы имеете ввиду, что на форме заказа для выбора доступны только два значения статусов из всего списка? При этом сам реквизит статуса в заказе отсутствует и всегда хранится только в регистре сведений. В тот же регистр сведений свои значения статусов для данного заказа могут писать документы доставки.
Я правильно понял?
21. ciddex 15.09.20 15:45 Сейчас в теме
(19) На форме заказа да, доступны для выбора только 2 эти значения реквизита.
Сам реквизит в заказе тоже присутствует и ссылается на перечисление со статусами доставки.
И да, из заказа тоже добавляется запись в регистр. Вот скрин того что есть сейчас
Прикрепленные файлы:
23. FatPanzer 15.09.20 15:48 Сейчас в теме
(21) Ок. Вопрос. При проведении накладной на доставку - в заказе изменяется статус и он перепроводится с новым статусом "В пути"? Или как вы собираетесь совмещать хранение статусов в самом документе, и в регистре?
24. ciddex 15.09.20 16:04 Сейчас в теме
(23) В заказе может требоваться или нет доставка. На основании создается накладная на доставку со статусом "В пути" или "Доставлено". И по срезу последних по этому распоряжению (измерение) выводится актуальный статус
26. FatPanzer 15.09.20 16:09 Сейчас в теме
(24) Ну ёлы палы, какой же это СТАТУС заказа? Это обычный булевый флаг - требуется что-то или нет. И к статусу самой операции доставки "Готовится", "Отправлено", "Доехало" или "Своровали по дороге" - этот флаг не имеет никакого отношения. Не надо пытаться их компоновать в единый микс.
22. FatPanzer 15.09.20 15:45 Сейчас в теме
(16) Все-таки пока не вижу смысла в регистраторе для записи периодического регистра сведений. Пока не будет описания всех возможных статусов и их событийной модели - о регистраторе говорить не приходится. Вполне возможно, что некоторые статусы могут изменяться с помощью обработок без изменения самого заказа или документа доставки.
25. zarankony 305 15.09.20 16:05 Сейчас в теме
(22)Ну он для отчета и целостности данных нужен, человек же написал. Самый простой способ - это реквизит у накладной "новый статус", который пойдет в запись РС. В заказе "Статус" (не надо было его также называть) - это вообще не связанный реквизит, зачем он в регистре сведений не понятно, ибо меняться по логике не должен и может быть получен по ссылке. На форме заказа выводить статус доставки из среза последних и/или сделать переход на историю статусов. На форме списка выводить тоже статус из среза последних.
30. ciddex 15.09.20 17:53 Сейчас в теме
(16) При перепроведении изменяется старая запись, новая не добавляется. Что я делаю не так? Или это из-за регистратора?
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	
	СтарыйСтатус = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭтотОбъект.Ссылка, "СтатусДоставки");
	Если СтатусДоставки <> СтарыйСтатус Тогда
		ДополнительныеСвойства.Вставить("СтатусИзменен", Истина);
	КонецЕсли;

КонецПроцедуры

Процедура ПриЗаписи(Отказ)
	
	Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен Тогда
		
		// регистр од_РаспоряженияНаДоставку
		Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
		Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
		Движение.Период = ТекущаяДата();
		Движение.Партнер = Партнер;
		Движение.Транспорт = Транспорт;
		Движение.Распоряжение = Распоряжение;
		Движение.СтатусДоставки = СтатусДоставки;
		Движение.Адрес = Адрес;
		Движение.СуммаДокумента = СуммаДокумента;
		
	КонецЕсли;
	
КонецПроцедуры
Показать
31. FatPanzer 15.09.20 18:09 Сейчас в теме
(30) Потому что при перепроведении очищаются предыдущие движения. Именно поэтому я вам и говорил не использовать регистратор, потому что это повлечет сложную настройку и логику проведения документа в части этого регистра.

Можете, конечно, перед записью в допсвойства сохранять и текущие движения документа. Но на мой взгляд это не та задача, где нужна такая тяжелая артиллерия.
32. ciddex 15.09.20 18:24 Сейчас в теме
(31) Тогда будут проблемы в другом
Я же не смогу отследить ссылку на документ (это заказ или накладная по доставке).

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

А если в одной записи? Например "дата с" и дата по". При проведении со статусом "в пути" Дата С бы записалась, а при изменении статуса поменялось бы значение статуса в регистре на "доставлено" и заполнилась бы еще Дата По. Так тоже не получится с регистратором?
33. FatPanzer 15.09.20 18:27 Сейчас в теме
(32) 1. Чего вы отследить не сможете. Что такое "документ или накладная"? Выражайтесь точнее.
2. Еще хуже.
34. ciddex 15.09.20 18:36 Сейчас в теме
(33) хотя создам реквизит "регистратор" вручную и буду передавать ссылку на передаваемый объект. А как быть с автоудалением всех движений при отмене проведения тогда?
35. FatPanzer 15.09.20 18:39 Сейчас в теме
(34)
1. Наконец-то...
2. Там же. ПриЗаписи(). Для проведенных записи формируются, для непроведенных очищаются.
36. ciddex 16.09.20 00:00 Сейчас в теме
(35) При записи не работает.
1) После отмены проведения записи не удаляются.
2) Если документ был записан и только после провели в том же статусе, в котором он был записан, то запись в регистр не добавится
37. ciddex 16.09.20 00:50 Сейчас в теме
(36) Решил все гораздо проще, надо было отвлечься и идея пришла сама. Пришлось выбрать немного иной путь, чтобы сохранить привязку к регистратору.

Вот само решение, если кому пригодится

Процедура ОбработкаПроведения(Отказ, Режим)

	// Проверка
	Если ПоискРаспоряженийНаДоставку(Распоряжение.Ссылка) Тогда
		Отказ = Истина;
		Сообщить("По данному документу доставка не требуется!", СтатусСообщения.Внимание);
		Возврат;
	КонецЕсли;
	
	// регистр од_РаспоряженияНаДоставку
	Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
	Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
	
	Движение.Период = Дата;
	Движение.Партнер = Партнер;
	Движение.СуммаДокумента = СуммаДокумента;
	Движение.Распоряжение = Распоряжение;
	Движение.Адрес = Адрес;
	Движение.Транспорт = Транспорт;
	Движение.СтатусДоставки = СтатусДоставки;
	Движение.ДатаС = Дата;
	
	Если СтатусДоставки = Перечисления.од_СтатусыДоставки.Доставлено Тогда
		
		Движение.ДатаПо = ТекущаяДата();
		
	КонецЕсли;	
	
КонецПроцедуры
Показать
38. FatPanzer 16.09.20 01:07 Сейчас в теме
(37) Ничего хорошего в этом решении нет. Ну ок, каждый на своих граблях учится.
39. ciddex 16.09.20 02:18 Сейчас в теме
(38) а почему ничего хорошего? При создании или перезаписи создается всего одна запись с датой С, если перепровести или сразу провести со статусом Доставлено, то и Дата По заполняется. И нет кучи проблем, которые я описывал выше. Возможно это не лучшее решение, но тут решения получше я не нашел
42. Sp1ke666 11.05.21 18:19 Сейчас в теме
(37) Привет, столкнулся с аналогичной проблемой, но даже с твоим кодом сделать не получилось. Можно ли тебе скинуть, чтобы ты посмотрел?
18. ciddex 15.09.20 15:29 Сейчас в теме
(9)
Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен
подскажите, а почему два раза? Они разве не одно и то же значение выводят?
20. FatPanzer 15.09.20 15:41 Сейчас в теме
(18) Почитайте описание метода Свойство() у коллекции "Структура". Это не одно и то же.
Первое - это наличие такой "строки с ключом" в самой структуре. Второе - непосредственное значение "строки с ключом".
27. kiser 15.09.20 16:20 Сейчас в теме
А если в документе добавить табличную часть для хранения всех статусов с датами, первично писать изменения в нее, а уже по ней делать записи в регистр. Тогда при перепроведении точно так же все статусы из этой табличной части запишутся в регистр.
28. FatPanzer 15.09.20 16:23 Сейчас в теме
(27) Руки оторву!!! А зачем тогда регистр?
29. ciddex 15.09.20 16:30 Сейчас в теме
(27) такого я еще не видел))
40. пользователь 23.09.20 11:17
Сообщение было скрыто модератором.
...
41. slasher777 28.09.20 20:03 Сейчас в теме
Интересное решение, не догадался бы никогда
43. COMPER 340 24.06.21 10:44 Сейчас в теме
В БП3 для этого есть регистр "СтатусыДокументов".
Оставьте свое сообщение

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