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

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

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

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

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

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


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

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


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

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

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

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


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

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

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

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

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

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