|
Внешняя обработка заполнения ТЧ...опять она!? | ☑ | ||
---|---|---|---|---|
0
newbling
15.09.16
✎
16:48
|
Доброго времени суток. Я знаю, миллион вопросов, но всё же. Может можно более адекватно решить проблему заполнения, чем как в знаменитой публикации, которую, кажется, многие взяли за основу: http://catalog.mista.ru/public/84119/
Просто вот делаю: Для каждого ТекСтрока Из ВладелецОбъект.Товары Цикл ТекСтрока.СуммаВзаиморасчетов = ТекСтрока.Сумма*КурсТекДок; //КурсТекДок достаётся ранее Сообщить(ТекСтрока.СуммаВзаиморасчетов); КонецЦикла; Сообщение показывает, что всё расчитывается, но данные формы не обновляются - попробовал поиграться со всякими обновлениями данных - нет. Может там получится Данные формы в значение перевести, с ним поработать, а потом обратно пульнуть. Т.е. обойтись без всяких окон и поиска по наименованиям и создания каких-то лишних форм? |
|||
1
newbling
15.09.16
✎
16:49
|
Да, ВладелецОбъект - ранее определён как ВладелецФормы.Объект
|
|||
2
MishaD
15.09.16
✎
17:01
|
Я делал как написано в 93 комментарии этой публикации(предпоследний). Все нормально работало.
|
|||
3
В тылу врага
15.09.16
✎
17:06
|
(0) УФ?
|
|||
4
jsmith
15.09.16
✎
17:16
|
ВладелецФорма.Прочитать()
|
|||
5
newbling
16.09.16
✎
11:06
|
(4) попробовал, ничего не произошло.
(3) да, управляемые формы (2) что-то я попробовал, просто открывается пустая форма и тоже безрезультатно |
|||
6
jsmith
16.09.16
✎
11:18
|
(0) на клиенте или на сервере?
|
|||
7
newbling
16.09.16
✎
11:19
|
сек, я пробую как в (2), наверное я её регистрирую неправильно - на открытие формы, надо же на заполнение объекта.
|
|||
8
jsmith
16.09.16
✎
11:19
|
Приведи весь код
|
|||
9
newbling
16.09.16
✎
11:29
|
(8) ну я сейчас пробую заполнить как в (2) - не пойму, не даёт постить
|
|||
10
newbling
16.09.16
✎
11:40
|
Параметры Регистрации = Новый Структура;
Массив Назначений = Новый Массив; Массив Назначений.Добавить("Документ.Поступление Товаров Услуг"); Параметры Регистрации.Вставить("Вид", "Заполнение Объекта"); Параметры Регистрации.Вставить("Назначение", Массив Назначений); Параметры Регистрации.Вставить("Наименование", "Расчет суммы взаиморасчетов по курсу взаиморасчетов документа"); Параметры Регистрации.Вставить("Версия", "1.0"); Параметры Регистрации.Вставить("Безопасный Режим", Истина); Параметры Регистрации.Вставить("Информация", "Рассчитывает суммы взаиморасчетов по курсу взаиморасчетов документа"); Таблица Команд = Получить Таблицу Команд(); Добавить Команду(Таблица Команд, "Рассчитать сумму взаиморасчетов", "Рассчитать Сумму Взаиморасчетов", "Заполнение Формы", Ложь); Параметры Регистрации.Вставить("Команды", Таблица Команд); Возврат Параметры Регистрации; |
|||
11
newbling
16.09.16
✎
11:40
|
пришлось всё разделить, а то миста не пропускала
|
|||
12
newbling
16.09.16
✎
11:41
|
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
ПараметрыРегистрации = СведенияОВнешнейОбработке(); ПараметрыРегистрации.Команды.Колонки.Идентификатор.Имя = "ИмяКоманды"; ЭтаКоманда = ПараметрыРегистрации.Команды.Найти(ИмяКоманды, "ИмяКоманды"); Если ЭтаКоманда = Неопределено Тогда ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку( НСтр("ru = 'Команда ""%1"" не поддерживается обработкой ""%2""'"), ИмяКоманды, Метаданные().Представление() ); КонецЕсли; Если ИмяКоманды = "РассчитатьСуммуВзаиморасчетов" Тогда РассчитатьСуммуВзаиморасчетов(ПараметрыВыполнения.ЭтаФорма, ПараметрыВыполнения.РезультатВыполнения); КонецЕсли; КонецПроцедуры |
|||
13
newbling
16.09.16
✎
11:41
|
&НаСервере
Процедура РассчитатьСуммуВзаиморасчетов(Форма, РезультатВыполнения) ВладелецОбъект = Форма.Объект; КурсТекДок = ПолучитьКурсТекДок(ВладелецОбъект); Для каждого ТекСтрока Из ВладелецОбъект.Товары Цикл ТекСтрока.СуммаВзаиморасчетов = ТекСтрока.Сумма*КурсТекДок; Сообщить(ТекСтрока.СуммаВзаиморасчетов); КонецЦикла; Форма.Модифицированность = Истина; СтандартныеПодсистемыКлиентСервер.ВывестиСообщение( РезультатВыполнения, НСтр("ru = 'Сумма взаиморасчетов успешно заполнена по курсу документа'")); КонецПроцедуры &НаСервере Функция ПолучитьКурсТекДок(ВладелецОбъект) пОтбор = Новый Структура; пОтбор.Вставить("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Курс взаиморасчетов")); НСтроки = ВладелецОбъект.ДополнительныеРеквизиты.НайтиСтроки(пОтбор); Возврат(НСтроки[0].Значение); КонецФункции |
|||
14
newbling
16.09.16
✎
11:43
|
ну и ругается на недостаточность фактических параметров, при этом вроде как массив назначений должен передавать
|
|||
15
newbling
16.09.16
✎
11:48
|
ещё пробовал сделать вид - "ДополнительнаяОбработка", а ни "ЗаполнениеОбъекта" - тогда в форме делал обработчик, он отрабатывал без ошибок, расчет производил, но данные самой формы не менял
|
|||
16
newbling
16.09.16
✎
11:54
|
ВыполнитьНазначаемуюКомандуДополнительногоОтчетаИлиОбработки(ВнешнийОбъект, Знач ИдентификаторКоманды, ПараметрыКоманды, ОбъектыНазначения, Знач СценарийВБезопасномРежиме = Ложь)
вот сюда не попадает ОбъектыНазначения. Не пойму ка кего туда подпихнуть |
|||
17
assasu
16.09.16
✎
11:55
|
(0)вся работа внешних обработок (отчетов и т.п.) в уф завязана на БСП.
а эта сама БСП обновляется и меняется.. подозреваю что пример ты делаешь на какой то старой версии и если пройдешься отладчиков внимательно то найдешь ошибку типа "ПеречитатьДанныеОбъекта()" в которой после обновления формы она перетирается опять старыми данными. |
|||
18
newbling
16.09.16
✎
11:57
|
(17) и как быть, модуль править? Зачем мне тогда внешняя обработка - проще к форме прикрутить модуль =)
|
|||
19
jsmith
16.09.16
✎
11:58
|
Ад и Израиль какой-то
|
|||
20
assasu
16.09.16
✎
11:58
|
(18) модуль обновить надо.
|
|||
21
jsmith
16.09.16
✎
11:59
|
Какая целевая конфа?
|
|||
22
newbling
16.09.16
✎
11:59
|
ут(11.1.10.199)
|
|||
23
assasu
16.09.16
✎
12:00
|
(22) возьми свужую БП 30 и сравни с ней . процедуры там одинаково называться будут.
на БП 30 у меня есть рабочий пример заполнения ТЧ |
|||
24
newbling
16.09.16
✎
12:01
|
(23) а можешь скинуть?
я так-то прошёлся по модулям отладчиком, вроде данные передаю, а всё равно что-то где-то не указано |
|||
25
jsmith
16.09.16
✎
12:01
|
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт Если ИдентификаторКоманды = "РассчитатьСуммуВзаиморасчетов" Тогда РассчитатьСуммуВзаиморасчетов(ОбъектыНазначения); КонецЕсли; КонецПроцедуры |
|||
26
newbling
16.09.16
✎
12:02
|
(25) это в модуле объекта - откуда там &НаКлиенте
|
|||
27
assasu
16.09.16
✎
12:02
|
(24) не могу. все в другом месте.
рабочий вариант не отличается от НЕ рабочего. он просто на БП 30 стал рабочим |
|||
28
jsmith
16.09.16
✎
12:03
|
Хотя у тебя вообще переписать всё надо
|
|||
29
assasu
16.09.16
✎
12:04
|
(24) искать надо кусок что отрабатывает после выполнения твоей команды. После того как вернешься из процедуры ВыполнитьНазначаемуюКомандуДополнительногоОтчетаИлиОбработки
|
|||
30
newbling
16.09.16
✎
12:05
|
(28) ну давай определимся, там надо "ЗаполнениеОбъекта" или "ДополнительнаяОбработка" в виде - от этого зависит какие параметры ему нужны и что где будет открываться
Если "ДополнительнаяОбработка", то форма открывается |
|||
31
newbling
16.09.16
✎
12:06
|
(29) ВыполнитьНазначаемуюКомандуДополнительногоОтчетаИлиОбработки - туда попадает, но не передаётся параметр ОбъектыНазначения почему-то. Видать, я туда как-то не так передаю
|
|||
32
jsmith
16.09.16
✎
12:07
|
В модуле так надо
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда //////////////////////////////////////////////////////////////////////////////// // ПРОГРАММНЫЙ ИНТЕРФЕЙС #Область ПрограммныйИнтерфейс Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.5.36"); ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта(); ПараметрыРегистрации.Версия = "1.0"; ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваровУслуг"); ПараметрыРегистрации.Наименование = "Расчет суммы взаиморасчетов по курсу"; ПараметрыРегистрации.Информация = "Расчет суммы взаиморасчетов по курсу"; НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = НСтр("ru = 'Рассчитать сумму взаиморасчетов по курсу'"); НоваяКоманда.Идентификатор = "РассчитатьСуммуВзаиморасчетовПоКурсу"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода(); НоваяКоманда.ПоказыватьОповещение = Ложь; Возврат ПараметрыРегистрации; КонецФункции #КонецОбласти #КонецЕсли |
|||
33
newbling
16.09.16
✎
12:08
|
(32) так не взлетает - уже пришлось переделать, по сути в (10) (12) (13) оно же, просто написано так, чтоб скушала программа
|
|||
34
jsmith
16.09.16
✎
12:09
|
В форме обработки
&НаКлиенте Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт Если ИдентификаторКоманды = "РассчитатьСуммуВзаиморасчетовПоКурсу" Тогда Форма = ЭтаФорма.ВладелецФормы; НовыйОбъект = Форма.Объект; РассчитатьСуммуВзаиморасчетовПоКурсу(НовыйОбъект, Форма); КонецЕсли; КопироватьДанныеФормы(НовыйОбъект, Форма.Объект); КонецПроцедуры |
|||
35
jsmith
16.09.16
✎
12:09
|
Ну там КонецЕсли вниз
|
|||
36
jsmith
16.09.16
✎
12:09
|
Ну и процедура у тебя есть. Все.
|
|||
37
newbling
16.09.16
✎
12:10
|
(34) а, т.е. всё равно нужна форма обработки даже с таким видом, сейчас попробую
|
|||
38
jsmith
16.09.16
✎
12:10
|
(37) Конечно
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода(); |
|||
39
jsmith
16.09.16
✎
12:11
|
Надо именно, что на клиенте делать, тогда все отображаться будет сразу
|
|||
40
jsmith
16.09.16
✎
12:12
|
Единственно, что может быть затык с модулем объекта - в моем случае по новому стандарту как бы. Не знаю, в твоей конфе есть это, нет.
|
|||
41
jsmith
16.09.16
✎
12:13
|
Ну, и в процедуре используешь ОбъектыНазначенияМассив[0]
|
|||
42
jsmith
16.09.16
✎
12:14
|
А, не, там же форма. Я уже сам начинаю путаться.
|
|||
43
newbling
16.09.16
✎
12:14
|
(42) ОбъектыНазначенияМассив[0] это где использовтаь, не понял - там типа будет лежать форма, из которой вызвали?
|
|||
44
jsmith
16.09.16
✎
12:15
|
(43) Я попутал. Мимо ушей.
|
|||
45
newbling
16.09.16
✎
12:15
|
(44) понял, сейчас пробую
|
|||
46
newbling
16.09.16
✎
12:18
|
А в процедуре надо писать изменения в Форму?
|
|||
47
hhhh
16.09.16
✎
12:19
|
(46) какая нахрен форма в модуле объекта?
|
|||
48
newbling
16.09.16
✎
12:20
|
Или в НовыйОбъект. Я не совсем понимаю в чём суть
Форма = ЭтаФорма.ВладелецФормы; НовыйОбъект = Форма.Объект; РассчитатьСуммуВзаиморасчетовПоКурсу(НовыйОбъект, Форма); КопироватьДанныеФормы(НовыйОбъект, Форма.Объект); Т.е. мы берём достаём форму владельца, потом из неё объект, передаём, выполняем действия на объекте, а потом копируем данные из объекта на форму? |
|||
49
jsmith
16.09.16
✎
12:22
|
(46)
&НаСервере Процедура РассчитатьСуммуВзаиморасчетов(НовыйОбъект, Форма) КурсТекДок = ПолучитьКурсТекДок(НовыйОбъект); Для каждого ТекСтрока Из НовыйОбъект.Товары Цикл ТекСтрока.СуммаВзаиморасчетов = ТекСтрока.Сумма*КурсТекДок; Сообщить(ТекСтрока.СуммаВзаиморасчетов); КонецЦикла; КонецПроцедуры &НаСервере Функция ПолучитьКурсТекДок(ВладелецОбъект) пОтбор = Новый Структура; пОтбор.Вставить("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Курс взаиморасчетов")); НСтроки = ВладелецОбъект.ДополнительныеРеквизиты.НайтиСтроки(пОтбор); Возврат(НСтроки[0].Значение); КонецФункции |
|||
50
jsmith
16.09.16
✎
12:23
|
Остальное добавь сам по надобности. Я порезал второстепенные параметры.
Форма.Модифицированность, если надо, поставишь на клиенте. |
|||
51
newbling
16.09.16
✎
15:02
|
миста упала. Только вот нельзя же между клиентом и сервером передавать формы, да там и не надо:
НовыйОбъект = ВладелецФормы.Объект; РассчитатьСуммуВзаиморасчетовПоКурсу(НовыйОбъект); КопироватьДанныеФормы(НовыйОбъект, ВладелецФормы.Объект); Вот так взлетело. Т.е. мы всё же копируем объект в переменную, в ней (переменной) вносим изменения, а потом копируем данные измененного объекта из нашей переменной в изначальный объект. Огромное спасибо за помощь! Правда, по сути делаем как в публикации всё равно - созданием копию формы, но хотя бы можно по ВладельцуФормы найти объект однозначно, а ни перебором по окнам, что вообще очень стрёмно смотрится само по себе. Может в момент написания статьи, в БСП не был доступен ВладелецФормы. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |