Имя: Пароль:
1C
 
УФ : Загрузка контекста из дополнительной произвольной формы документа в сам документ
0 bvb
 
04.06.26
11:35
Добрый день

Никогда не делал и вот надо.

Нужно грузить данные из Excel в ТЧ документа "Заказ"
С предварительной визуализацией и ПРЕД обработкой

1. Для этого хочу сделать доп. произвольную форму данного документа в расширении (с внешней обработкой ТЧ связываться не хочу)
2. Форма открывается с блокировки окна владельца
3. На форме ТЗ и в нее грузим Excel.
4. Подшаманиваем данные форме и затем переносим в документ


Вопрос :
КАк правильно загрузить данные из ТЗ в ТЧ документа после закрытие обработки в команде "ЗагрузитьВДокумент" после закрытия формы?
У меня в голове только вариант со временным хранилищем
1 Мультук
 
гуру
04.06.26
11:53
(0)

1) "загрузка контекста" -- вы грузите не контекст, вы грузите данные.

2) И что не так с этим решением ?

3) В УТ/ЕРП есть типовой импорт из XLS табличных частей
Можно посмотреть "а как сделано там"
2 Мнемоника
 
04.06.26
12:03
В форме с табличкой при нажатии на кнопку оповещаем о выборе с передачей через ПоместитьВоВременноеХранилище нашей таблички
В исходной форме в ОбработкаВыбора обрабатываем это дело.
3 КонецЕсли
 
04.06.26
13:01
(0) Вариант без временного хранилища:
Использовать ОткрытьФорму  с оповещением о закрытии.
В вашей форме при нажатии на ОК формировать массив структур содержащий выбранные строки таблицы (колонки - элементы структуры) и закрыть форму с возвратом этого массива.  
В оповещении о закрытии (на клиенте) сразу добавляем строки в ТЧ документа по полученным данным. Не забываем о заполнении служебных полей в строках ТЧ.
4 AAA
 
04.06.26
13:28
А чем не угодила обработка заполнения ТЧ? Там как раз все просто, никаких извращений
5 mikecool
 
04.06.26
13:47
(4) а где подглядеть такое? а то сподобился писать контекстный внешний отчет, так час пару процедур писал(типа описание и ВыполнитьКоманду) )))
остальное то понятно, а вот сама "обвязка" с привязкой к БСП и объектам - это не знаю как
6 Прохожий
 
04.06.26
13:58
(0) Правильно Дополнительные отчеты и обработки.
Функция СведенияОВнешнейОбработке() Экспорт
            ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("1.1.1.1");
            ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта();  //ВидОбработкиПечатнаяФорма();
            МасНазначений = Новый Массив;
            //МасНазначений.Добавить("Документ.ЗаказНаПеремещение");
            МасНазначений.Добавить("Документ.ЗаказПоставщику");
            
            ПараметрыРегистрации.Назначение = МасНазначений;
            ПараметрыРегистрации.Наименование = "Загрузка Номенклатуры из Эксель";
            ПараметрыРегистрации.БезопасныйРежим = Ложь;
            НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
            НоваяКоманда.Представление = НСтр("ru = 'Загрузка Номенклатуры из Эксель'");
            НоваяКоманда.Идентификатор = "ЗагрузкаНовыхРеквизитовНоменклатуры";
            НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода();
            НоваяКоманда.ПоказыватьОповещение = Истина;
            Возврат ПараметрыРегистрации;
КонецФункции
7 Прохожий
 
04.06.26
14:01
Ничего ни в какие хранилища передавать не надо. Дикари какие-то.
8 Прохожий
 
04.06.26
14:01
&НаКлиенте
Процедура ЗагрузитьДанные()    
    
    Товары = ВладелецФормы.Объект.Товары;
    Товары.Очистить();
    Для Каждого Стр из ТаблицаЗаказа Цикл
        Строчка = Товары.Добавить();
        ЗаполнитьЗначенияСвойств(Строчка, Стр,"Номенклатура,Количество");
        Строчка.Упаковка = Стр.ЕдиницаИзмерения;
        Строчка.КоличествоУпаковок = Строчка.Количество;  
        Если Строчка.Свойство("Цена") Тогда
            Строчка.Цена = Стр.Цена;
            Строчка.СтавкаНДС = ПредопределенноеЗначение("Справочник.СтавкиНДС.НДС12");
            Строчка.СуммаСНДС = Стр.Сумма;
            Строчка.СуммаНДС = Строчка.Сумма * 12 / 112;
            Строчка.Сумма = Строчка.СуммаСНДС - Строчка.СуммаНДС;  
        КонецЕсли;
        Если Строчка.Свойство("Артикул")И НЕ ЗначениеЗаполнено(Строчка.Артикул) Тогда
            Строчка.Артикул = Стр.Артикул;  
            //Строчка.Артикул = СвойствоРеквизита(Строчка.Номенклатура, "Артикул");  
        КонецЕсли;
    КонецЦикла;
    ЭтаФорма.Закрыть();
    
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьЗаказ(Команда)
    
    Если ВладелецФормы.Объект.Товары.Количество() > 0 Тогда
        ПоказатьВопрос(Новый ОписаниеОповещения("ЗаполнитьЗаказЗавершение", ЭтаФорма), "Табличная часть в документе будет очищена. Продолжить?", РежимДиалогаВопрос.ОКОтмена);
    иначе
        ЗагрузитьДанные();    
    КонецЕсли ;
    
КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьЗаказЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт
    
    Ответ = РезультатВопроса;
    Если Ответ = КодВозвратаДиалога.Отмена Тогда
        Возврат;
    Иначе
        ЗагрузитьДанные();
    КонецЕсли;

КонецПроцедуры
9 Прохожий
 
04.06.26
14:02
(4) Это правильный ответ
10 Fedor-1971
 
04.06.26
14:04
(0) Если совсем не заморачиваться:
В открытой форме есть форма владелец: при создании на сервере запиши её в реквизит открытой формы (например, фрмВладелец)
Заполняешь что тебе нужно
Дальше: нов = ФрмВладелец.Объект.ТЧ.Добавить()

Не айс при большом количестве строк, но имеет место и такой вариант.
Поддерживать такое сложновато, тупо забываешь, как заполнял ТЧ
11 Прохожий
 
04.06.26
14:04
Модуль и форма из разных обработок надерганы, но смысл понятен надеюсь. Права, размещение. Все управляется стандартно. Красота.
12 Fedor-1971
 
04.06.26
14:06
(7) Попробуй передать своим способом ТаблицуЗначений и сразу станет понятно зачем хранилище
13 Прохожий
 
04.06.26
14:13
Вопрос: "Нужно грузить данные из Excel в ТЧ документа "Заказ""
Ответ: "ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта()"

Мы разный интернет читаем?
14 Прохожий
 
04.06.26
14:14
Это вообще тестовое задание у некоторых франчей если что.
15 Прохожий
 
04.06.26
14:14
А я его только что испортил...
16 bvb
 
10.06.26
13:27
Сделал просто...

Вызов обработки

&НаКлиенте
Процедура STR_ЗагрузкаСпецификацииЗаказаИзEXCEL (Команда)
    
    ДопПараметры = Новый Структура;
    ДопПараметры.Вставить("Отказ", ЛОЖЬ);
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Организация", Объект.Организация);
    Если НЕ Параметры.Ключ.Пустая() Тогда
        ПараметрыФормы.Вставить("Ссылка", Параметры.Ключ);
    КонецЕсли;
    
    Оповещение = Новый ОписаниеОповещения("ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL", ЭтотОбъект, ДопПараметры);
    ОткрытьФорму("Обработка.STR_ЗагрузкаСпецификацииЗаказаИзEXCEL.Форма.Форма", ПараметрыФормы, ЭтотОбъект,,,, Оповещение, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
    
КонецПроцедуры
17 bvb
 
10.06.26
13:29
По кнопке «Перенести в документ в обработке»

&НаСервере
Функция ПолучитьАдресДанных ()
    
    Возврат ПоместитьВоВременноеХранилище (Запасы.Выгрузить()); //Выгружаем ТЗ во временное хранилище
    
КонецФункции

&НаКлиенте
Процедура ПеренестиВДокумент(Команда)
      
    
    Результат = Новый Структура;
    Результат.Вставить("АдресДанных", ПолучитьАдресДанных ());
      
    // Оповещаем родительскую форму, передавая структуру с данными
    Оповестить("ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL", Результат);
        
    // Закрываем форму
    Закрыть();
    
КонецПроцедуры
18 bvb
 
10.06.26
13:29
Обработка оповещения

Процедура STR_ОбработкаОповещенияПеред(ИмяСобытия, Параметр, Источник)
    
Если ИмяСобытия = "ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL" Тогда
        Если ТипЗнч(Параметр) = Тип("Структура") и Параметр.Свойство("АдресДанных") Тогда
            ЗаполнитьЗапасыИзТЗ (Параметр.АдресДанных);                                        
        КонецЕсли;    
    КонецЕсли;
    
КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL(Результат, ДополнительныеПараметры) Экспорт
    Если Результат <> Неопределено Тогда
        Если ДополнительныеПараметры.Свойство("Отказ") Тогда
            ДополнительныеПараметры.Отказ = Результат;
        КонецЕсли;  
    КонецЕсли;
КонецПроцедуры
19 bvb
 
10.06.26
13:32
Я так понимаю событие в методе формы
НаКлиенте
ОбработкаОповещения

возникает всегда.  И я обрабатывал его там

А вот в самой процедуре оповещения  
&НаКлиенте
Процедура ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL(Результат, ДополнительныеПараметры) Экспорт

Резульат = неопределено

Почему так я не понял
20 КонецЕсли
 
10.06.26
15:48
Потому что
// Закрываем форму
    Закрыть();

Вот то что между скобочками и есть твой Результат.
21 bvb
 
10.06.26
16:11
(20) Понял. Спасибо

А событие в обработке оповещения возникает всегда ?

И где нужно обрабатывать результат в ОбработкеОповещения формы или процедуре которую сам создал ?
В чем разница ?
22 КонецЕсли
 
10.06.26
16:31
(21) Можно не использовать
Оповестить("ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL", Результат);

а использовать

Закрыть(Результат);

Тогда отработает только процедура ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL

Обработки оповещения не будет
23 bvb
 
10.06.26
17:48
Спасибо большое. Теперь у меня все встало на свои места

Еще вопрос можно ?

ДопПараметры = Новый Структура;
ДопПараметры.Вставить("Отказ", ЛОЖЬ);
Оповещение = Новый ОписаниеОповещения("ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL", ЭтотОбъект, ДопПараметры);

ДопПараметры

Это структура передающая данные между вызовом и процедурой отрабатывающей  в результате оповещения (ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL) ?

Как это применимо ?
24 КонецЕсли
 
11.06.26
07:37
"Как это применимо ?"

Если надо какие-то дополнительные данные передать из Процедура STR_ЗагрузкаСпецификацииЗаказаИзEXCEL в процедуру ВыполнитьПослеОкончанияSTR_ЗагрузкаСпецификацииЗаказаИзEXCEL.

Если не надо, то просто убрать из кода.
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой