Вход | Регистрация



УФ. Можно ли решить типовыми средствами, а не через ... креатив

УФ. Можно ли решить типовыми средствами, а не через ... креатив
Я
   1CIlya
 
04.10.18 - 12:23
Здравствуйте, друзья!

Делаю обработку заполнения ТЧ в ЗУП3 для документа ВедомостьНаВыплатуЗарплатыВБанк. Учу ведомость заполняться из под документа ВыплатаБывшимСотрудникам. С ТЧми все хорошо, они заполняются типовыми функциями по подготовленной ТЗ. А вот форма документа не показывает, что так усердно туда положили. Она расширяет табличную часть Состав у ведомости, и отображает эти "дополнительные" реквизиты, которые естественно, не заполняются серверными функциями общих модулей, которые работают с объектом.

Тем не менее, типовой код имеется. Чтобы заполнить "расширенные" реквизиты нужно вызвать процедуру из модуля формы документа.

&НаСервере
Процедура ПриПолученииДанныхСтрокиСостава(СтрокаСостава) Экспорт
    ВзаиморасчетыССотрудникамиФормыРасширенный.ВедомостьПриПолученииДанныхСтрокиСостава(ЭтаФорма, СтрокаСостава)
КонецПроцедуры

В процедуру нужно передать ФормуДокумента и СтрокуСостава. Т.к. обработка заполнения ТЧ использует ВызовКлиентскогоМетода, дело происходит в ее модуле формы, и переменная ЭтаФорма указывает на форму обработки, а не на форму документа, т.е. на серверной части модуля формы указателя на форму документа нет и с клиента на сервер передать найденную форму документа тоже не получится. Но ее методом воспользоваться возможно, т.к. он экспортный. Но ему нужно передать СтрокуСостава, это строка ТЧ, имеющаяся в наличии у переменной ДанныеФормы. Однако, это тоже вызывает ошибку платформы. Удивительно, сами ДанныеФормы передать на сервер возможно, а маленькую их частичку - строку ТЧ уже нельзя.

Однако, это "препятствие" не остановило прогрессивное человечество на пути к "светлому будущему" и решение было найдено.


&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    
    ...
    ДанныеФормы = ФормаДокумента.Объект;
    ЗаполнитьНаСервере(ДанныеФормы, ФормаДокумента.ХарактерВыплаты);
    Результат = КопироватьДанныеФормы(ДанныеФормы, ФормаДокумента.Объект);
    ФормаДокумента.Модифицированность = Истина;
    
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьНаСервере(ДанныеФормы, ХарактерВыплаты)
    
    ...
    ЗначениеВДанныеФормы(ОбъектНазначения, ДанныеФормы);    
    
    ФормаДокументаПодПрикрытиемЧтобыВызватьСервернуюПроцедуру = Новый Структура("Объект,ХарактерВыплаты", ДанныеФормы, ХарактерВыплаты);
    ВзаиморасчетыССотрудникамиФормыРасширенный.ВедомостьПриПолученииДанныхСтрокиСостава(
        ФормаДокументаПодПрикрытиемЧтобыВызватьСервернуюПроцедуру, ДанныеФормы.Состав[0]);
    
КонецПроцедуры


Конкретно в этом случае повезло. Код типовой процедуры только читает из ФормыДокумента и можно передать структуру вместо нее самой, скопировав необходимые реквизиты. Но это не будет работать в общем случае.

Очень надеюсь, что смог описать задачу с которой столкнулся. Делитесь, пожалуйста, мыслями, можно ли что-то предпринять?
 
 
   Cyberhawk
 
1 - 04.10.18 - 12:40
Можно - предприми попытку выражаться краче
   Cyberhawk
 
2 - 04.10.18 - 12:40
*кратче
   1CIlya
 
3 - 04.10.18 - 12:42
(1) Сорян, что перефразировать?
   Cyberhawk
 
4 - 04.10.18 - 12:59
В трех словах, в чем у тебя вопрос. Без этой предметной шелухи с какими-то названиями конфигурации и документов.
   1CIlya
 
5 - 04.10.18 - 14:56
(4) Нужно вызвать серверную процедуру из модуля формы обработки и передать ей найденную форму документа или передать на сервер строку ТЧ из ДанныхФормы, но не ДанныеФормы полностью.
   Cyberhawk
 
6 - 04.10.18 - 14:58
Делаешь это все на сервере, владелец формы обработки - это форма объекта заполнения
   1CIlya
 
7 - 04.10.18 - 17:05
(6) ВладелецФормы доступен только на клиенте. Конструкция

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт

    ...
    ФормаДокумента = ЭтаФорма.ВладелецФормы;
    Для Каждого СтрокаСостава Из ФормаДокумента.Объект.Состав Цикл
        ФормаДокумента.ПриПолученииДанныхСтрокиСостава(СтрокаСостава);
    КонецЦикла; 
    
КонецПроцедуры


сталкивается с невозможностью передать на сервер строку ТЧ.
Ошибка отображения типов:
Отсутствует отображение для типа 'ДанныеФормыЭлементКоллекции'
   1CIlya
 
8 - 05.10.18 - 10:15
up
   ProxyInspector
 
