Имя: Пароль:
1C
1С v8
Внешняя обработка заполнения ТЧ...опять она!?
,
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
миста упала. Только вот нельзя же между клиентом и сервером передавать формы, да там и не надо:

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

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

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