Имя: Пароль:
1C
1С v8
УФ. Ребус. Помогите разобраться
0 mis012
 
18.08.15
09:33
Здравствуйте.
Гружу с экселя в 1с УФ. Все грузиться, всякие обработчики ПриИзмененииКонтрагента, Организации - подключил (перенес в обработку загрузки) - они работают.

Но проблема: на форме если страница, к-я создается программно 1с при создании формы, на ней указывается Бухгалтерская операция, КФО, Счет Дт и т.д.

Никак не могу запустить у себя обработчик события ПриИзмененииТиповойОперации
Не хочу его к себе в люработку переносить - пытаюсь запуститься из общего модуля серверного:
Вот такой вызов делает сама 1с (сокращенно)

БухгалтерскиеОперацииСервер.ПриИзмененииТиповойОперации(Элементы.БухгалтерскаяОперация, ложь);

Т.е. в кач-ве параметра отправляется элемент управления БухгалтерскаяОперация (видимо контейнер для остальных (или страница))

Если я в клиенском модуле своей обработки пишу

БухгалтерскиеОперацииСервер.ПриИзмененииТиповойОперации(Форма.Элементы.ТиповыеОперации_ТиповаяОперацияДокумента, Ложь);

Тогда он даже не компилируется, т.к. с клиентского модуля этот даже не видно.

В серверном модуле я работаю с объектом ДанныеФормыСтруктура - его заполняю.

1) Как мне в нем найти соответсвующий элемент?
2) Я его в серверном модуле на могу отправить.

Как мне осуществить вызов ПриИзмененииТиповойОперации? Или никак и надо все переписывать в свою обработку?
1 mis012
 
18.08.15
09:46
Если на сервере вызываю

БухгалтерскиеОперацииСервер.ПриИзмененииПараметровФункциональныхОпций(ДанныеФормы.ТиповаяОперация);

или

БухгалтерскиеОперацииСервер.ПриИзмененииТиповойОперации(ДанныеФормы.БухгалтерскаяОперация, Ложь);

Тогда он ругается на "Поле объекта не обнаружено"
Да и тип то другой (данные формы структура)
2 mis012
 
18.08.15
09:50
Т.е. перед отправкой на сервер на клиенте вызываю
ДанныеФормы = Форма.Объект
И на сервер его передаю

Т.е. на клиенте перед отправкой на сервер элемент

Форма.Элементы.ТиповыеОперации_ТиповаяОперацияДокумента
или
Форма.Элементы.БухгалтерскаяОперация

имеются, а в объекте:

Форма.Объект их нет!
3 butterbean
 
18.08.15
09:53
(2) зачем ты все это передаешь на сервер? там и так есть твоя форма вместе со всеми реквизитами и элементами.
4 hhhh
 
18.08.15
09:59
Форма.Объект - это же реквизит формы. Откуда в нем вдруг элементы окажутся? Посмотрите на форму. Там элементы слева расположены, Объект справа.
5 mis012
 
18.08.15
10:00
(3) У меня есть общий модуль (в конфу добавил) серверный и клиентский и в них все это делаю.
Т.е. из обработки только вызываю сначала клиентский - там создаю форму загружаемого док-та, а затем в серверном модуле заполняю Форма.Объект - все поля.

Все равно не понимаю, как вызвать обработчки, 1с вызывает сама его из модуля формы! вызывает серверный модуль.

А у меня из клиентского просто это повторить не получается.
6 mis012
 
18.08.15
10:02
(4) Это я знаю, но как правило каждому реквизиту док. соответствует эл-т управления, а тут я не могу найти реквизит, к-й соответсвует этой программной вкладке
Т.е. КФО и ТиповаяОперация, хотя они же должны быть.
7 hhhh
 
18.08.15
10:04
(6) так вы на сервере вызовите это

БухгалтерскиеОперацииСервер.ПриИзмененииТиповойОперации(Форма.Элементы.ТиповыеОперации_ТиповаяОперацияДокумента, Ложь);
8 mis012
 
18.08.15
10:34
(7) Нет
Ошибка отображения типов:
Отсутствует отображение для типа 'УправляемаяФорма'
Туда форму не передать.
М.б. как-то можно ее там воссоздать или получить из Форма.Объект?
9 mis012
 
18.08.15
10:38
Т.е. получается, что элементы формы есть, а таких реквизитов в принципе у док-та нет, т.е. 1с в объекте этого док-та не хранит их (проверил еще и по консоли запросов).
И 1с почему то каким-то волшебством в модуле формы в событии ПриИзмененииОрганизации вызывает СЕРВЕРНОЕ
БухгалтерскиеОперацииСервер.ПриИзмененииТиповойОперации
а просто в обработке или в любом доугом клиентском модуле это не доступно
10 mis012
 
18.08.15
10:40
Может в серверном модуле, передав туда ФОрма.Объект - типа ДанныеФормыСтруктура
воссоздать полноценную форму но уже на сервере?
Опять же мне надо ее потом вернуть на клиент...
11 hhhh
 
18.08.15
10:44
нет, не получится. ДанныеФормыСтруктура оно конкретно к форме привязано. Его отдельно не передать.
12 mis012
 
18.08.15
10:50
(11) так почему я их передаю на сервер и там не могу обратиться к этим полям?
Они только в элементах управления есть
13 mis012
 
18.08.15
10:54
Вот что 1с делает в этой процедуре ПриИзмененииТиповойОперации.
Сейчас попробую перетащить ее себе в клиентский модуль, только она за собой еще тянет процедуры.

Если ПолеДляРеквизитовОперации.Имя = "ТиповыеОперации_ТиповаяОперацияДокумента" Тогда
        ПолеДляРеквизитовОперации = ПолеДляРеквизитовОперации.Родитель;
    КонецЕсли;
    
    Форма = БухгалтерскиеОперацииКлиентСервер.ПолучитьРодителяПоТипуЭлемента(ПолеДляРеквизитовОперации, Тип("УправляемаяФорма"));
    Объект = Форма["Объект"];
    ТиповаяОперация = Форма["ТиповаяОперация"];
    
    УдалитьПодчиненныеЭлементыГруппыФормы(Форма, ПолеДляРеквизитовОперации, БухгалтерскиеОперацииКлиентСервер.ПрефиксЭлементовОперации());
    
    РеквизитыФормы = ПолучитьИменаРеквизитовФормы(Форма);
    
    ТипЗначенияСсылки = ТипЗнч(Объект.Ссылка);
    ИдентификаторДокумента = ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗначенияСсылки);
    
    ВалютныйУчет = ВДокументеИспользуетсяВалютныйУчет(ИдентификаторДокумента);
    
    ДобавлятьДопРеквизитыОперации = ЗначениеЗаполнено(ТиповаяОперация);
                                    
    ПараметрыДобавленияЭлементовФормы = ПараметрыДобавленияЭлементовФормы();
    ПараметрыДобавленияЭлементовФормы.Форма                         = Форма;
    ПараметрыДобавленияЭлементовФормы.Объект                         = Объект;
    ПараметрыДобавленияЭлементовФормы.ТипЗначенияСсылки             = ТипЗначенияСсылки;
    ПараметрыДобавленияЭлементовФормы.ПолеДляРеквизитовОперации     = ПолеДляРеквизитовОперации;
    ПараметрыДобавленияЭлементовФормы.ДобавлятьДопРеквизитыОперации    = ДобавлятьДопРеквизитыОперации;
    ПараметрыДобавленияЭлементовФормы.ПовторноеЧтениеОбъекта        = Истина;
    ПараметрыДобавленияЭлементовФормы.РеквизитыФормы                = РеквизитыФормы;
    ПараметрыДобавленияЭлементовФормы.ВалютныйУчет                    = ВалютныйУчет;
    ПараметрыДобавленияЭлементовФормы.ТиповаяОперация                = ТиповаяОперация;
    
    ДобавитьРеквизитыЭлементыНаФорму(ПараметрыДобавленияЭлементовФормы);
    
    Если ЗаполнятьЗначенияПоУмолчанию Тогда
//        РеквизитыФормы = Форма.ПолучитьРеквизиты();
        ЗначенияДопРеквизитов = РеквизитыТиповойОперацииПоУмолчанию(ИдентификаторДокумента, ТиповаяОперация, Объект.Организация);
        ЗаполнитьДополнительныеРеквизитыВФорме(Форма, ТиповаяОперация, ЗначенияДопРеквизитов);
        ПроверитьЗначенияДополнительныхРеквизитовПоУстановленнымОтборам(Форма, Объект, ТиповаяОперация);
    КонецЕсли;
    УстановитьДоступностьЗависимыхРеквизитовФормы(Форма, ПолеДляРеквизитовОперации);
14 hhhh
 
18.08.15
10:57
(13) ну то есть на 100% это работа с формой. Вам вообще это не нужно в вашей обработке. Потому что у вас вообще в обработке форм нет. Вы грузите из excel в документ.
15 mis012
 
18.08.15
10:57
По моему это недоработка 1с.
Нафик так изголяться, ради 1 обработчика события, или надо забить на это и юзера заставлять выбирать руками операцию в уже загруженном док-те.
16 mis012
 
18.08.15
10:59
(14) Вообще то я стал грузить не в документ,а как раз в форму, а она при записи сами создает документ объект.
Если надо, а если не надо ее закрывают.
17 mis012
 
18.08.15
11:01
(14) Я даже не подумал, а если писать сразу в документ, тогда надо еще как-то записывать отдельно результат проведения, т.к. бух счета и проводки вообще не храняться в объекте?

И к тому же форму создавать удобнее, т.к. ее (если не понравиться) можно закрыть, а док-то только помечать на удаление.
18 hhhh
 
18.08.15
11:06
(17) но форма работает в 25 раз медленнее, чем документ. То есть ваша загрузка на 97% будет лопатить всякую постороннюю фигню.

И на форме тоже нет проводок.
19 mis012
 
18.08.15
11:25
(18) Хорошо, если создавать документ сразу как объект, могу я в серверном модуле (где буду его заполнять) создать форму из этого объекта, но на сервере, чтобы вызвать этот обработчик?
20 hhhh
 
18.08.15
12:08
так вы что грузите? Зачем вам этот обработчик? Он же занимается изменением формы. Данные вообще не трогает.
21 mis012
 
18.08.15
12:39
(20) Так в зависимости от операции программа сама счет Дт ли Кт ставит, и в зависимости от операции там картинка разная (т.е. разные эл-ты доступны)
Соответственно, если я запущу обработчик, то юзеру на пару действий меньше делать надо руками, а если грузит большой объем то это м.б. чувствительно.

А без этого программа все равно сругается, пока даные поля не будут заполнены.