Имя: Пароль:
1C
1С v8
Обработка заполнения.
0 Raxla
 
12.12.19
20:37
Можно ли как-то передать данные между двумя обработками:

ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты) из этой обработки формы в
ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) эту обработку модуля объекта?

Желательно, через "ДополнительныеСвойства", что бы сам объект не помечался как модифицированный, эта структура доступна только в модуле объекта.

..РеквизитФормыВЗначение("Объект");
...
модуль объекта
ДополнительныеСвойства.Вставить(..
..
ЗначениеВРеквизитФормы(..

Не прокатывает.
1 RomanYS
 
12.12.19
21:07
Через ДополнительныеСвойства нельзя. Рассказывай, что и зачем хочешь передать
2 Raxla
 
13.12.19
10:16
Я понимаю, что интересно поговорить. Но все данные для задачи - описаны.
в обработке на сервере: что-то = истина, в обработке модуля если это что-то. Всё.
3 Raxla
 
13.12.19
10:18
И хотелось бы более развёрнутого ответа, почему нельзя, вот что про них пишут, цитирую:
"Все объекты которые можно записать в системе имеют дополнительные свойста
ДополнительныеСвойства — Структура, которая Может использоваться в тех случаях,
когда необходимо хранить некоторые значения, связанные с объектом, на время выполнения
некоторых операций, без изменения объекта. Например, при обработке событий в подписке
на события."
4 hhhh
 
13.12.19
10:29
(2) вообще вопрос непонятен. Какая-то хрень написана. НО по ходу (1) прав. Там двое дополнительных свойств, у модуля объекта свои, у формы свои. И объекты разные.
5 Raxla
 
13.12.19
11:14
Что именно не понятно? Обработчики вызываются системой, поэтому общие данные они могут иметь только внешние, надо что-то вроде глобальной переменной, типа булеан - достаточно.
6 Borteg
 
13.12.19
11:19
(5) что должно произойти если вызов обработки будет выполняться не из формы ОбработкаПроверкиЗаполненияНаСервере не сработает?
7 Raxla
 
13.12.19
11:22
Отсутствие реквиизита можно проверять в попытке, отстуствие в структуре "Свойство", это не принципиальный момент и на передачу данных из одного обработчика в другой никак не влияет.
8 hhhh
 
13.12.19
11:29
(7) ну просто, первого обработчика не существует. Что тогда за передача будет? откуда-куда?
9 Borteg
 
13.12.19
11:29
(7) ну особо не понятно тогда зачем чтото передавать, проверяй одни реквзииты в модуле формы, другие в модуле объекта
10 Borteg
 
13.12.19
11:30
(7) для этого это и было все сделано, если чтото надо проверить только при наличии формы проверяй в на сервере, другое в объекте
11 Raxla
 
13.12.19
11:32
Очевидно же, что нужно, что бы в модуле объекта изменялось поведение, в зависимости от данных формы или - не изменялось.
12 Borteg
 
13.12.19
11:36
(11) убирай в модуле объекта все что зависит от формы, и переноси в проверку заполнения формы.
Совсем не очевидно. Если это какието переменные -выноси из в реквизиты, или получай таким же методом в начале проверки заполнения(например если чтото в регистре хранится/учетная политика и прочее).
13 Borteg
 
13.12.19
11:37
(11) в типовых куча такого кода, очень сложные проверки в документах реализации и прочего, нигде не понадобилась передача.
14 Raxla
 
13.12.19
11:43
В модуле объекта все проверки нужны, ничего убирать не надо. Идеальный варинт был бы, если бы по вызову ПроверитьЗаполнение() из формы, запускалась только обработка "на сервере", а в остальных работало как и должно.
15 Borteg
 
13.12.19
11:48
(14) всего то? вот поэтому и надо говорить, когда чтото пытаешь делать через одно место и приводит к таким ошибкам, уу формы клиентского приложения есть метод проверитьзаполнение, и оон вызовет только проверку на сервере
16 Borteg
 
13.12.19
11:50
(14) да вообще думаю если посмотреть на код, то скорей всего можно было бы обойтись ручными проверками обычными через значение заполненое, так как теперь на ум приходит что просто лень писать код проверки в процедура заполнения и ткнули просто проверитьзаполнение
17 Raxla
 
13.12.19
11:55
Ничего не лень, документ сложный и динамически помечаются на обязательность заполнения разные поля, зачем потом всё делать руками, если уже есть обработка, которая всё напишет и ткнёт пользователя в нужный элемент?
18 Borteg
 
13.12.19
11:56
(17) динамически звучит громко, но я так понимаю просто массив проверяемых реквизитов дополняете) в этом никакой динамики нету)
19 Borteg
 
13.12.19
11:57
(17) а так вызывайте только метод клиентской формы, а не метод объекта
20 Borteg
 
13.12.19
11:58
(19) форма.проверитьзаполнение()
21 Raxla
 
13.12.19
12:00
Форма - такого нет, а вот такое: ЭтаФорма.ПроверитьЗаполнение(), вызывает обе обработки, объект - проводимый документ.
22 Новиков
 
13.12.19
12:05
Объясни, что не прокатывает конкретно из 0?
23 Raxla
 
13.12.19
12:12
> Объясни, что не прокатывает конкретно из 0?
Конкретно из первого сообщения установка "ДополнительныеСвойства" на стороне модуля из "ОбработкаПроверкиЗаполненияНаСервере" не доживает до вызова "ОбработкаПроверкиЗаполнения", что, в общем-то вполне ожидаемо когда дело касается глобальных переменных и не понятно, почему так происходит когда дело касается объекта.
24 Raxla
 
13.12.19
12:14
> Объясни, что не прокатывает конкретно из 0?
Хотя уже написали, что это разные объекты и в этом можно убедться в отладчике, но этот момент всё равно нифига не понятен.
25 Новиков
 
13.12.19
12:18
(23) (24) приведи полный код ОбработкаПроверкиЗаполненияНаСервере()
26 Raxla
 
13.12.19
12:25
>(23) (24) приведи полный код ОбработкаПроверкиЗаполненияНаСервере()
Это бессмысленное предложение, смотрите вторую часть из 0
27 Borteg
 
13.12.19
12:35
(26) напиши проверку руками
так и не сказал когда вызывается это проверка, при проведении, или просто по кнопке какойто.
просто напиши ее руками, так все делают
28 hhhh
 
13.12.19
12:41
(26) зачем вам два обработчика? Проверяйте всё в первом.
29 Raxla
 
13.12.19
12:42
(27) проверка из модуля работает когда документ проводится из любого места. проверка из формы работает когда документ проводится из формы доплнительно проверяется в модуле. Когда проверку вызывают принудительно должна проверятся только проверка из формы.

Вы предлагаете переписать и вызывать на ручнике проверку в модуле, только потому, что она должна вызываться не всегда из формы. У формы есть реквизит авто-проверка, сейчас попробую без него.
30 hhhh
 
13.12.19
12:49
(29) я не предлагаю, я просто знаю, что везде в типовых конфигурациях только одна проверка, и там у них код посложнее чем у вас, зачем вам вдруг 2 понадобилось.
31 Borteg
 
13.12.19
12:59
(29) чушь полная, открой синтаксис помошник и прочитай про обработчик проверки на сервере, если в нем есть объект, то будет вызывана проверка объекта
32 Raxla
 
13.12.19
13:00
>(30) я не предлагаю, я просто знаю, что везде в типовых конфигурациях только одна проверка, и там у них код посложнее чем у вас, зачем вам вдруг 2 понадобилось.

Это типовой функциал и он логичен. В модуле объекта обработчик будет работать когда проводят из формы списка, то есть никакой формы объекта нет, в модуле формы обработчик работает контролируя интерактив. Всё что нужно это:
проведение : модуль объекта
сохранение : модуль формы
интерактивное проведение: модуль формы + модуль объекта

Проблема в том, что интерактивно всегда запускаются оба обработчика.
33 Raxla
 
13.12.19
13:01
>(31) чушь полная, открой синтаксис помошник и прочитай про обработчик проверки на сервере, если в нем есть объект, то будет вызывана проверка объекта

В нём есть объект, вот доступня мне справка:

Вызывается расширением формы при необходимости проверки заполнения реквизитов при записи в форме, а также при выполнении метода ПроверитьЗаполнение.
Для вызова проверки заполнения системой необходимо, чтобы у формы (с которой происходит работа) было установлено свойство ПроверятьЗаполнениеАвтоматически. В этом случае вначале будет вызван данный обработчик, а затем обработчик ОбработкаПроверкиЗаполнения() модуля объекта.
Позволяет разработчику конфигурации самостоятельно реализовать проверку заполнения в обработчике события. При этом в обработчике можно полностью отказаться от системной обработки (очистив список проверяемых реквизитов), отказаться от проверки системой части реквизитов (выполнив проверку отдельных реквизитов особенным образом и исключив эти реквизиты из списка), а также добавить для проверки другие реквизиты, проверка которых не была указана.
34 Borteg
 
13.12.19
13:01
(32) не нужно, все описано давно, вы не знаете как это происходит. Если Вы не можете написать правильный код в логике этих 2 обработчиков это проблема не 1с.
35 Borteg
 
13.12.19
13:03
(33) (33) В этом случае вначале будет вызван данный обработчик, а затем, если в списке проверяемых реквизитов присутствует реквизит <Объект>, обработчик
36 hhhh
 
13.12.19
13:06
(33) вот это непонятно "что бы сам объект не помечался как модифицированный"? зачем это? ведь понятно, что проверяют только модифицированные объекты. Немодифицированный какой смысл проверять?
37 Borteg
 
13.12.19
13:07
(33)     
    ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Объект"));
38 Borteg
 
13.12.19
13:07
(33) если не хочешь вызоыва проверки модуля объекта код в 37
39 Raxla
 
13.12.19
13:16
(38) То есть, если в обработку ОбработкаПроверкиЗаполненияНаСервере передаётся только Объект, то вся проверка полей происходит исключительно в модуле объекта? Потому что на незаполненные поля больше не ругается, но при этом в модуле объекта нет информации о том, какое поле формы надо активировать и показать, что оно не заполнено, а именно это и происходило.
40 Borteg
 
13.12.19
13:34
(39) Есть две обработки, которые выполняеются одна за другой.
В одной ОбработкаПроверкиЗаполненияНаСервере  проверяются элементы формы, в другой реквизиты объекта.
Передать между ними ничего нельзя.
Ты в процедур какойто у тебя вызываешь обработчик проверитьзаполнение. Из того что я понял, ты хочешь чтобы обработка проверки объекта не выполнялась. У тебя есть какойто крутой флаг(реквизит формы может быть).
ТЫ в ОбработкаПроверкиЗаполненияНаСервере  пишешь если это мой крутой флаг тогда  ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Объект"));
Во всех остальных случаях оставляешь типовой механизм.
41 Raxla
 
13.12.19
14:05
(40) Да, всё в точности так, как вы пишете и это мне подходит.

Но беда в том, что всё работает совсем не так, как мне думалось. Я предполагал, что достаточно установить у элементов формы АвтоПометкуЗаполнения, она устанавливает когда надо ПометкуЗаполнения, после этого в обработке ОбработкаПроверкиЗаполненияНаСервере дополняются реквизиты которые нужно проверить ещё и система сама всё где установлена ПометкаЗаполнения+вручную добавленные проверяет скопом и выдаёт ошибки. То, что на выходе из этой процедуры был только "Объект", интерпретировалось мной как "все помеченные поля этого объекта", в обработчике модуля, в том числе, дублировалась проверка части полей (которые проставляются на входе обработчика без всякого кода, по отметке таких полей в конфигураторе), поэтому, то, что в модуле формы обработчик ничего не делает было вообще не замечено. Более того, даже не предполагалось, что дёргать элементы формы будут по результатам проверки в модуле объекта, а не формы, потому что интерактивно показывается какой элемент формы не заполнен.
Получается, что надо пройтись по всем элементам формы и вручную добавить все элементы с автопометкой на проверку и удалить Объект, тогда выполнится всё правильно.
42 Raxla
 
13.12.19
16:20
(40) ОбработкаПроверкиЗаполненияНаСервере вообще ничего не делает, набиваю ПроверяемыеРеквизиты, которые точно не заполнены, Отказ не устанавливается и никаких сообщений нет. Если предедать вмест с ними Объект, то эти реквизиты в следующую обработку так же не попадают. Нафига, оно такое вообще нужно?