Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Заполнение ТЧ стандартного документа из внешней обработки

Заполнение ТЧ стандартного документа из внешней обработки
Я
   kks
 
13.07.21 - 07:41
Добрый день.
Необходимо из внешней обработки заполнить документ ПоступлениеТоваровУслуг.
Реквизиты заполняются нормально, а вот ТЧ Товары нет
Есть ли стандартный способ, без изменения ОбработкаЗаполнения в расширении заполнения ТЧ документа, либо ТЧ формы документа.
Код вызова формы следующий:
        ДанныеЗаполнения = Новый Структура;
    ДанныеЗаполнения.Вставить("Контрагент",Объект.Контрагент);
    ДанныеЗаполнения.Вставить("ДоговорКонтрагента",Объект.ДоговорКонтрагента);
    ДанныеЗаполнения.Вставить("Товары",Объект.СписокНоменклатурыДокументов);
    
    ПараметрыДляОповещения = Новый Структура;
    ПараметрыДляОповещения.Вставить("ЧтоСделаноНаФорме", "");
    ЗакрытиеОбратныйВызов = Новый ОписаниеОповещения("ОбработкаЗакрытияФормы", ЭтаФорма,ПараметрыДляОповещения);
    
    ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары",Новый Структура("ЗначенияЗаполнения",ДанныеЗаполнения), ЭтаФорма,,,,ЗакрытиеОбратныйВызов);
   SSSSS_AAAAA
 
1 - 13.07.21 - 08:46
(0)
1. Для заполнения любых частей документа форма совершенно не нужна.
2. Документы хорошо заполняются прямым обращениям к частям документа без ОбработкаЗаполнения и структур.
   Peka50
 
2 - 13.07.21 - 10:09
А если нужно вызвать экспортный обработчик формы ?
   kks
 
3 - 13.07.21 - 10:10
Вопрос как раз в том, чтобы оператор мог проверить правильность заполнения документа в форме и сам нажал Провести и закрыть или отменил запись документа
   Peka50
 
4 - 13.07.21 - 10:14
вот пример кода. Но у меня не получается автоматически сохранить форму с данными. Сохраняется только пустая табличная часть
&НаКлиенте
Процедура СоздатьДокументаАванса(Команда)
    
    Форма = ПолучитьФорму("Документ.НачислениеЗаПервуюПоловинуМесяца.Форма.ФормаДокумента", );
    
    ДанныеФормы = Форма.Объект;// Получаем объект формы в переменную

    ЗаполнитьДокументНаСервереБезКонтекста(ДанныеФормы);// Заполняем шапку документа на сервере

    КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); 
    Форма.Открыть();
    
    РасчетЗарплатыРасширенныйКлиент.ЗаполнитьДокументНачисленияЗарплаты(Форма);  // заполняем табличную часть документа    


КонецПроцедуры

&НаСервереБезКонтекста
Функция ЗаполнитьДокументНаСервереБезКонтекста(ДанныеФормы);

    Док = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.НачислениеЗаПервуюПоловинуМесяца")); 
    Док = Документы.НачислениеЗаПервуюПоловинуМесяца.СоздатьДокумент();
    
    Док.Дата = ТекущаяДата();
    Док.МесяцНачисления = '20210701';
    Док.ОкончаниеПериодаНачисления = '20210715';

    ЗначениеВДанныеФормы(Док, ДанныеФормы);

КонецФункции
   arsik
 
5 - 13.07.21 - 10:14
(0) В БСП есть механизм внешних обработок. Через него делайте. Там есть, как раз для таких случаев, ввод на основании.
   Peka50
 
6 - 13.07.21 - 10:25
Ввод на основании не даст возможности использовать процедуру формы.
   kks
 
7 - 13.07.21 - 10:31
Да вопроса нет: заполнить Объект и запихнуть его в форму. Но я понимаю, что ПолучитьФорму - это моветон, использовать его неправильно, а без этого метода не получается. Или я неправильно понимаю стандарты разработки?
   Peka50
 
8 - 13.07.21 - 10:33
Вы правильно понимаете, но на 17 релизе это работает.
   kks
 
9 - 13.07.21 - 10:35
Ввод на основании для данного документа в стандарте подразумевает только Счёт и ещё 2 документа, в этом списке нет внешней обработки
   kks
 
10 - 13.07.21 - 10:37
С чем связано отсутствие в ОбработкеЗаполнения заполнения ТЧ документа по произвольной ТЧ не понятно. Кто-то владеет этой информацией?
   SSSSS_AAAAA
 
11 - 13.07.21 - 10:54
(3) Да пусть проверяет сколько угодно. После заполнения.
   SSSSS_AAAAA
 
12 - 13.07.21 - 10:57
(10) Обработки заполнения никогда не принимали произвольные данные. Они всегда были рассчитаны или на известные им документы или на входную структуру, хотя бы частично совпадающую со структурой заполняемого документа.
   SSSSS_AAAAA
 
13 - 13.07.21 - 10:59
(10) Разумеется. Внешние обработки никогда не были основанием для ввода.
   ДенисЧ
 
14 - 13.07.21 - 10:59
(10) Обработка заполнения изначально задумывалась для интерактива. Как тебе пользователь передаст интерактивно произвольную ТЗ?
   SSSSS_AAAAA
 
15 - 13.07.21 - 11:01
(7) А при ем тут стандарты обработки? Еще раз - заполнение документа совершенно никак не связано с формой. Заполняете докуметн и потом открываете заполненный документ для правки пользователем. Каким боком тут ПолучитьФорму и стандарты разработки?
   Kassern
 
16 - 13.07.21 - 11:08
(0) В СведенияОВнешнейОбработке указываешь :
 ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
На форме создаешь экспортную процедуру на клиенте ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив)
Далее в ней уже можешь обратиться к открытому документу, например: ТвойДокумент=ВладелецФормы.Объект;
И делай в этой процедуре все что хочешь, хочешь ТЧ перезаполняй, хочешь, реквизиты меняй.
   Kassern
 
17 - 13.07.21 - 11:09
(16) через дополнительные обратоки у тебя добавится кнопка в определенный тобой документ. По ней будет выполняться экспортная процедура на форме внешней обработки.
   Kassern
 
18 - 13.07.21 - 11:09
(17) *дополнительные обработки)
   GreyK
 
19 - 13.07.21 - 11:29
(0) Конфигурация какая?
   kks
 
20 - 13.07.21 - 11:46
Бухгалтерия предприятия 3.0 последняя
   kks
 
21 - 13.07.21 - 11:53
(17)  Внешняя обработка получает xml из другой базы не 1с с документами поступлений.
Список выводится на форму.
При щелчке на строке открывается вторая форма, в которой производится сравнение объектов из xml и базы: контрагент, номенклатура, организация, склад. При отсутствии создаются новые элементы справочников вручную
По кнопке вызывается форма документа ПоступлениеТоваровИУслуг.
Если документ проведён, то на форму в обработке поступает номер накладной и выгружается в xml.
Поэтому не понятно, как это будет обработка  ЗаполнениеОбъекта?
   GreyK
 
22 - 13.07.21 - 11:55
(20) В БП3 можно заполнить по структуре. Создаешь структуру, вставляешь в неё основные реквизиты документа, вставляешь таблицу значений "Товары" и всё! Видишь как  всё просто :)
   GreyK
 
23 - 13.07.21 - 11:59
+(22) Посмотри ЗаполнениеДокументов.Заполнить(ЭтотОбъект, ДанныеЗаполнения, Истина)
Там есть строчки:
    Если ТипДанныхЗаполнения = Тип("Структура") Тогда
        ЗаполнитьПоСтруктуре(ДокументОбъект, ДанныеЗаполнения, МетаданныеДокумента);
    КонецЕсли;
   kks
 
24 - 13.07.21 - 12:53
(23) Не всё так просто. Если бы глубже залезли в процедуру ЗаполнитьПоСтруктуре, то там заполняют одни реквизиты, без ТЧ. ТЧ заполняется только в Модуле Менеджера в функции ЗаполнитьНаОснованииСчета или что-то около того
   hhhh
 
25 - 13.07.21 - 13:10
(24) а это тогда что у вас?

ДанныеЗаполнения.Вставить("Товары",Объект.СписокНоменклатурыДокументов);
    

Товары это и есть таб часть. Но вы туда какую-то херню похоже лепите, вместо таблицы.
   1Сергей
 
26 - 13.07.21 - 13:40
Вы со скольки метров ТЧ от ТЗ отличаете?
   kks
 
27 - 13.07.21 - 13:53
(25) Это я пробовал передать ТЧ. Но обработки ТЧ при ОбработкаЗаполнения в стандарте НЕТ (Точнее есть, если заполнен ДанныеЗаполнения.Основание).
Видимо самый простой способ: в расширение добавить "После" ОбработкаЗаполнения. И там проверить наличие своего индикатора, например ДанныеЗаполнения.ОснованиеВнешнее = True и пробовать заполнить ТЧ документа
Если у кого-то есть конкретные механизмы, с которыми реально сталкивались, то я буду рад, чтобы всё было по одинэсовскому феншую
   GreyK
 
28 - 13.07.21 - 13:56
(27) У меня в РТ сделано так:

        Форма = ПолучитьФорму("Документ.ПоступлениеТоваров.ФормаОбъекта");
        ДанныеФормы = Форма.Объект;
        СформироватьДокументНаСервере(ДанныеФормы);
        КопироватьДанныеФормы(ДанныеФормы, Форма.Объект);
        Форма.Открыть();
   1Сергей
 
29 - 13.07.21 - 14:01
У меня вот так сделано

&НаКлиенте
Процедура ПеренестиТовары(Команда)
    ОчиститьСообщения();
    ПеренестиТоварыФрагмент();
КонецПроцедуры


&НаКлиенте
Процедура ПеренестиТоварыФрагмент()
    
    Перем СтруктураВыбора;
    
    Если ПроверитьЗаполнение() Тогда
        Закрыть();
        СтруктураВыбора = Новый Структура();
        СтруктураВыбора.Вставить("АдресТоваровВХранилище", ПоместитьМатериалыВХранилище());
        Если ЗначениеЗаполнено(ИмяТЧ) Тогда
            СтруктураВыбора.Вставить("ИмяТЧ", ИмяТЧ);
        КонецЕсли;
        ОповеститьОВыборе(СтруктураВыбора);
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Функция ПоместитьМатериалыВХранилище()
    
    Материалы = Объект.МатериалыИУслуги.Выгрузить();
    Возврат ПоместитьВоВременноеХранилище(Материалы);
    
КонецФункции
   kks
 
30 - 13.07.21 - 14:05
Нашел статью:
http://agency-sd.ru/?p=40
 
 
   kks
 
31 - 13.07.21 - 14:33
Решил, основываясь на статье и ваших подсказках:
1. В модуле формы внешней обработки:
[1C]
&&НаСервере
Функция СоздатьНовыйДокументНаСервереИПолучитьЕгоДанные()
    ДокТМП = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
    ДокТМП.Контрагент = Объект.Контрагент;
    ДокТМП.ДоговорКонтрагента = Объект.ДоговорКонтрагента;
    
    Для Каждого СтрокаТЧ ИЗ Объект.СписокНоменклатурыДокументов Цикл
        НоваяСтрока = ДокТМП.Товары.Добавить();
        НоваяСтрока.Номенклатура = СтрокаТЧ.Номенклатура;
    КонецЦикла;
    
    Возврат ПолучитьДанныеОбъектаДляФормыНового(ДокТМП);
КонецФункции

&НаСервере
Функция ПолучитьДанныеОбъектаДляФормыНового(ОбъектДанных)
    СтруктураДанныхОбъекта = Новый Структура();
    Для каждого Реквизит ИЗ Метаданные.Документы.ПоступлениеТоваровУслуг.Реквизиты Цикл
        СтруктураДанныхОбъекта.Вставить(Реквизит.Имя, ОбъектДанных[Реквизит.Имя]);
    КонецЦикла;
    
    ТблТМП = Новый ТаблицаЗначений;
    ТблТМП.Колонки.Добавить("Имя");
    ТблТМП.Колонки.Добавить("Адрес");
    Для каждого ТабЧасть ИЗ Метаданные.Документы.ПоступлениеТоваровУслуг.ТабличныеЧасти Цикл
        Если ОбъектДанных[ТабЧасть.Имя].Количество() = 0 Тогда
            Продолжить;
        КонецЕсли;
        
        СтрТМП = ТблТМП.Добавить();
        СтрТМП.Имя     = ТабЧасть.Имя;
        СтрТМП.Адрес = ПоместитьВоВременноеХранилище(ОбъектДанных[ТабЧасть.Имя].Выгрузить(),Новый УникальныйИдентификатор());
    КонецЦикла;
    
    Если НЕ ТблТМП.Количество() = 0 Тогда
        СтруктураДанныхОбъекта.Вставить("АдресОписаниеТабЧастей", ПоместитьВоВременноеХранилище(ТблТМП,Новый УникальныйИдентификатор()));
    КонецЕсли;
    
    Возврат СтруктураДанныхОбъекта;
КонецФункции

&НаКлиенте
Процедура СоздатьДокумент(Команда)
    ДанныеЗаполнения = СоздатьНовыйДокументНаСервереИПолучитьЕгоДанные();
    
    ПараметрыДляОповещения = Новый Структура;
    ПараметрыДляОповещения.Вставить("ЧтоСделаноНаФорме", "");
    ЗакрытиеОбратныйВызов = Новый ОписаниеОповещения("ОбработкаЗакрытияФормы", ЭтаФорма,ПараметрыДляОповещения);
    
    ОткрытьФорму("Документ.ПоступлениеТоваровУслуг.Форма.ФормаДокументаТовары",Новый Структура("ЗначенияЗаполнения",ДанныеЗаполнения), ЭтаФорма,,,,ЗакрытиеОбратныйВызов);
КонецПроцедуры
[1C]
2. В расширении конфигурации. МодульОбъекта ПоступлениеТоваровУслуг:
[1C]
&После("ОбработкаЗаполнения")
Процедура РасшУПП_ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    ТипДанныхЗаполнения = ТипЗнч(ДанныеЗаполнения);
    Если ДанныеЗаполнения <> Неопределено Тогда        
        Если ТипДанныхЗаполнения = Тип("Структура") И ДанныеЗаполнения.Свойство("АдресОписаниеТабЧастей") Тогда
            ОписаниеТабЧастей = ПолучитьИзВременногоХранилища(ДанныеЗаполнения.АдресОписаниеТабЧастей);
            Для каждого ОписаниеТабЧасти Из ОписаниеТабЧастей Цикл
                  ТблТМП = ПолучитьИзВременногоХранилища(ОписаниеТабЧасти.Адрес);
                  ЭтотОбъект[ОписаниеТабЧасти.Имя].Загрузить(ТблТМП);
            КонецЦикла;            
        КонецЕсли;        
    КонецЕсли;
КонецПроцедуры
[1C]
   kks
 
32 - 13.07.21 - 14:33
Не нашел каким тегом код свернуть


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.