Заполнение табличной части документа (8.3 УФ) через ОткрытиеФормы

1. AlexeyPapanov 459 24.01.16 10:31 Сейчас в теме
Перестала работать обработка ЗТЧ для Бухгалтерии 3.0 (8.3.7). Мне кажется платформа обновилась и что-то пошло не так...

Обработка заполняет остатками ТМЦ табличную часть документа ТребованиеНакладная.

Как известно, ЗТЧ можно сделать двумя способами - через ОткрытиеФормы или ВызовКлиентскогоМетода.
Мне нужно сделать через ОткрытиеФормы, так как я должен предоставить юзеру возможность на форме задать счета, по которым надо получить остатки.

Только не срабатывает процедура заполнения.
Хотя запрос на получение остатков корректен, проверял в консоли.

Помогите, пожалуйста. Что я сделал не так?

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

а вот фрагменты кода модуля формы
Код:
&НаКлиенте
Процедура ЗаполнитьДокумент()
   
    ОбъектыНазначенияМассив = Параметры.ОбъектыНазначения;
   
    Для каждого ЭлементОбъектовНазначения из ОбъектыНазначенияМассив Цикл

        КлючПоиска = Новый Структура("Ключ", ЭлементОбъектовНазначения);

        Окна = ПолучитьОкна();

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


КонецПроцедуры
Показать


&НаСервере
Процедура ЗаполнитьДокументНаСервере(НовыйОбъект) Экспорт
   
    Если НЕ ЗначениеЗаполнено(НовыйОбъект.Склад) Тогда
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Укажите склад!");
        Возврат;
    КонецЕсли;
   
    МассивСчетов = ПолучитьФильтрСчетов();
   
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("Склад",                НовыйОбъект.Склад);
    Запрос.УстановитьПараметр("МассивСчетов",        МассивСчетов);
    Запрос.УстановитьПараметр("ДатаОстатков",        НовыйОбъект.Дата);
    Запрос.УстановитьПараметр("Организация",        НовыйОбъект.Организация);
   
    Запрос.Текст = "ВЫБРАТЬ
    |    ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
    |    ХозрасчетныйОстатки.Счет КАК Счет,
    |    ХозрасчетныйОстатки.КоличествоОстаток КАК Количество
    |ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаОстатков, Счет В ИЕРАРХИИ (&МассивСчетов), ,Организация=&Организация) КАК ХозрасчетныйОстатки
    |ГДЕ 
    |    ХозрасчетныйОстатки.Субконто3 = &Склад
    |АВТОУПОРЯДОЧИВАНИЕ";
   
   
    РезультатЗапроса = Запрос.Выполнить();
    Если не РезультатЗапроса.Пустой() Тогда
       
        Выборка = РезультатЗапроса.Выбрать();
        НовыйОбъект.Материалы.Очистить();
        Пока Выборка.Следующий() Цикл
           
            СтрокаТабличнойЧасти = НовыйОбъект.Материалы.Добавить();
           
            СтрокаТабличнойЧасти.Номенклатура   = Выборка.Номенклатура;
            СтрокаТабличнойЧасти.Количество    = Выборка.Количество;
            СтрокаТабличнойЧасти.Счет            = Выборка.Счет;
                       
        КонецЦикла;
    иначе
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Запрос остатков вернул пустой результат!");
    КонецЕсли;
   
КонецПроцедуры
Показать
Прикрепленные файлы:
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
10. ekaruk 4904 24.01.16 21:43 Сейчас в теме
(9) El_Loco, Насколько я понимаю, основное и активное окно это разные вещи.
Я использую другой синтаксис. Работает вполне корректно.
Смысл в том, что активное окно находим как форму объекта, ссылку которого нам передали.

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
       Для каждого ОбъектНазначение из ОбъектыНазначения Цикл
            ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение); //это передали в форму заполнения
            Форма = ПолучитьФорму("Документ.ПриходныйОрдерНаТовары.ФормаОбъекта",ПараметрыФормы); //окна не ищем, переполучаем уже открытое
			
            КопироватьДанныеФормы(Форма.Объект,ЭтотОбъект.ОбъектПриходныйОрдерНаТовары);
			
            НашаОбработкаНаСервере();

            КопироватьДанныеФормы(ЭтотОбъект.ОбъектПриходныйОрдерНаТовары,Форма.Объект);
			
	КонецЦикла;
