Имя: Пароль:
1C
 
Получение значения реквизита формы из модуля объекта
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")
    КонецЦикла;
    Сообщить("Функция: " + (ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало))
    
КонецФункции
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший