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

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

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

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

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

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

    Если ТипДанныхЗаполнения = Тип("Структура") Тогда
        ЗаполнитьПоСтруктуре(ДокументОбъект, ДанныеЗаполнения, МетаданныеДокумента);
    КонецЕсли;
24 kks
 
13.07.21
12:53
(23) Не всё так просто. Если бы глубже залезли в процедуру ЗаполнитьПоСтруктуре, то там заполняют одни реквизиты, без ТЧ. ТЧ заполняется только в Модуле Менеджера в функции ЗаполнитьНаОснованииСчета или что-то около того
25 hhhh
 
13.07.21
13:10
(24) а это тогда что у вас?

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

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

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

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


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

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

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

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

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

2. В расширении конфигурации. МодульОбъекта ПоступлениеТоваровУслуг:

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