Запись в регистр сведений при смене статуса документа
Конфигурации 1cv8
1С:Комплексная автоматизация 2.х
1С:Управление торговлей 11
Платформа 1С v8.3
Управляемые формы
Задача: При смене статуса документа (реквизит "статус") с "в пути" на "доставлено" должна добавиться запись в регистр сведений со статусом "доставлено" и датой. Старая запись не должна удалиться при перепроведении.
В итоге должны быть 2 записи в регистре. Например,
Дата: 12.10.2020 | Статус: В пути
Дата: 15.10.2020 | Статус: Доставлено
Как реализовать подобное?
В итоге должны быть 2 записи в регистре. Например,
Дата: 12.10.2020 | Статус: В пути
Дата: 15.10.2020 | Статус: Доставлено
Как реализовать подобное?
По теме из базы знаний
Найденные решения
(36) Решил все гораздо проще, надо было отвлечься и идея пришла сама. Пришлось выбрать немного иной путь, чтобы сохранить привязку к регистратору.
Вот само решение, если кому пригодится
Вот само решение, если кому пригодится
Процедура ОбработкаПроведения(Отказ, Режим)
// Проверка
Если ПоискРаспоряженийНаДоставку(Распоряжение.Ссылка) Тогда
Отказ = Истина;
Сообщить("По данному документу доставка не требуется!", СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
// регистр од_РаспоряженияНаДоставку
Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
Движение.Период = Дата;
Движение.Партнер = Партнер;
Движение.СуммаДокумента = СуммаДокумента;
Движение.Распоряжение = Распоряжение;
Движение.Адрес = Адрес;
Движение.Транспорт = Транспорт;
Движение.СтатусДоставки = СтатусДоставки;
Движение.ДатаС = Дата;
Если СтатусДоставки = Перечисления.од_СтатусыДоставки.Доставлено Тогда
Движение.ДатаПо = ТекущаяДата();
КонецЕсли;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(7) Подчинение регистратору - не очень хорошая идея. В этом случае вам придется изменять логику проведения документа в ОбработкаПроведения(). То есть вам придется считать предыдущие движения документа, анализировать их, и на их основании формировать собственные.
Возникает опять же вопрос - откуда вы будете брать даты для статусов? Из даты документа не предлагать. Напрашивается дата фактического проведения документа, но тоже так себе достоверность.
Возникает опять же вопрос - откуда вы будете брать даты для статусов? Из даты документа не предлагать. Напрашивается дата фактического проведения документа, но тоже так себе достоверность.
Вообще все просто. Периодический регистр с измерением - ссылкой на Ваш документ. ПередЗаписью Проверяете старый статус:
Потом ПриЗаписи проверяете этот признак и записываете статус:
Наверное статус документа тоже нужно отслеживать таким же способом.
СтарыйСтатус = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Ссылка,"Статус");
Если Статус <> СтарыйСтатус;
ДополнительныеСвойства.Вставить("СтатусИзменен",Истина);
КонецЕсли;
Потом ПриЗаписи проверяете этот признак и записываете статус:
Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен Тогда
Запись = РегистрыСведений.од_РаспоряжениеНаДоставку.СоздатьМенеджерЗаписи();
Запись.Распоряжение = Ссылка;
Запись.Период = ТекущаяДата();
Запись.СтатусДоставки = Статус;
//заполняем остальное
Запись.Записать();
КонецЕсли;
Наверное статус документа тоже нужно отслеживать таким же способом.
(14) у меня просто на основании заказа создается документ Накладная по доставке, которая и добавляет записи в регистр. Это не будет проблемой при написании отчетов в будущем? Я же не смогу отследить ссылку на документ (это заказ или накладная по доставке).
Плюс нужно, чтобы нельзя было создать эти записи вручную и при отмене проведения удалялись все записи по данному документу.
Плюс нужно, чтобы нельзя было создать эти записи вручную и при отмене проведения удалялись все записи по данному документу.
(17) Вы имеете ввиду, что на форме заказа для выбора доступны только два значения статусов из всего списка? При этом сам реквизит статуса в заказе отсутствует и всегда хранится только в регистре сведений. В тот же регистр сведений свои значения статусов для данного заказа могут писать документы доставки.
Я правильно понял?
Я правильно понял?
(19) На форме заказа да, доступны для выбора только 2 эти значения реквизита.
Сам реквизит в заказе тоже присутствует и ссылается на перечисление со статусами доставки.
И да, из заказа тоже добавляется запись в регистр. Вот скрин того что есть сейчас
Сам реквизит в заказе тоже присутствует и ссылается на перечисление со статусами доставки.
И да, из заказа тоже добавляется запись в регистр. Вот скрин того что есть сейчас
Прикрепленные файлы:
(24) Ну ёлы палы, какой же это СТАТУС заказа? Это обычный булевый флаг - требуется что-то или нет. И к статусу самой операции доставки "Готовится", "Отправлено", "Доехало" или "Своровали по дороге" - этот флаг не имеет никакого отношения. Не надо пытаться их компоновать в единый микс.
(16) Все-таки пока не вижу смысла в регистраторе для записи периодического регистра сведений. Пока не будет описания всех возможных статусов и их событийной модели - о регистраторе говорить не приходится. Вполне возможно, что некоторые статусы могут изменяться с помощью обработок без изменения самого заказа или документа доставки.
(22)Ну он для отчета и целостности данных нужен, человек же написал. Самый простой способ - это реквизит у накладной "новый статус", который пойдет в запись РС. В заказе "Статус" (не надо было его также называть) - это вообще не связанный реквизит, зачем он в регистре сведений не понятно, ибо меняться по логике не должен и может быть получен по ссылке. На форме заказа выводить статус доставки из среза последних и/или сделать переход на историю статусов. На форме списка выводить тоже статус из среза последних.
(16) При перепроведении изменяется старая запись, новая не добавляется. Что я делаю не так? Или это из-за регистратора?
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СтарыйСтатус = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ЭтотОбъект.Ссылка, "СтатусДоставки");
Если СтатусДоставки <> СтарыйСтатус Тогда
ДополнительныеСвойства.Вставить("СтатусИзменен", Истина);
КонецЕсли;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ДополнительныеСвойства.Свойство("СтатусИзменен") И ДополнительныеСвойства.СтатусИзменен Тогда
// регистр од_РаспоряженияНаДоставку
Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
Движение.Период = ТекущаяДата();
Движение.Партнер = Партнер;
Движение.Транспорт = Транспорт;
Движение.Распоряжение = Распоряжение;
Движение.СтатусДоставки = СтатусДоставки;
Движение.Адрес = Адрес;
Движение.СуммаДокумента = СуммаДокумента;
КонецЕсли;
КонецПроцедуры
Показать
(30) Потому что при перепроведении очищаются предыдущие движения. Именно поэтому я вам и говорил не использовать регистратор, потому что это повлечет сложную настройку и логику проведения документа в части этого регистра.
Можете, конечно, перед записью в допсвойства сохранять и текущие движения документа. Но на мой взгляд это не та задача, где нужна такая тяжелая артиллерия.
Можете, конечно, перед записью в допсвойства сохранять и текущие движения документа. Но на мой взгляд это не та задача, где нужна такая тяжелая артиллерия.
(31) Тогда будут проблемы в другом
А если в одной записи? Например "дата с" и дата по". При проведении со статусом "в пути" Дата С бы записалась, а при изменении статуса поменялось бы значение статуса в регистре на "доставлено" и заполнилась бы еще Дата По. Так тоже не получится с регистратором?
Я же не смогу отследить ссылку на документ (это заказ или накладная по доставке).
Плюс нужно, чтобы нельзя было создать эти записи вручную и при отмене проведения удалялись все записи по данному документу.
.
Плюс нужно, чтобы нельзя было создать эти записи вручную и при отмене проведения удалялись все записи по данному документу.
А если в одной записи? Например "дата с" и дата по". При проведении со статусом "в пути" Дата С бы записалась, а при изменении статуса поменялось бы значение статуса в регистре на "доставлено" и заполнилась бы еще Дата По. Так тоже не получится с регистратором?
(36) Решил все гораздо проще, надо было отвлечься и идея пришла сама. Пришлось выбрать немного иной путь, чтобы сохранить привязку к регистратору.
Вот само решение, если кому пригодится
Вот само решение, если кому пригодится
Процедура ОбработкаПроведения(Отказ, Режим)
// Проверка
Если ПоискРаспоряженийНаДоставку(Распоряжение.Ссылка) Тогда
Отказ = Истина;
Сообщить("По данному документу доставка не требуется!", СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
// регистр од_РаспоряженияНаДоставку
Движения.од_РаспоряженияНаДоставку.Записывать = Истина;
Движение = Движения.од_РаспоряженияНаДоставку.Добавить();
Движение.Период = Дата;
Движение.Партнер = Партнер;
Движение.СуммаДокумента = СуммаДокумента;
Движение.Распоряжение = Распоряжение;
Движение.Адрес = Адрес;
Движение.Транспорт = Транспорт;
Движение.СтатусДоставки = СтатусДоставки;
Движение.ДатаС = Дата;
Если СтатусДоставки = Перечисления.од_СтатусыДоставки.Доставлено Тогда
Движение.ДатаПо = ТекущаяДата();
КонецЕсли;
КонецПроцедуры
Показать
(38) а почему ничего хорошего? При создании или перезаписи создается всего одна запись с датой С, если перепровести или сразу провести со статусом Доставлено, то и Дата По заполняется. И нет кучи проблем, которые я описывал выше. Возможно это не лучшее решение, но тут решения получше я не нашел
А если в документе добавить табличную часть для хранения всех статусов с датами, первично писать изменения в нее, а уже по ней делать записи в регистр. Тогда при перепроведении точно так же все статусы из этой табличной части запишутся в регистр.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот