![]() |
![]() |
![]() |
|
Получение значения реквизита формы из модуля объекта | ☑ | ||
---|---|---|---|---|
0
NIGHTHUNTER
12.05.21
✎
11:11
|
При записи справочника, срабатывает процедура ПередЗаписью() модуля объекта справочника.
В ней вызываются процедуры, делающие запросы по табличной части справочника, выявляя там необходимое значение. Если пользователь, открыл элемент и изменил в нем значение. То смотрю, в отладчике, изменения есть тут - ЭтотОбъект.РолиКонтактногоЛица то есть в ЭтотОбъект но нет тут Ссылка.РолиКонтактногоЛица в ссылка. Тут имеется значение что было записано. То есть тут не видны текущие значения элементов формы, что пользователь правит интерактивно и ещё не записал. Что правильно использовать в таком случае? ЭтотОбъект ? |
|||
1
ДенисЧ
12.05.21
✎
11:19
|
Делай в модуле формы.
|
|||
2
NIGHTHUNTER
12.05.21
✎
11:33
|
(0+) ЭтотОбъект не подойдет конечно, если только ЭтотОбъект.Ссылка
(1) Где правлю так сделано. Пытаюсь править в том же месте. Да возможно стоит начать делать это же в модуле формы. Видел как подобные решения в примере, делают через реквизит, в который в модуле формы помещается значение , а потом в модуле объекта получается. |
|||
3
NIGHTHUNTER
12.05.21
✎
11:34
|
||||
4
Dmitrii
гуру
12.05.21
✎
11:59
|
Странный вопрос.
Перед записью у тебя в памяти ЭтотОъект ещё пока отличается от того, что в базе данных (если объект новый, то в базе данных вообще ещё ничего нет). В базе данных будет тоже самое, что и в памяти уже после того, как запись завершится. Если тебе нужно перед записью что-то проверить или изменить в объекте, то пользоваться обращением к базе данных за получением информации об этом объекте имеет смысл только тогда, когда тебе нужна именно информация которая была раньше - до записи. Работать надо с ЭтотОбъект. >> возможно стоит начать делать это же в модуле формы. Зависит от контекста. Смотря - что именно ты делаешь и для каких целей. И нужны ли твои проверки/изменения в том случае, когда объект записывается вне формы (программно), когда никакой формы не существует. >> нет тут Ссылка.РолиКонтактногоЛица в ссылка. Ты сам понял - что написал? По человечески опиши - что конкретно нужно (задачу) и что ты пытаешься сделать (уже сделал) для её решения. |
|||
5
polosov
12.05.21
✎
12:03
|
(4) Да ему на курсы по УФ надо, а он в продуктовых базах ковыряется.
|
|||
6
NIGHTHUNTER
12.05.21
✎
12:22
|
(4) При открытии формы справочника, нужно что бы отрабатывали проверки на измененные значения в модуле объекта.
Пользователь открыл справочник, поменял значение в табличной части и записывает. А в коде, по заданным условиям, отрабатывает старое значение. Так как берется все из ссылки. В ней видимо только уже записанные значения. Я так понял что нужно делать это в модуле формы, ещё одну проверку. что бы отлавливать эти измененные элементы. то есть нужное значение которое есть в табличной части формы, но ещё не записано. Иначе как это делать в модуле объекта не ясно, как в (3) может, как предлагают |
|||
7
BIP1
12.05.21
✎
12:29
|
(6)
0. Опишите вкраце задачу, а то "При открытии формы справочника, нужно что бы отрабатывали проверки на измененные значения в модуле объекта." - немного белиберда 1. почему в модуле объекта, а не в модуле формы? 2. ЭтотОбъект - содержит текущие, незаписанные значения (если в ПередЗаписью()), ЭтотОбъект.Ссылка - содержит данные, которые записаны. Что мешает сравнивать данные из ЭтотОбъект с данными в ЭтотОбъект.Ссылка? Например, если пользователь на форме изменил значение реквизита Контрагент, то в процедуре ПередЗаписью() ЭтотОбъект.Контрагент <> ЭтотОбъект.Ссылка.Контрагент. |
|||
8
ДедМорроз
12.05.21
✎
12:38
|
При открытии справочника ?
Проверки ? Что можно проверить при открытии? При записи,понятно,что нужно проверять,и,если мы хотим,чтобы в справочник без проверок ничего не записалось,то их нужно делать в модуле объекта. Опять же,если хочется чего-то из формы передать в модуль объекта,то есть ДополнительныеПараметры,куда можно положить все,что может быть сериализовано (так как идёт передача с клиента на сервер). |
|||
9
ДедМорроз
12.05.21
✎
12:41
|
По поводу получения чего-то через точку от Ссылка следует напомнить о кешировании-изменения,сделанные в другом сеансе могут появиться после точки не сразу,а спустя время очистки Кеша,поэтому,если нужно сравнивать,то лучше зачитать объект из базы-на чтение кеширование не распространяется.
|
|||
10
Dmitrii
гуру
12.05.21
✎
12:57
|
(7) Вы забыли задачу описать. Вы описываете тот бред, который уже есть в Вашей голове. А он никому не интересен. В ответ получите только сообщения, что это бред.
Опишите конкретно задачу. |
|||
11
NIGHTHUNTER
12.05.21
✎
13:08
|
(10) Задача такая, у справочника контактная информация есть разные роли.
Если роль мастер, то проверок нет и срабатывает возврат. А если нет, то идет проверка такая, - Для Каждого Строка Из КонтактнаяИнформация Цикл Если Строка.Вид = Справочники.ВидыКонтактнойИнформации.EmailКонтактногоЛица И ЗначениеЗаполнено(Строка.Значение) Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КонтактныеЛицаПартнеровКонтактнаяИнформация.Ссылка КАК Ссылка, | КонтактныеЛицаПартнеровКонтактнаяИнформация.Ссылка.Наименование КАК Наименование |ИЗ | Справочник.КонтактныеЛицаПартнеров.КонтактнаяИнформация КАК КонтактныеЛицаПартнеровКонтактнаяИнформация |ГДЕ | КонтактныеЛицаПартнеровКонтактнаяИнформация.Вид = &Вид | И КонтактныеЛицаПартнеровКонтактнаяИнформация.Значение ПОДОБНО &Значение | И КонтактныеЛицаПартнеровКонтактнаяИнформация.Ссылка <> &Ссылка"; Запрос.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.EmailКонтактногоЛица); Запрос.УстановитьПараметр("Значение", Строка.Значение); //Запрос.УстановитьПараметр("ССылка", Элемент); Запрос.УстановитьПараметр("ССылка", Элемент.Ссылка); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Если Выборка.Следующий() Тогда Отказ = Истина; //Сообщить("Данная электронная почта уже используется. Контактное лицо: " + Выборка.Наименование); Сообщить("|"); Сообщить("Записываемый электронный адрес, уже имеется у контактного лица: " + Выборка.Наименование); Сообщить("Выберете либо другой, электронный адрес, либо установите роль «Master»."); Сообщить("|"); КонецЕсли; КонецЕсли; КонецЦикла; |
|||
12
NIGHTHUNTER
12.05.21
✎
13:11
|
Все это выполняется в процедуре Процедура ПроверитьДублиЭлПочты(Отказ, КонтактнаяИнформация, Элемент) Экспорт
В общем модуле общего назначения сервер. И вот вопрос встал такой, открывает пользователь контактное лицо, у него в роле стоит юзер, он ставит мастер, а проверка все равно срабатывает. Так как в процедуру идут данные объекта с юзером, а мастер в элементах формы только. Вот и встал вопрос как правильно поправить это в общем модуле общего назначения сервер. Или по другому как то делать. |
|||
13
hhhh
12.05.21
✎
13:25
|
(12) вы вообще не туда копаете. Например, у вас 100 контактных лиц. И в одном из них уже есть "мастер". То есть не в этом элементе, а вообще в каком-то другом.
|
|||
14
NIGHTHUNTER
12.05.21
✎
14:21
|
ну и что?
|
|||
15
NIGHTHUNTER
12.05.21
✎
14:23
|
вопрос в текущем элементе, что ели его открываете, там стоит юзер, ставите мастер, а при записи, читается что юзер и не срабатывает, вот в чем вопрос то
я так понял что как вариант делать проверку в модуле формы, где доступны элементы формы как сказали в (1) |
|||
16
hhhh
12.05.21
✎
14:24
|
(14) а вы говорите только про этот элемент. старое и новое значение. А в запросе вообще поиск по всей базе роли Мастер.
|
|||
17
hhhh
12.05.21
✎
14:25
|
(16) + то есть у вас где-то в базе, там среди 10 миллионов контактных лиц уже есть Мастер, поэтому она говорит об ошибке.
|
|||
18
BIP1
12.05.21
✎
14:52
|
(11) Запрос в цикле - код следует удалить и написать заново.
Справочники.ВидыКонтактнойИнформации.EmailКонтактногоЛица тоже не вариант. Используйте ПредопределенноеЗначение() |
|||
19
polosov
12.05.21
✎
14:54
|
(18) Зачем ПредопределенноеЗначение? Он же на сервере.
|
|||
20
NIGHTHUNTER
13.05.21
✎
03:29
|
(16) Да, по условию что такой емайл уже введен. Поиск по емайлу идет. Все там нормально. ТОлько вот с старое и новое значение, загвоздка возникла.
(18) Согласен, возможно, многое придется переделывать. Но я вчера это увидел в первые. По этому пытаюсь разобраться как нужно. (17) Там по логике так, - 1. Если у записываемого контактного лица ЕСТЬ мастер, роль, то проверок нет. Возврат. Возможно это как то придется править. 2. Если мастера нет, то есть работает дальше проверка, проверяется, есть ли данный емайл у уже введенных контактных лиц. Исключая из выборки, сам данный элемент. Вот как. Я не знаю на сколько это все правильно сделано. Уже выявлено при записи, проблемы со старое. новое значение. |
|||
21
BIP1
13.05.21
✎
04:52
|
(18) пардон:) "<...>тоже не вариант" - сказано в состоянии аффекта от увиденного запроса в цикле😀
Через менеджер быстрее (что логично). По этому примеру - на 16% быстрее🙂 В типовых часто в общих серверных модулях и модулях объектов встречается ПредопределенноеЗначение(). &НаСервереБезКонтекста Функция ПроверкаПолученияПредопределенногоЗначенияНаСервере() Переменная = Неопределено; // Получение через менеджер Начало = ТекущаяУниверсальнаяДатаВМиллисекундах(); Для Сч = 1 По 1000000 Цикл Переменная = Перечисления.Перечисление1.ЗначениеПеречисления1 КонецЦикла; Сообщить("Менеджер: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало)); // Получение функцией Начало = ТекущаяУниверсальнаяДатаВМиллисекундах(); Для Сч = 1 По 1000000 Цикл Переменная = ПредопределенноеЗначение("Перечисление.Перечисление1.ЗначениеПеречисления1") КонецЦикла; Сообщить("Функция: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало)) КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |