Имя: Пароль:
1C
1С v8
Реквизит для Объекта и Ссылки
0 Mikhail Volkov
 
18.02.16
15:00
Запутался в конец со значением реквизита для Объекта и Ссылки. Открываю документ, устанавливаю, и проверяю, что не 0:
Объект.МойРеквизит = МояФункция();
Сообщить("МойРеквизит = " + МойРеквизит);
Провожу документ, по шагам отслеживаю... в процедуре проведения вызывается процедура из менеджера, куда передает мой документ как ссылку. А там Ссылка.МойРеквизит = 0!? Как сделать, чтобы Ссылка.МойРеквизит имел нужное мне значение МояФункция()?
1 mikecool
 
18.02.16
15:06
эээ, ты прикалываешься?
2 Mikhail Volkov
 
18.02.16
15:13
(1) Нет, МойРеквизит перед проведением успевает сброситься в 0?
3 mikecool
 
18.02.16
15:15
как бы объект <> ссылка
ссылка - то , что в базе
объект - то, что в форме
как то так
4 zak555
 
18.02.16
15:15
передавай не ссылку, а объект
5 Mikhail Volkov
 
18.02.16
15:25
(3) т.е. до записи возможно объект <> ссылка, а запишется после проведения!? Странно как-то...
(4) не хочется в ОбработкаПроведения() вносить изменения
6 Mikhail Volkov
 
18.02.16
15:29
(3) Не скорее МойРеквизит перед проведением успевает сброситься в 0. Вот только где, как это отловить?
7 Михаил Козлов
 
18.02.16
15:29
(5) "т.е. до записи возможно объект <> ссылка, а запишется после проведения!" после записи. Если проведение не выполнится - отменится транзакция и реквизит останется старым.
8 Карупян
 
18.02.16
15:30
сделай замер, там поиск по ИмяРеквизита
9 Михаил Козлов
 
18.02.16
15:30
(7) В предопределенных процедурах объекта: ПередЗаписью, ПриЗаписи, проведении.
10 Лефмихалыч
 
18.02.16
15:32
>А там Ссылка.МойРеквизит = 0
все правильно. Значение не записано еще в базу. Если ты попытаешься получить это ПриЗаписи, то оно там уже будет
11 Mikhail Volkov
 
18.02.16
15:41
(7) Все же вначале объект записывается, становится ссылка = объект, проводится... если неудачно, запись отменяется!? Значит все же МойРеквизит перед проведением успевает сброситься в 0.
(8) Можно подробнее? не делал...
12 GROOVY
 
18.02.16
15:50
Объект.МойРеквизит и МойРеквизит как бы разные вещи...
13 GROOVY
 
18.02.16
15:51
И я так понимаю это УФ. И все это в событии Перед]записью?
14 Mikhail Volkov
 
18.02.16
15:55
(12) в (0) Сообщить("МойРеквизит = " + Объект.МойРеквизит); - не дописал
(13) Да УФ, в модуле формы до записи (или вручную): Объект.МойРеквизит = МояФункция();
15 GROOVY
 
18.02.16
15:56
(14) Событие какое?
Реквизит какой тип имеет?
16 Mikhail Volkov
 
18.02.16
16:04
(15) Документ СписаниеБезналичныхДенежныхСредств, событие при ПересчитатьКурсКонвертации(); (например, при банковских счета, валют), реквизит число КурсКонвертации. Обычно он задействован в хоз. операции КонвертацияВалюты, в остальных равен 0. А мне понадобился при ОплатеПоставщику
17 Mikhail Volkov
 
18.02.16
16:12
(16) > (например, при смене банковских счетов, валют)
18 Mikhail Volkov
 
18.02.16
16:28
(13) Да, сбрасывается в ПередЗаписью() // Очистим реквизиты документа не используемые для хозяйственной операции.
19 Лефмихалыч
 
18.02.16
16:29
(18) оно не сбрасывается, оно еще не установлено
20 samozvanec
 
18.02.16
16:29
(16) "событие при ПересчитатьКурсКонвертации(); (например, при банковских счета, валют)"

чето у меня нет таких событий
21 samozvanec
 
18.02.16
16:41
короче, раз так все плохо, попробуем так:

1. сначала была транзакция
2. потом была перед записью, в которой у объекта и ссылки отличаются реквизиты даже внутрях транзации
3. потом была при записи(запись совершена, но транзакция не зафиксирована)
4. потом была обработка проведения
5. потом закончилась транзакция, и для всех тварей базы данных потерялись различия между данными ссылки и объекта

как то примерно так
22 Mikhail Volkov
 
18.03.16
04:31
Надо в функцию передать несколько реквизитов из формы. Вместо МояФункция(Объект.Реквизит1, Объект.Реквизит2, Объект.Реквизит3) написал МояФункция(Объект.Ссылка) - ошибок нет, но вместо значений в форме передает значения в базе.
Заменил на МояФункция(Объект) - вроде Объект - Данные формы структура, то что надо. Но Ошибка при установке значения атрибута контекста (Объект) Нельзя изменять поле, содержащее объект данных формы!?
Заменил на МояФункция(ЭтотОбъект ) - Управляемая форма, дает
Ошибка при вызове серверного метода по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
Заменил на МояФункция(ЭтаФорма) - примерно та же ошибка. Как правильно?
23 Mikhail Volkov
 
18.03.16
05:16
В самой функции добавил: МояФункция(Знач Объект) - ошибки не стало
24 hhhh
 
18.03.16
07:04
(23) зачит ты в этой своей функции Объект меняешь.
25 GROOVY
 
18.03.16
07:20
Прошел месяц...
26 b_ru
 
18.03.16
07:37
Относительно правильно было бы
МояФункция(РеквизитФормыВЗначение("Объект")

Но это только на первый взгляд, возможно там идеалогически не верно все понаписано.

Лучше всего взять какую-нибудь типовую (например, УНФ - она самая маленькая и относительно простая) и посмотреть, как там реализуется проведение.
27 Лефмихалыч
 
18.03.16
08:18
(22) зачем ты все это делаешь?
28 Mikhail Volkov
 
18.03.16
08:23
(27) Просто короче хотел написать, без списка реквизитов.
(24) Было желание, но обошлось.
(25) Подзабыл...
(26) Вызов МояФункция() на клиенте.
29 Лефмихалыч
 
18.03.16
08:24
(28) я спрашиваю о задаче - что и зачем ты делаешь?
30 Mikhail Volkov
 
18.03.16
11:37
(29) Делал ERP Воссоздание управленческого учета месяц назад, а теперь попросили добавить сервис по ручной корректировки документов конвертации валюты. Из клиент-банка они грузятся с офиц. курсом. Добавил контроль курса банка по "Назначение платежа", и суммам конвертации.
С УФ мало работаю (в основном в Альфа-Авто), чем в них отличаются Объект, ЭтотОбъект, и ЭтаФорма только догадываюсь по обычным формам.
31 Mikhail Volkov
 
18.03.16
13:43
(26) А теперь понадобилась функция переоформляющая Объект ПоступлениеБезналичныхДенежныхСредств на валютный р/счет по "основанию" - нахожу СписаниеБезналичныхДенежныхСредств с р/счета (той же банковской транзакции) и переношу из него суммы конвертации и курс. Как это в УФ делается?
32 Лефмихалыч
 
18.03.16
13:46
(30) ни чего не понял
33 Mikhail Volkov
 
18.03.16
14:21
(32) Из клиент-банка грузятся документы конвертации валюты с офиц. курсом (так положено по регл. учету), и по нему рассчитываются суммы после конвертации (правильно грузится только сумма документов). Это надо поправить для упр. учета по курсу банка ручками. Поправили Списание ДС с рублевого р/счета, а Поступление ДС этой же суммы (только в валюте) на валютный р/счет можно "по основанию" переоформить - вот и весь сервис. Для обычных форм пустяк, для УФ затрудняюсь.
34 Mikhail Volkov
 
20.03.16
15:43
(26) Смотрел пример на РеквизитФормыВЗначение
лЭтотОбъект = РеквизитФормыВЗначение("Объект");
лЭтотОбъект.КакаяТоПроцедураВМодулеОбъекта();// Если оно вообще нужно!
ЗначениеВРеквизитФормы(лЭтотОбъект, "Объект");

Мне это хочется сделать в общем модуле МоиДоработки:
&НаКлиенте
Процедура РазрешеноПереоформитьПоОснованию(РезультатВопроса, ДополнительныеПараметры) Экспорт
    
    Если РезультатВопроса <> КодВозвратаДиалога.Отмена Тогда
        Объект.ДокументОснование = ДополнительныеПараметры.ДокументОснование;
        МоиДоработки.ПереоформитьПоОснованию(Объект);
    КонецЕсли;
    
КонецПроцедуры

В МоиДоработки:

Процедура ПереоформитьПоОснованию(Знач Объект) Экспорт
    лЭтотОбъект = РеквизитФормыВЗначение("Объект");
//    лЭтотОбъект.КакаяТоПроцедураВМоемМодуле();// Если оно вообще нужно!
    Основание = лЭтотОбъект.ДокументОснование;
    лЭтотОбъект.СуммаДокумента     = Основание.СуммаКонвертации;
    лЭтотОбъект.СуммаКонвертации = Основание.СуммаДокумента;
    лЭтотОбъект.КурсКонвертации     = Основание.КурсКонвертации;
    ЗначениеВРеквизитФормы(лЭтотОбъект, "Объект");    
КонецПроцедуры

Взлетит?
35 Mikhail Volkov
 
22.03.16
15:03
Взлетело:
Процедура ПереоформитьПоОснованию(ЭтаФорма, Объект) Экспорт
    лЭтотОбъект = ЭтаФорма.РеквизитФормыВЗначение("Объект");
    Основание = лЭтотОбъект.ДокументОснование;
    лЭтотОбъект.СуммаДокумента     = Основание.СуммаКонвертации;
    лЭтотОбъект.СуммаКонвертации = Основание.СуммаДокумента;
    лЭтотОбъект.КурсКонвертации  = Основание.КурсКонвертации;
    ЭтаФорма.ЗначениеВРеквизитФормы(лЭтотОбъект, "Объект");    
КонецПроцедуры

А Объект нельзя как-то получить из ЭтаФорма типа как в обычных формах:
Объект = ЭтаФорма.ЭтотОбъект; Как?
36 Mikhail Volkov
 
22.03.16
15:23
Или наоборот, из Объект получить ЭтаФорма? А то параметр ЭтаФорма можно использовать только в процедуре &НаСервере, хотелось сразу из &НаКлиенте
37 Mikhail Volkov
 
22.03.16
17:34
Никак?
38 aleks_default
 
22.03.16
17:59
Нникак. Раз уж объект от ссылки отличить никак, то клиент-серверное взаимодействие совсем никак.
39 hhhh
 
22.03.16
18:09
(36) на клиенте не бывает объектов, только ссылки.
40 Карупян
 
22.03.16
18:19
Объект = ЭтаФорма.Объект
Но правда это не совсем тот объект.
41 Mikhail Volkov
 
22.03.16
18:29
(40) Такой Объект тоже "Управляемая форма" - если отладчиком смотреть. И не имеет реквизитов: ДокументОснование, ХозяйственнаяОперация и прочих
42 Mikhail Volkov
 
23.03.16
08:13
+ Это если вызывать из процедуры &НаКлиенте, а из &НаСервере, то Объект = ЭтаФорма.Объект - ДанныеФормыСтруктура, и все работает! Почему так?
43 hhhh
 
23.03.16
09:00
(42) ДанныеФормыСтруктура нв клиенте тоже работает. можете спокойно писать Объект.ДокументОснование, Объект.ХозяйственнаяОперация  &НаКлиенте
44 Mikhail Volkov
 
23.03.16
11:10
В форме самого документа &НаКлиенте - Да. У меня процедура ПереоформитьПоОснованию(ЭтаФорма) в общем модуле (используется не только этим типом документов). Если ее вызвать из формы Процедура РазрешеноПереоформитьПоОснованию() &НаКлиенте, то Ошибка при вызове серверного метода.
по причине: Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа
Добавил &НаСервере Процедура ПереоформитьПоОснованиюНаСервере() - из нее работает как надо.
Программист всегда исправляет последнюю ошибку.