9 - 05.10.18 - 10:39
Это стандартные проблемы УФ. УФ заточены под ларьки и ручной ввод информации. На них часто в типовом варианте не возможно  организовать корректный ввод документов программно. Только через костыли. Я недавно пытался в БУХ30 программно типовыми методами организовать корректное заполнение СчетовУчета номенклатуры в документах. Победить не смог. Пришлось делать через зад. В Бух 2.0 это делается в одну строчку.
  Я бы писателей и аналитиков типовых гнал бы из профессии за вредительство
   Cyberhawk
 
10 - 05.10.18 - 10:46
(7) "ВладелецФормы доступен только на клиенте" // Точняк. Тогда остается два варианта:
- вызвать какой-нибудь клиентский метод (либо который параметром принимает саму форму-владельца, либо который приводит к контекстному серверному вызову формы-владельца)
- вызвать какой-нибудь серверный метод, который не использует саму форму-владельца
 
 Рекламное место пустует
   0xFFFFFF
 
11 - 05.10.18 - 10:50
(9) думаю это не проблемы УФ, а проблемы "писателей типовых". Проблема УФ - это не проблема. Одинэсникам надо просто один язык, синтаксис и группу файлов с кодом дать для программирования на сервере, а другой (язык, синтаксис и группу файлов) для программирования на клиенте (PHP и JavaScript например). Тогда бы и не плевались на УФ. Песатели типовых разбалованы просто возможностями фигачить в куче &НаСервере, &НаКлиенте. Вот и фигачат бездумно.
   1CIlya
 
12 - 05.10.18 - 10:57
(10) Если обработку перевести в ВызовСерверногоМетода она как-то узнает, кто ее вызвал?
   1CIlya
 
13 - 05.10.18 - 11:02
(9), (11) Особое неудовольствие вызывает невозможность передать на сервер частичку ДанныхФормы - ДанныеФормыЭлементКоллекции, в то время, как полностью они нормально передаются. Понятно, что "в недрах" платформы происходит декомпозиция и все уже написано, в том числе и для ДанныеФормыЭлементКоллекции, нужно лишь дополнить список типов пригодных для транспортировки. Работы не много, а какое ограничение будет снято.
   Фрэнки
 
14 - 05.10.18 - 11:20
(13)// Особое неудовольствие вызывает невозможность передать на сервер частичку ДанныхФормы - ДанныеФормыЭлементКоллекции


Ты что-то нехорошо задумал. У тебя в коде используется такая строка
ЗначениеВДанныеФормы(ОбъектНазначения, ДанныеФормы);

для чего?
   Cyberhawk
 
15 - 05.10.18 - 11:43
(12) Если обработка вида "ЗаполнениеОбъекта", то конечно: ПараметрыВыполнения.ЭтаФорма это и есть форма объекта, в которым вызвано заполнение объекта.
Минус этого вида обработки в том, что никакого интерактивчика в этом случае поиметь нельзя.
   Cyberhawk
 
16 - 05.10.18 - 11:45
Подробнее в 10 посте тут (и далее там ссылка на еще одну тему) Передать форму из вызываемой "ЭтаФорма" к внешней обработке УФ
   Cyberhawk
 
17 - 05.10.18 - 11:49
(там про новый тип команды "ЗаполнениеФормы")
   1CIlya
 
18 - 05.10.18 - 12:46
(14) Это строка завершает этап заполнения ДокументаОбъекта на сервере. Далее сделанные изменения необходимо передать на клиент и показать пользователю, поэтому копируем ДокументОбъект в ДанныеФормы.
   Фрэнки
 
19 - 05.10.18 - 13:41
(18) так никто не делает.

У тебя в контексте на Сервере есть доступ к данным ТЧ объекта. ТЧ объекта непосредственно обновляет свое отображение на форме, это когда поля из ТЧ связаны с колонками в поле списка  на форме. Поэтому в твоем частном случае совершенно не нужно пытаться что-то пихать в данные формы. Данные формы останутся такими, какие они заданы в ТЧ объекта.
   1CIlya
 
20 - 05.10.18 - 14:08
(19) Спасибо! Опишу свой случай подробней.

1. Это обработка заполнения ТЧ, которая заполняет ДокументОбъект. Есть ли у нее в контексте сервера доступ к ТЧ документа?
2. На форме документа состав табличной части расширен (см.(0)). Помимо реквизитов объекта (синего цвета), присутствуют дополнительные реквизиты (красного цвета), которых у ДокументаОбъекта нет. Заполнять их тоже обязательно, т.к. именно их видит пользователь. Оправдано ли применение функции ЗначениеВДанныеФормы(ОбъектНазначения, ДанныеФормы) в этом случае?
   singlych
 
21 - 05.10.18 - 14:21
Так то у обработок заполнения есть доступ к данным формы на сервере.

https://its.1c.ru/db/bsp246doc#content:31:1:issogl3_пример_обработка_заполнения_данных_формы_без_записи_объекта
   1CIlya
 
22 - 05.10.18 - 14:22
(16), (21) Точно! Попробую отпишусь.
   1CIlya
 
23 - 05.10.18 - 15:58
(16), (21), (22) Спасибо, все получилось! Не просто грызть управляемые формы.


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует