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


1С:Предприятие :: 1С:Предприятие 8 общая

Внешняя обработка заполнения ТЧ...опять она!?

Внешняя обработка заполнения ТЧ...опять она!?
Я
   newbling
 
15.09.16 - 16:48
Доброго времени суток. Я знаю, миллион вопросов, но всё же. Может можно более адекватно решить проблему заполнения, чем как в знаменитой публикации, которую, кажется, многие взяли за основу: http://catalog.mista.ru/public/84119/

Просто вот делаю:
        Для каждого ТекСтрока Из ВладелецОбъект.Товары Цикл
            ТекСтрока.СуммаВзаиморасчетов = ТекСтрока.Сумма*КурсТекДок;//КурсТекДок достаётся ранее

            Сообщить(ТекСтрока.СуммаВзаиморасчетов);
        КонецЦикла;

Сообщение показывает, что всё расчитывается, но данные формы не обновляются - попробовал поиграться со всякими обновлениями данных - нет. Может там получится Данные формы в значение перевести, с ним поработать, а потом обратно пульнуть. Т.е. обойтись без всяких окон и поиска по наименованиям и создания каких-то лишних форм?
 
 
   newbling
 
1 - 15.09.16 - 16:49
Да, ВладелецОбъект - ранее определён как ВладелецФормы.Объект
   MishaD
 
2 - 15.09.16 - 17:01
Я делал как написано в 93 комментарии этой публикации(предпоследний). Все нормально работало.
   В тылу врага
 
3 - 15.09.16 - 17:06
(0) УФ?
   jsmith
 
4 - 15.09.16 - 17:16
ВладелецФорма.Прочитать()
   newbling
 
5 - 16.09.16 - 11:06
(4) попробовал, ничего не произошло.
(3) да, управляемые формы
(2) что-то я попробовал, просто открывается пустая форма и тоже безрезультатно
   jsmith
 
6 - 16.09.16 - 11:18
(0) на клиенте или на сервере?
   newbling
 
7 - 16.09.16 - 11:19
сек, я пробую как в (2), наверное я её регистрирую неправильно - на открытие формы, надо же на заполнение объекта.
   jsmith
 
8 - 16.09.16 - 11:19
Приведи весь код
   newbling
 
9 - 16.09.16 - 11:29
(8) ну я сейчас пробую заполнить как в (2) - не пойму, не даёт постить
   newbling
 
10 - 16.09.16 - 11:40
Параметры Регистрации = Новый Структура;
    Массив Назначений = Новый Массив;
    Массив Назначений.Добавить("Документ.Поступление Товаров Услуг");
    Параметры Регистрации.Вставить("Вид", "Заполнение Объекта");
    Параметры Регистрации.Вставить("Назначение", Массив Назначений);
    Параметры Регистрации.Вставить("Наименование", "Расчет суммы взаиморасчетов по курсу взаиморасчетов документа");
    Параметры Регистрации.Вставить("Версия", "1.0");
    Параметры Регистрации.Вставить("Безопасный Режим", Истина);
    Параметры Регистрации.Вставить("Информация", "Рассчитывает суммы взаиморасчетов по курсу взаиморасчетов документа");
    
    Таблица Команд = Получить Таблицу Команд();
    Добавить Команду(Таблица Команд, "Рассчитать сумму взаиморасчетов", "Рассчитать Сумму Взаиморасчетов", "Заполнение Формы", Ложь);
    Параметры Регистрации.Вставить("Команды", Таблица Команд);

    Возврат Параметры Регистрации;
 
 Рекламное место пустует
   newbling
 
11 - 16.09.16 - 11:40
пришлось всё разделить, а то миста не пропускала
   newbling
 
12 - 16.09.16 - 11:41
Процедура ВыполнитьКоманду(ИмяКоманды, ОбъектыНазначения, ПараметрыВыполнения) Экспорт
    
    ПараметрыРегистрации = СведенияОВнешнейОбработке();
    ПараметрыРегистрации.Команды.Колонки.Идентификатор.Имя = "ИмяКоманды";
    ЭтаКоманда = ПараметрыРегистрации.Команды.Найти(ИмяКоманды, "ИмяКоманды");
    Если ЭтаКоманда = Неопределено Тогда
        ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
        НСтр("ru = 'Команда ""%1"" не поддерживается обработкой ""%2""'"),
        ИмяКоманды,
        Метаданные().Представление()
        );
    КонецЕсли;
    
    Если ИмяКоманды = "РассчитатьСуммуВзаиморасчетов" Тогда
        РассчитатьСуммуВзаиморасчетов(ПараметрыВыполнения.ЭтаФорма, ПараметрыВыполнения.РезультатВыполнения);
    КонецЕсли;
    
КонецПроцедуры
   newbling
 
13 - 16.09.16 - 11:41
&НаСервере
Процедура РассчитатьСуммуВзаиморасчетов(Форма, РезультатВыполнения)
    ВладелецОбъект = Форма.Объект;
    КурсТекДок = ПолучитьКурсТекДок(ВладелецОбъект);
    
    Для каждого ТекСтрока Из ВладелецОбъект.Товары Цикл
        ТекСтрока.СуммаВзаиморасчетов = ТекСтрока.Сумма*КурсТекДок;
        Сообщить(ТекСтрока.СуммаВзаиморасчетов);
    КонецЦикла;
    
    Форма.Модифицированность = Истина;
    
    СтандартныеПодсистемыКлиентСервер.ВывестиСообщение(
    РезультатВыполнения,
    НСтр("ru = 'Сумма взаиморасчетов успешно заполнена по курсу документа'"));
    
КонецПроцедуры

&НаСервере
Функция ПолучитьКурсТекДок(ВладелецОбъект)
    пОтбор = Новый Структура;
    пОтбор.Вставить("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Курс взаиморасчетов"));
    НСтроки = ВладелецОбъект.ДополнительныеРеквизиты.НайтиСтроки(пОтбор);
    Возврат(НСтроки[0].Значение);
КонецФункции
   newbling
 
14 - 16.09.16 - 11:43
ну и ругается на недостаточность фактических параметров, при этом вроде как массив назначений должен передавать
   newbling
 
15 - 16.09.16 - 11:48
ещё пробовал сделать вид - "ДополнительнаяОбработка", а ни "ЗаполнениеОбъекта" - тогда в форме делал обработчик, он отрабатывал без ошибок, расчет производил, но данные самой формы не менял
   newbling
 
16 - 16.09.16 - 11:54
ВыполнитьНазначаемуюКомандуДополнительногоОтчетаИлиОбработки(ВнешнийОбъект, Знач ИдентификаторКоманды, ПараметрыКоманды, ОбъектыНазначения, Знач СценарийВБезопасномРежиме = Ложь)

вот сюда не попадает ОбъектыНазначения. Не пойму ка кего туда подпихнуть
   assasu
 
17 - 16.09.16 - 11:55
(0)вся работа внешних обработок (отчетов и т.п.) в уф завязана на БСП.
а эта сама БСП обновляется и меняется..

подозреваю что пример ты делаешь на какой то старой версии и если пройдешься отладчиков внимательно то найдешь ошибку типа "ПеречитатьДанныеОбъекта()" в которой после обновления формы она перетирается опять старыми данными.
   newbling
 
18 - 16.09.16 - 11:57
(17) и как быть, модуль править? Зачем мне тогда внешняя обработка - проще к форме прикрутить модуль =)
   jsmith
 
19 - 16.09.16 - 11:58
Ад и Израиль какой-то
   assasu
 
20 - 16.09.16 - 11:58
(18) модуль обновить надо.
   jsmith
 
21 - 16.09.16 - 11:59
Какая целевая конфа?
   newbling
 
22 - 16.09.16 - 11:59
ут(11.1.10.199)
   assasu
 
23 - 16.09.16 - 12:00
(22) возьми свужую БП 30 и сравни с ней . процедуры там одинаково называться будут.

на БП 30 у меня есть рабочий пример заполнения ТЧ
   newbling
 
24 - 16.09.16 - 12:01
(23) а можешь скинуть?
я так-то прошёлся по модулям отладчиком, вроде данные передаю, а всё равно что-то где-то не указано
   jsmith
 
25 - 16.09.16 - 12:01
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
    
    Если ИдентификаторКоманды = "РассчитатьСуммуВзаиморасчетов" Тогда
        РассчитатьСуммуВзаиморасчетов(ОбъектыНазначения);                      
    КонецЕсли;
    
КонецПроцедуры
   newbling
 
26 - 16.09.16 - 12:02
(25) это в модуле объекта - откуда там &НаКлиенте
   assasu
 
27 - 16.09.16 - 12:02
(24) не могу. все в другом месте.
рабочий вариант не отличается от НЕ рабочего. он просто на БП 30 стал рабочим
   jsmith
 
28 - 16.09.16 - 12:03
Хотя у тебя вообще переписать всё надо
   assasu
 
29 - 16.09.16 - 12:04
(24) искать надо кусок что отрабатывает после выполнения твоей команды. После того как вернешься из процедуры ВыполнитьНазначаемуюКомандуДополнительногоОтчетаИлиОбработки
   newbling
 
30 - 16.09.16 - 12:05
(28) ну давай определимся, там надо "ЗаполнениеОбъекта" или "ДополнительнаяОбработка" в виде - от этого зависит какие параметры ему нужны и что где будет открываться
Если "ДополнительнаяОбработка", то форма открывается
   newbling
 
31 - 16.09.16 - 12:06
(29) ВыполнитьНазначаемуюКомандуДополнительногоОтчетаИлиОбработки - туда попадает, но не передаётся параметр ОбъектыНазначения почему-то. Видать, я туда как-то не так передаю
   jsmith
 
32 - 16.09.16 - 12:07
В модуле так надо

#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда


////////////////////////////////////////////////////////////////////////////////

// ПРОГРАММНЫЙ ИНТЕРФЕЙС

#Область ПрограммныйИнтерфейс


Функция СведенияОВнешнейОбработке() Экспорт
        
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.5.36");
    
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();
    ПараметрыРегистрации.Версия = "1.0";
    ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеТоваровУслуг");
    ПараметрыРегистрации.Наименование = "Расчет суммы взаиморасчетов по курсу";
    ПараметрыРегистрации.Информация = "Расчет суммы взаиморасчетов по курсу";
    
    НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
    НоваяКоманда.Представление = НСтр("ru = 'Рассчитать сумму взаиморасчетов по курсу'");
    НоваяКоманда.Идентификатор = "РассчитатьСуммуВзаиморасчетовПоКурсу";
    НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
    НоваяКоманда.ПоказыватьОповещение = Ложь;
    
    Возврат ПараметрыРегистрации;
    
КонецФункции

#КонецОбласти
#КонецЕсли
   newbling
 
33 - 16.09.16 - 12:08
(32) так не взлетает - уже пришлось переделать, по сути в (10) (12) (13) оно же, просто написано так, чтоб скушала программа
 
 
   jsmith
 
34 - 16.09.16 - 12:09
В форме обработки
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    
    Если ИдентификаторКоманды = "РассчитатьСуммуВзаиморасчетовПоКурсу" Тогда
        
    Форма = ЭтаФорма.ВладелецФормы;
    
    НовыйОбъект = Форма.Объект;
    
    РассчитатьСуммуВзаиморасчетовПоКурсу(НовыйОбъект, Форма);
    
    КонецЕсли;
    
    КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);    
    
КонецПроцедуры
   jsmith
 
35 - 16.09.16 - 12:09
Ну там КонецЕсли вниз
   jsmith
 
36 - 16.09.16 - 12:09
Ну и процедура у тебя есть. Все.
   newbling
 
37 - 16.09.16 - 12:10
(34) а, т.е. всё равно нужна форма обработки даже с таким видом, сейчас попробую
   jsmith
 
38 - 16.09.16 - 12:10
(37) Конечно
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
   jsmith
 
39 - 16.09.16 - 12:11
Надо именно, что на клиенте делать, тогда все отображаться будет сразу
   jsmith
 
40 - 16.09.16 - 12:12
Единственно, что может быть затык с модулем объекта - в моем случае по новому стандарту как бы. Не знаю, в твоей конфе есть это, нет.
   jsmith
 
41 - 16.09.16 - 12:13
Ну, и в процедуре используешь ОбъектыНазначенияМассив[0]
   jsmith
 
42 - 16.09.16 - 12:14
А, не, там же форма. Я уже сам начинаю путаться.
   newbling
 
43 - 16.09.16 - 12:14
(42) ОбъектыНазначенияМассив[0] это где использовтаь, не понял - там типа будет лежать форма, из которой вызвали?
   jsmith
 
44 - 16.09.16 - 12:15
(43) Я попутал. Мимо ушей.
   newbling
 
45 - 16.09.16 - 12:15
(44) понял, сейчас пробую
   newbling
 
46 - 16.09.16 - 12:18
А в процедуре надо писать изменения в Форму?
   hhhh
 
47 - 16.09.16 - 12:19
(46) какая нахрен форма в модуле объекта?
   newbling
 
48 - 16.09.16 - 12:20
Или в НовыйОбъект. Я не совсем понимаю в чём суть 
    Форма = ЭтаФорма.ВладелецФормы;
    
    НовыйОбъект = Форма.Объект;
    
    РассчитатьСуммуВзаиморасчетовПоКурсу(НовыйОбъект, Форма);
    
    КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);

Т.е. мы берём достаём форму владельца, потом из неё объект, передаём, выполняем действия на объекте, а потом копируем данные из объекта на форму?
   jsmith
 
49 - 16.09.16 - 12:22
(46)
&НаСервере
Процедура РассчитатьСуммуВзаиморасчетов(НовыйОбъект, Форма)

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

&НаСервере
Функция ПолучитьКурсТекДок(ВладелецОбъект)
    пОтбор = Новый Структура;
    пОтбор.Вставить("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Курс взаиморасчетов"));
    НСтроки = ВладелецОбъект.ДополнительныеРеквизиты.НайтиСтроки(пОтбор);
    Возврат(НСтроки[0].Значение);
КонецФункции
 
 Рекламное место пустует
   jsmith
 
50 - 16.09.16 - 12:23
Остальное добавь сам по надобности. Я порезал второстепенные параметры.
Форма.Модифицированность, если надо, поставишь на клиенте.
   newbling
 
51 - 16.09.16 - 15:02
миста упала. Только вот нельзя же между клиентом и сервером передавать формы, да там и не надо:

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

Вот так взлетело. Т.е. мы всё же копируем объект в переменную, в ней (переменной) вносим изменения, а потом копируем данные измененного объекта из нашей переменной в изначальный объект.

Огромное спасибо за помощь! Правда, по сути делаем как в публикации всё равно - созданием копию формы, но хотя бы можно по ВладельцуФормы найти объект однозначно, а ни перебором по окнам, что вообще очень стрёмно смотрится само по себе. Может в момент написания статьи, в БСП не был доступен ВладелецФормы.


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