КонецПроцедуры	
Показать
ir-ish-ka; kotlovD; Brook; +3 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ekaruk 4904 24.01.16 10:54 Сейчас в теме
(1) El_Loco, По коду наугад не подскажу.
Но лично я в таких случаях подключаю внешнюю обработку через http://infostart.ru/public/141765/
и смотрю пошагово, что происходит.
AlexeyPapanov; +1 Ответить
3. AlexeyPapanov 459 24.01.16 12:14 Сейчас в теме
(2) ekaruk, спасибо, у меня как раз не было отладчика ЗТЧ. попробую.

вот через ВызовКлиентскогоМетода все работает, но тогда я не могу дать пользователю возможность задать параметры на форме.

я думаю, проблема будет не только у меня. если кто сталкивался с похожей ситуацией, напишите.
4. Xershi 1483 24.01.16 12:24 Сейчас в теме
(1) El_Loco, возможно речь идет о галочке заполнять которая стояла на реквизите
5. AlexeyPapanov 459 24.01.16 15:28 Сейчас в теме
6. spacecraft 24.01.16 15:43 Сейчас в теме
(1) El_Loco, БезопасныйРежим выключать пробовали?
7. AlexeyPapanov 459 24.01.16 18:16 Сейчас в теме
(6) spacecraft, не помогает.

но я нашел, что именно не работает.

на форму выбора параметров обработки повесил еще одну кнопку с процедуркой:
&НаКлиенте
Процедура Команда1(Команда)
	ВладелецФормы.Объект.Дата = КонецМесяца(ТекущаяДата());
	ЭтаФорма.Закрыть();
КонецПроцедуры

все работает. т.е. форма закрывается и меняется дата в документе.

далее, я вставлял строку
	ВладелецФормы.Объект.Дата = КонецМесяца(ТекущаяДата());

в разные участки кода, чтобы понять где перестает выполняться код.

И докопался до проблемного куска кода. Объясните, почему не работает условие? -- > // Если НЕ Окно.Основное

&НаКлиенте
Процедура ЗаполнитьДокумент()
   
    ОбъектыНазначенияМассив = Параметры.ОбъектыНазначения;
   
    Для каждого ЭлементОбъектовНазначения из ОбъектыНазначенияМассив Цикл

        КлючПоиска = Новый Структура("Ключ", ЭлементОбъектовНазначения);

        Окна = ПолучитьОкна();

        Для каждого Окно из Окна Цикл

        //-----------------------------------
        // ВОТ В СЛЕДУЮЩЕЕ "ЕСЛИ" ВОЙТИ НЕ ПОЛУЧАЕТСЯ, ПОЭТОМУ НЕ СРАБАТЫВАЕТ ГЛАВНАЯ ПРОЦЕДУРА ПОЛУЧЕНИЯ И ЗАПОЛНЕНИЯ ТАБ.ЧАСТИ
        //-----------------------------------

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


КонецПроцедуры
Показать
8. AlexeyPapanov 459 24.01.16 18:25 Сейчас в теме
Я так понимаю проблема в поиске нужного окна с формой обрабатываемого документа.
Логика поиска такая
Окно изменяемого документа будет точно не основным, а вспомогательным, поэтому сразу пропускаем основное окно, а далее идем на не очень хороший способ поиска открытого окна изменяемого документа. Мы просто переберем все окна, а в заголовке, которых будет встречаться Наименование, номер и дата нужного документа - будем изменять

это кусок из комментария другой обработки.
выходит - проблема в том, что надо как-то получить окно...
9. AlexeyPapanov 459 24.01.16 18:56 Сейчас в теме
да, выходит, что обработка не может найти окно с формой.

вот такая процедура дает удивительный результат:
&НаКлиенте
Процедура Окна(Команда)
	
	Окна = ПолучитьОкна();
	
	Для каждого Окно из Окна Цикл
		сообщить ("Заголовок: "+окно.Заголовок +
		"; Начальная страница "+ окно.НачальнаяСтраница +
		"; Основное "+ окно.Основное +
		"; 	Содержимое "+окно.Содержимое);
	конецЦикла;
	

КонецПроцедуры
Показать


см. скрин
Прикрепленные файлы:
10. ekaruk 4904 24.01.16 21:43 Сейчас в теме
(9) El_Loco, Насколько я понимаю, основное и активное окно это разные вещи.
Я использую другой синтаксис. Работает вполне корректно.
Смысл в том, что активное окно находим как форму объекта, ссылку которого нам передали.

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
       Для каждого ОбъектНазначение из ОбъектыНазначения Цикл
            ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение); //это передали в форму заполнения
            Форма = ПолучитьФорму("Документ.ПриходныйОрдерНаТовары.ФормаОбъекта",ПараметрыФормы); //окна не ищем, переполучаем уже открытое
			
            КопироватьДанныеФормы(Форма.Объект,ЭтотОбъект.ОбъектПриходныйОрдерНаТовары);
			
            НашаОбработкаНаСервере();

            КопироватьДанныеФормы(ЭтотОбъект.ОбъектПриходныйОрдерНаТовары,Форма.Объект);
			
	КонецЦикла;
КонецПроцедуры	
Показать
ir-ish-ka; kotlovD; Brook; +3 Ответить
12. AlexeyPapanov 459 25.01.16 09:53 Сейчас в теме
(10) ekaruk, чтобы я без Вас делал? Спасибо, Евгения!

(11) Perrojka, платформа была как раз 8.3.7.1860.

Проблема решена, только вот так и непонятно из-за чего перестало все работать.
13. anton.fly7 173 29.07.16 10:43 Сейчас в теме
(10) подскажите пож, как после КопироватьДанныеФормы(ЭтотОбъект.ОбъектПриходныйОрдерНаТовары,Форма.Объект); обновить Форма ? у меня она остается в старом виде, до измениня

вот мой код

&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
	
	Для Каждого ОбъектНазначение из ОбъектыНазначенияМассив Цикл
		
		ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение);
    	Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ПараметрыФормы);
		
		КопироватьДанныеФормы(Форма.Объект, ЭтотОбъект.ЗаказКлиентаОбъект);
		
		ОткрытьФорму("ВнешняяОбработка.ShopLogisticsОтправка.Форма.ФормаДоставка", 
			ПолучитьПарамНаСервере(), 
			ЭтаФорма, 
			Истина,,, 
			Новый ОписаниеОповещения("ФормаДоставкаЗавершение", 
				ЭтаФорма, 
				ПараметрыФормы), 
			РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
			
		Прервать;
			
	КонецЦикла;
	
КонецПроцедуры

&НаКлиенте
Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт 
	
	Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ДополнительныеПараметры);
	
	ЗаполнитьЗаказНаСервере();
	
	КопироватьДанныеФормы(ЗаказКлиентаОбъект, Форма.Объект);
	
