Здравствуйте!
Есть справочник "Контрагенты", в котором записаны клиенты. В числе реквизитов присутствует реквизит "Статус" со значениями "Новый клиент", "Постоянный клиент", "Ключевой клиент" и "Потерянный клиент". Значения статусов заданы в Перечислении "СтатусКлиента".
Нужно, чтобы изменения статуса клиента автоматически фиксировались в Регистре сведений "ИзменениеСтатуса" (Измерение - Контрагент (берётся из справочника "Контрагенты"), Ресурс - Статус (берётся из Перечисления "СтатусКлиента"). Для этого в модуле формы справочника "Контрагенты" написана процедура:
Однако при изменении никакие записи в Регистр автоматически не добавляются, а при открытии сам Регистр предлагает добавлять их вручную. Есть чёткое ощущение, что что-то где-то не доделано, но что?
Есть справочник "Контрагенты", в котором записаны клиенты. В числе реквизитов присутствует реквизит "Статус" со значениями "Новый клиент", "Постоянный клиент", "Ключевой клиент" и "Потерянный клиент". Значения статусов заданы в Перечислении "СтатусКлиента".
Нужно, чтобы изменения статуса клиента автоматически фиксировались в Регистре сведений "ИзменениеСтатуса" (Измерение - Контрагент (берётся из справочника "Контрагенты"), Ресурс - Статус (берётся из Перечисления "СтатусКлиента"). Для этого в модуле формы справочника "Контрагенты" написана процедура:
&НаСервере
Процедура СтатусКлиентаПриИзмененииНаСервере()
РегистрыСведений.ИзменениеСтатуса.ПолучитьПоследнее();
КонецПроцедуры
&НаКлиенте
Процедура СтатусКлиентаПриИзменении(Элемент)
СтатусКлиентаПриИзмененииНаСервере();
КонецПроцедуры
ПоказатьОднако при изменении никакие записи в Регистр автоматически не добавляются, а при открытии сам Регистр предлагает добавлять их вручную. Есть чёткое ощущение, что что-то где-то не доделано, но что?
По теме из базы знаний
- Групповое изменение/расчет статуса заказа клиенту.
- Обновление статуса заказа в Bitrix из 1C
- Уведомление пользователей об изменениях в объектах (расширение)
- Получение статуса доставки почтовой службы (DPD)
- Изменение заказов клиента путем ввода корректировочного документа (по аналогии с механизмом УТ 10.3)
Найденные решения
(9) Я тоже по мог догадаться, но не дошло.
Вот простейший тогда пример, он будет создавать запись при любом сохранении контрагента
По хорошему надо проверять сменился статус или нет, а то будет много записей.
РегистрыСведений.ИзменениеСтатуса.ПолучитьПоследнее();
Вот простейший тогда пример, он будет создавать запись при любом сохранении контрагента
&НаСервере
Процедура ПриЗаписиНаСервере()
НаборЗаписей = РегистрыСведений.ИзменениеСтатуса.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Контрагент.Установить(Объект.Ссылка);
НаборЗаписей.Прочитать();
ЗаписьРегистра = НаборЗаписей.Добавить();
ЗаписьРегистра.Период = ТекущаяДата();
ЗаписьРегистра.Контрагент = Объект.Ссылка;
ЗаписьРегистра.Статус = Объект.Статус;
НаборЗаписей.Записать();
КонецПроцедуры
ПоказатьПо хорошему надо проверять сменился статус или нет, а то будет много записей.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Примерно вот так. Но все таки лучше это выполнять не при измении реквизита, а при записи объекта справочника т.к. можно изменить реквизит и не сохранить объект, а данные в регистре изменятся.
&НаСервере
Процедура СтатусПриИзмененииНаСервере()
НаборЗаписей = РегистрыСведений.ИзменениеСтатуса.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Контрагент.Установить(Объект.Ссылка);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
ЗаписьРегистра = НаборЗаписей[0];
ЗаписьРегистра.Контрагент = Объект.Ссылка;
ЗаписьРегистра.Статус = Объект.Статус;
НаборЗаписей.Записать();
Иначе
ЗаписьРегистра = НаборЗаписей.Добавить();
ЗаписьРегистра.Контрагент = Объект.Ссылка;
ЗаписьРегистра.Статус = Объект.Статус;
НаборЗаписей.Записать();
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура СтатусПриИзменении(Элемент)
СтатусПриИзмененииНаСервере();
КонецПроцедуры
Показать&НаСервере
Процедура ПриЗаписиНаСервере()
НаборЗаписей = РегистрыСведений.ИзменениеСтатуса.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Контрагент.Установить(Объект.Ссылка);
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() > 0 Тогда
ЗаписьРегистра = НаборЗаписей[0];
ЗаписьРегистра.Контрагент = Объект.Ссылка;
ЗаписьРегистра.Статус = Объект.Статус;
НаборЗаписей.Записать();
Иначе
ЗаписьРегистра = НаборЗаписей.Добавить();
ЗаписьРегистра.Контрагент = Объект.Ссылка;
ЗаписьРегистра.Статус = Объект.Статус;
НаборЗаписей.Записать();
КонецЕсли;
КонецПроцедуры
ПоказатьПри замене Объект на ТекущийОбъект выдаётся ошибка о незаданной переменной.
А если оставить так, то при открытии РегистраСведений пишет о том, что период не может быть пустым:
"{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(20)}: Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать();
по причине:
Запись не верна! Период не может быть пустым!: ИзменениеСтатуса: 01.01.0001"
(6)
Просто когда выбираешь в верхней части окна нужную процедуру он добавляет
Если руками писать, то тогда да, оставляем везде Объект.Ссылка.
При замене Объект на ТекущийОбъект выдаётся ошибка о незаданной переменной.
Просто когда выбираешь в верхней части окна нужную процедуру он добавляет
&НаСервере
Процедура ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Если руками писать, то тогда да, оставляем везде Объект.Ссылка.
Прикрепленные файлы:
(8) Да, извиняюсь, что не указал это. Нужна именно история изменений статусов, так как при непериодическом он только одну строку записывает про каждого клиента и в ней меняет статус. При этом статус меняется только после обновления страницы.
Как сделать именно историю изменений (допустим, раз в секунду или раз в день - это сейчас неважно)?
Период "раз в секунду" я поставил для наглядности - просто чтобы видно было, что статус меняется.
Как сделать именно историю изменений (допустим, раз в секунду или раз в день - это сейчас неважно)?
Период "раз в секунду" я поставил для наглядности - просто чтобы видно было, что статус меняется.
(9) Я тоже по мог догадаться, но не дошло.
Вот простейший тогда пример, он будет создавать запись при любом сохранении контрагента
По хорошему надо проверять сменился статус или нет, а то будет много записей.
РегистрыСведений.ИзменениеСтатуса.ПолучитьПоследнее();
Вот простейший тогда пример, он будет создавать запись при любом сохранении контрагента
&НаСервере
Процедура ПриЗаписиНаСервере()
НаборЗаписей = РегистрыСведений.ИзменениеСтатуса.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Контрагент.Установить(Объект.Ссылка);
НаборЗаписей.Прочитать();
ЗаписьРегистра = НаборЗаписей.Добавить();
ЗаписьРегистра.Период = ТекущаяДата();
ЗаписьРегистра.Контрагент = Объект.Ссылка;
ЗаписьРегистра.Статус = Объект.Статус;
НаборЗаписей.Записать();
КонецПроцедуры
ПоказатьПо хорошему надо проверять сменился статус или нет, а то будет много записей.
(18)Именно показывать текущий статус ничего не мешает. Вопрос больше с историей изменений, ради которой и создан этот РС. В нём нужно именно историю изменений показывать, а не просто последний статус. А у меня только текущий статус там отражается, а те, что были до этого, нет. А надо, чтобы всё отражалось.
Хммм... Похоже, я рано обрадовался: из 4-х контрагентов только 2 работают, как надо. А по 2-м остальным выдаётся ошибка
"{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(12)}: Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать();
по причине:
Запись не верна! Период не может быть пустым!: ИзменениеСтатуса: 01.01.0001 0:00:00, ООО "Всё для дома" (Регистр сведений: Изменение статуса; Номер строки: 1)"
Все 4 контрагента созданы по одному шаблону, примерно в одно и то же время, но 2 из них нормально отрабатывают, а 2 других вываливаются в ошибку. Отладка тоже показывает 2-х "правильных" контрагентов, а 2-х "неправильных" нет. :-( Период не указывается ни для одного контрагента
"{Справочник.Контрагенты.Форма.ФормаЭлемента.Форма(12)}: Ошибка при вызове метода контекста (Записать)
НаборЗаписей.Записать();
по причине:
Запись не верна! Период не может быть пустым!: ИзменениеСтатуса: 01.01.0001 0:00:00, ООО "Всё для дома" (Регистр сведений: Изменение статуса; Номер строки: 1)"
Все 4 контрагента созданы по одному шаблону, примерно в одно и то же время, но 2 из них нормально отрабатывают, а 2 других вываливаются в ошибку. Отладка тоже показывает 2-х "правильных" контрагентов, а 2-х "неправильных" нет. :-( Период не указывается ни для одного контрагента
(25) Это, конечно, очень полезная информация – то, что я не умею... Только я бы здесь и не писал, если бы всё знал и умел. :-)
А по существу моего вопроса? Каким образом моё умение/неумение влияет на то, что 2 контрагента нормально отрабатывают, а ещё 2 требуют указать период при том, что период не указывается ни в том, ни в другом случае? Ведь по идее работать всё должно одинаково – сведения о статусах должны фиксироваться для каждого контрагента независимо от того, что это за контрагент.
А по существу моего вопроса? Каким образом моё умение/неумение влияет на то, что 2 контрагента нормально отрабатывают, а ещё 2 требуют указать период при том, что период не указывается ни в том, ни в другом случае? Ведь по идее работать всё должно одинаково – сведения о статусах должны фиксироваться для каждого контрагента независимо от того, что это за контрагент.
(24) А записи без даты откуда появились? Попробуй руками любую дату меньше текущей занести у них и потом изменить статус через карточку контрагента.
п.с. такую ошибку можно получить если не устанавливать значение ЗаписьРегистра.Период, проверь что установка даты на месте.
п.с. такую ошибку можно получить если не устанавливать значение ЗаписьРегистра.Период, проверь что установка даты на месте.
(27) Записи без даты появились, когда РС был непериодическим.
И опять-таки непонятно: в одно и то же время я создал 4-х контрагентов (набор реквизитов и всего прочего у всех 4-х одинаков). В итоге 2 контрагента при смене статуса отрабатывают стандартно, а ещё 2 ругаются на период. Где это чёртово значение периода нужно указать, и почему требуют указывать его только 2 контрагента из 4-х (ещё раз напишу: все 4 контрагента созданы в одно и то же время и имеют одинаковый набор характеристик)?
И опять-таки непонятно: в одно и то же время я создал 4-х контрагентов (набор реквизитов и всего прочего у всех 4-х одинаков). В итоге 2 контрагента при смене статуса отрабатывают стандартно, а ещё 2 ругаются на период. Где это чёртово значение периода нужно указать, и почему требуют указывать его только 2 контрагента из 4-х (ещё раз напишу: все 4 контрагента созданы в одно и то же время и имеют одинаковый набор характеристик)?
(29) Всё, я понял, почему ругался Регистр. Записи об этих 2 контрагентах, на которых он ругался (ИП Иванов А. Б. и ООО "Всё для дома", были первоначально созданы мной вручную через кнопку "Создать" (для пробы). После того, как я удалил эти записи из Регистра, всё заработало, как положено.
Извините, что отнял столько времени у вас. :-) В следующий раз постараюсь быть более краток. :-) А за подсказку ещё раз спасибо (13). :-)
Извините, что отнял столько времени у вас. :-) В следующий раз постараюсь быть более краток. :-) А за подсказку ещё раз спасибо (13). :-)
а теперь новая вводная:
допустим Статус у контрагента изменили программно! (например регламентом или групповой обработкой)
или он изменился при обмене данных!
вся эта ваша свистопляска работать не будет!
(что бы работало, необходимо перенести функционал в модуль справочника Контрагенты, осилите?)
допустим Статус у контрагента изменили программно! (например регламентом или групповой обработкой)
или он изменился при обмене данных!
вся эта ваша свистопляска работать не будет!
(что бы работало, необходимо перенести функционал в модуль справочника Контрагенты, осилите?)
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот