Добрый день! Подскажите пожалуйста как определить создание новой записи? Необходимо чтобы при создании нового инцидента, после нажатия на кнопку "ок" запускался новый бизнес процесс. Если просто повесить скрипт на обработчик Post, то скрипт запускается каждый раз после нажатия на "ок", а надо только один раз после первого создания. Append срабатывает до нажатия на ок. Как быть? Заранее спасибо!
Нравится
Правильнее сделать это проанализировав состояние набора данных. (Dataset.State == dstInsert) - добавление записи, (Dataset.State == dstEdit) - редактирование. Поле ID на момент post-а может уже быть заполнено новым идентификатором.
Не помогает, в момент:
function SelfOnDatasetAfterPost(Dataset) { // Старт бизнеспроцесса if (Dataset.State == dstInsert){ //Dataset.State всегда равно 1, что в случае создания, что при редактировании StartWorkflow(Dataset); } }
Dataset.State всегда равно 1, что в случае создания, что при редактировании :(
В какой момент (в обработчике какого события) Вы обращаетесь к набору данных карточки?
P.S. Если есть необходимость определить в обработчике AfterPost была ли запись добавлена или изменена, эту информацию следует самостоятельно сохранить в атрибуты набора данных в обработчике BeforePost:
Dataset.Attributes('IsAppend') = (Dataset.State == dstInsert);
и анализировать в обработчике AfterPost:
if(Dataset.Attributes('IsAppend')) {
В событии
AfterOpen я сохраняю текущие значения некоторых полей в переменные, что бы перед созоранение записи сравнить их с новыми и проверить. Но когда этот датасет открывается в качестве справочника в другой карточке, то значения этих полей не определяются, видимо, потому в том запросе я их не выбираю. Поэтому я хотела при помощи Dataset.State определять для че6го открыт датасет и уже потом решать нужны мне значения полей или нет. но в событии AfterOpen Dataset.State = 1.
Пока ничего на замену придумать не могу. Может, есть какие-либо идеи? Буду очень благодарна.
В обработчике AfterOpen состояние набора данных ВСЕГДА dstBrowse => набор данных открыт. Добавление или редактирование записи в наборе данных - это вызов его метода Edit или Append. После вызова этих методов набор данных переводится в одно из состояний dstInsert или dstEdit.
Опишите подробнее ситуацию, в которой Вам необходимо анализировать состояние набора данных (лучше в терминах объектов, с которыми Вы работаете - контакты, контрагенты, счета и т.п.) - постаремся помочь.
Описать в терминах не совсем удобно, тк это новые разделы и карточки, созданные мною.
Задача такова:
при открытии карточки я в переменные записываю текущие значения полей (AfterOpen). Затем на событии BeforePost я эти переменные сравниваю с новыми значениями полей и решаю, надо ли их записать или нет. При вызове карточки на редактирование мне не важен статус датасета, я бы его и не проверяла, если бы не другое.
В датасете одного из разделов есть поле, подтягиваемое из вышеуказанного датасета. И по нему имеется фильтр (в левом нижнем углу раздела). Так вот, когда вызываю этот фильтр в разделе, то вылетает ошибка, что на событии AfterOpen первого датасета невозможно определить значения полей, которые я сохраняю в переменные. Думаю, как вариант, можно просто добавить значения этих полей в запрос для второго датасета, но не хотелось бы засорять запрос ненужными данными.
Именно поэтому мне и надо как-то определять, для чего вызвано событие AfterOpen или кем, если это возможно.
Есть несколько вариантов решения этой проблемы:
1. Записывать значения нужных полей в переменные не в событии AfterOpen, а в событии AfterEdit.
2. Сделать поля, при обращении к которым происходит ошибка, AlwaysSelect - т.е., чтобы они всегда выбирались при открытии набора данных.
Первый вариант лучше, так как не приводит к выборке лишних данных.