КонецПроцедуры
Показать
14. dj_serega 391 29.07.16 11:00 Сейчас в теме
(13) anton.fly7, ОбновитьОтображениеДанных()
16. anton.fly7 173 29.07.16 11:10 Сейчас в теме
(14) dj_serega, не, не обновляет ((

пробовал и так
&НаКлиенте
Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт 
	
	Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ДополнительныеПараметры);
	
	ЗаполнитьЗаказНаСервере();
	
	КопироватьДанныеФормы(ЗаказКлиентаОбъект, Форма.Объект);
	
	Сообщить(Форма.Объект.Номер);
	Сообщить(Форма.Объект.СпособДоставки);
	Сообщить(Форма.Объект.ПеревозчикПартнер);
	Сообщить(Форма.Объект.ДополнительнаяИнформацияПоДоставке);
	
	Форма.ОбновитьОтображениеДанных();
	
КонецПроцедуры
Показать


и так

&НаКлиенте
Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт 
	
	Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ДополнительныеПараметры);
	
	ЗаполнитьЗаказНаСервере();
	
	КопироватьДанныеФормы(ЗаказКлиентаОбъект, Форма.Объект);
	
	Сообщить(Форма.Объект.Номер);
	Сообщить(Форма.Объект.СпособДоставки);
	Сообщить(Форма.Объект.ПеревозчикПартнер);
	Сообщить(Форма.Объект.ДополнительнаяИнформацияПоДоставке);
	
	ОбновитьОтображениеДанных();
	
КонецПроцедуры
Показать

15. anton.fly7 173 29.07.16 11:07 Сейчас в теме
(13) при том вот эти сообщения показывают что Форма.Объект изменен, а Форма не перерисовывается

&НаКлиенте
Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт 
	
	Форма = ПолучитьФорму("Документ.ЗаказКлиента.ФормаОбъекта", ДополнительныеПараметры);
	
	ЗаполнитьЗаказНаСервере();
	
	КопироватьДанныеФормы(ЗаказКлиентаОбъект, Форма.Объект);
	
	Сообщить(Форма.Объект.Номер);
	Сообщить(Форма.Объект.СпособДоставки);
	Сообщить(Форма.Объект.ПеревозчикПартнер);
	Сообщить(Форма.Объект.ДополнительнаяИнформацияПоДоставке);
	
КонецПроцедуры
Показать
19. musyaBelousova 29.05.20 11:00 Сейчас в теме
(10) добрый день.
подскажите, пожалуйста
КопироватьДанныеФормы(Форма.Объект,ЭтотОбъект.ОбъектПриходныйОрдерНаТовары);

в этой строке ЭтотОбъект.ОбъектПриходныйОрдерНаТовары - это параметр какого типа? его нужно определить , но не знаю как
11. Perrojka 25.01.16 09:15 Сейчас в теме
Посмотрите номер платформы. Похожая беда была. Обновились на 8.3.7.1860(была 1790) и всё стало нормально. Ещё можно посмотреть в режиме совместимости с 8.3.6 как себя ведет.
17. anton.fly7 173 29.07.16 11:37 Сейчас в теме
ВОТ ТАК РАБОТАЕТ!!!! :)

&НаКлиенте
Процедура ФормаДоставкаЗавершение(Результат, ДополнительныеПараметры) Экспорт 
	
	ЗаполнитьЗаказНаСервере(Результат);
	
	КопироватьДанныеФормы(ЗаказКлиентаОбъект, ВладелецФормы.Объект);
	
	ВладелецФормы.Модифицированность = Истина;
	ВладелецФормы.Элементы.СтраницыДоставки.ТекущаяСтраница = ВладелецФормы.Элементы.СтраницаДоставкаПеревозчиком;
	
	ОбновитьОтображениеДанных();
	
КонецПроцедуры
Показать
18. Nefrit88 25.10.19 07:39 Сейчас в теме
Столкнулась с подобной проблемой, спасибо, помогли!
Но кое что изменила
ПараметрыФормы = Новый Структура("Ключ", ОбъектНазначение); //это передали в форму заполнения
Форма = ПолучитьФорму("Документ.ПриходныйОрдерНаТовары.ФормаОбъекта",ПараметрыФормы); //окна не ищем, переполучаем уже открытое


можно легко заменить на
Форма = ЭтаФорма.ВладелецФормы

т.к. в моем случае нужен был уникальный идентификатор формы владельца
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот