helpf.pro
Регистрация
 +8 
Распечатать

Как заполнить табличную часть на основании документа

В форме документа счет-фактура выданный аванс заполнить табличную часть Авансы на основании документа поступление безналичных денежных средств.
Условия:
1) Перед заполнением табличной части документа получить от пользователя подтверждение на это действие;
2) Обработку создания документа сделать внешней и подключаемой к форме документа счет-фактура на аванс выданный;
3) После заполнения табличной части не записывать документ, а разрешить пользователю продолжить редактирование изменной табличной части или самостоятельно записать документ.
Решение:
Пункты 1 и 2 не представляют особой сложности, но пункт 3 заставил меня задуматься и написать, по-моему мнению, топорный, но исправно действующий код.

Понятно, что от нас требуется создать внешнюю обработку вида "ЗаполнениеОбъекта" и подключить её в информационную базу.
Приведу код в модуле обработки:
Код 1C v 8.2 УП
 Функция СведенияОВнешнейОбработке() Экспорт

    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить("Документ.СчетФактураВыданныйАванс");

    ПараметрыРегистрации.Вставить("Вид", "ЗаполнениеОбъекта");
    ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
    ПараметрыРегистрации.Вставить("Наименование", "Заполнить документ");
    ПараметрыРегистрации.Вставить("Версия", "1.0");
    ПараметрыРегистрации.Вставить("БезопасныйРежим", Истина);
    ПараметрыРегистрации.Вставить("Информация", "Дополнительная обработка табличной части к документу счет-фактура выданный аванс");

    ТаблицаКоманд = ПолучитьТаблицуКоманд();

    ДобавитьКоманду(ТаблицаКоманд,
    "Заполнить документ",
    "Заполнить документ",
    "ВызовКлиентскогоМетода",
    Истина);

    ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);

    Возврат ПараметрыРегистрации;
КонецФункции

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

Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
  НоваяКоманда = ТаблицаКоманд.Добавить();
  НоваяКоманда.Представление = Представление;
  НоваяКоманда.Идентификатор = Идентификатор;
  НоваяКоманда.Использование = Использование;
  НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
  НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры   

Так как нам придется работать с формами объектов мы просто вынуждены использовать метод ВызовКлиентскогоМетода для вызова команды внешней обработки.

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

Так как мы использовали ВызовКлиентскогоМетода, то обязательную процедуру, для внешней подключаемой обработки заполнения объектов, ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт, необходимо выполнять &НаКлиенте в модуле формы обработки, а значит создадим любую форму обработки, пользователь её всеравно не увидит, и поместим внутрь модуля формы следующий код:
Код 1C v 8.2 УП
 &НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    //Спросим у пользователя разрешение на продолжение обработки
    Режим = РежимДиалогаВопрос.ДаНет;
    Текст = "Текущие данные документа будут заменены новыми без возможности восстановления.
    |Продолжить?";
    Ответ = Вопрос(Текст, Режим, 0);
    Если Ответ = КодВозвратаДиалога.Да Тогда

        //Если пользователь дал разрешение на продолжение, то начнем перебирать все
        //документы, у которых мы планируем заполнить табличную часть
        Для каждого Элемент из ОбъектыНазначенияМассив Цикл

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

            //Но нам не надо открывать новую форму (окно) для изменяемого документа, а
            //Нам надо все изменения показать в уже открытых у клиента окнах
            Окна = ПолучитьОкна();
            Для каждого Окно из Окна Цикл

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

                    //Далее мы получаем объект только, что повторно открытой формы и помещаем её в переменную
                    //В объекте содержатся все реквизиты (элементы) формы
                    НовыйОбъект = Форма.Объект;

                    //Мы помещаем объект формы в переменную,
                    //так как должны передать её в процедуру на сервере,
                    //где нельзя изменять объект формы, зато можно править переменную содержащую его
                    ЗаполнитьОбъект(НовыйОбъект);

                    //После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект,
                    //которую необходимо передать в уже полученную нами форму
                    КопироватьДанныеФормы(НовыйОбъект, Форма.Объект);
                КонецЕсли;
            КонецЦикла;

        КонецЦикла;
    КонецЕсли;
КонецПроцедуры   

Ниже приведу код, который у вас может быть совершенно другим и делать, какие-либо другие манипуляции с объектом формы:
Код 1C v 8.2 УП
 &НаСервере
Функция ЗаполнитьОбъект(НовыйОбъект)

    Если ТипЗнч(НовыйОбъект.ДокументОснование) = Тип("ДокументСсылка.ПоступлениеБезналичныхДенежныхСредств") Тогда

        Если НовыйОбъект.ДокументОснование.РасшифровкаПлатежа.Количество() > 0 Тогда
            НовыйОбъект.Авансы.Очистить();
        КонецЕсли;

        Для каждого СтрокаТЧ из НовыйОбъект.ДокументОснование.РасшифровкаПлатежа Цикл
            НоваяСтрока = НовыйОбъект.Авансы.Добавить();
            Если ЗначениеЗаполнено(СтрокаТЧ.СчетНаОплату) Тогда
                НоваяСтрока.Содержание = "Предварительная оплата" + ФормированиеПечатныхФорм.СформироватьЗаголовокДокумента(СтрокаТЧ.СчетНаОплату, НСтр("ru=' по счету на оплату'"));
            КонецЕсли;
            НоваяСтрока.Сумма = СтрокаТЧ.Сумма;
            НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС18_118;
            ТекПроцентНДС = ЦенообразованиеКлиентСервер.ПолучитьСтавкуНДСЧислом(НоваяСтрока.СтавкаНДС);
            НоваяСтрока.СуммаНДС = ЦенообразованиеКлиентСервер.РассчитатьСуммуНДС(НоваяСтрока.Сумма, ТекПроцентНДС);
        КонецЦикла;
    КонецЕсли;

КонецФункции   

Автор ApocalypseNTC
Разместил:   Версии: | 8.2 УП |  Дата:   Прочитано: 57817
 +8 
Распечатать
Возможно, вас также заинтересует
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 53
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ
1C и Google Maps 21
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш
1С 8.x : Как убрать лидирующие нули в номере Документа (вариант2) 0
Скопировать строку с номером, с лидирующими нулями, в числовом поле (с форматом без групп, без группировки), и вернуть(скопировать) обратно в строковом поле с номером. Возвращает без нулей.
Google maps : вывод точек на карту и режим панорамы 9
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора
Посмотреть все результаты поиска похожих
Комментарии
Ser
30.01.2014 17:04Комментарий: 11
Ser
Сделал все по инструкции а они пишет
метод обьекта не обнаружен "ВыполнитьКоманду"

Хотя вот так написал

Код 1C v 8.2 УП
ДобавитьКоманду(ТаблицаКоманд,
"Заполнить документ",
"Заполнить документ",
"ВызовКлиентскогоМетода",
Истина);


Код 1C v 8.2 УП
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
Цитата
Ser
30.01.2014 17:00Комментарий: 10
Ser
mrDen, mrDen, mrDen,
bssorsk
12.04.2013 04:09Комментарий: 9
bssorsk
Если кому интересно , мне помогло замена метода Получить/ОткрытьФорму , на код представленный здесь http://infostart.ru/public/148039/


Код 1C v 8.2 УП
 
ОбъектыНазначенияМассив = СписокЭлементов.ВыгрузитьЗначения();
	
	Окна = ПолучитьОкна();
	Для Каждого Элемент из ОбъектыНазначенияМассив Цикл
		
		Для Каждого Окно из Окна Цикл
			
			Если НЕ Окно.Основное Тогда
				
				Форма = Окно.ПолучитьСодержимое();
				
				ОбъектФормы = Неопределено;
				
				Попытка
					ОбъектФормы = Форма.Объект;
				Исключение
				КонецПопытки;
				Если ОбъектФормы <> Неопределено   Тогда
					Попытка
						ОбъектСсылка = ОбъектФормы.Ссылка
					Исключение
						ОбъектСсылка = Неопределено;
					КонецПопытки;
					
					Если ОбъектСсылка <> Неопределено   Тогда
						Если  ОбъектСсылка = Элемент Тогда
											
							Попытка
								ОбъектыНазначения 				= Форма.Объект;
								ОбъектыНазначения.Комментарий 	= формат(ТекущаяДата());
								
								ЗаполнитьДокументНаОснованииПоступленияТоваровИУслуг(ОбъектыНазначения, ДокументОснование, ВидЦены);
								////После выполнения процедуры на сервере мы получаем изменную переменную НовыйОбъект,
								////которую необходимо передать в уже полученную нами форму
								КопироватьДанныеФормы(ОбъектыНазначения, Форма.Объект) 
								
							Исключение
							КонецПопытки;
							
							
						КонецЕсли;
					КонецЕсли;
				КонецЕсли;
			КонецЕсли;
			
		КонецЦикла;   
	КонецЦикла;

   
bssorsk
12.04.2013 02:40Комментарий: 8
bssorsk
Yura063, это в весии УТ свежей 11.0.7,
Код ОбщаяФорма.ДополнительныеОтчетыИОбработки.Форма.Модуль(432, 4) :
Код 1C v 8.2 УП
 ВладелецФормы.Прочитать();   

т.е он перечитывает из объекта , полагая , что вы в свойе обработке записали объект.
bssorsk
12.04.2013 02:38Комментарий: 7
bssorsk
pa240775, Такая же проблема , пробовал по разному , всеравно объект заблокирован.
УТ 11.1
E_Migachev, не сработало, операция недостпна для неоткрытой формы
Yura063
21.03.2013 15:39Комментарий: 6
Yura063
У меня проблема! форма остается не заполненной! когда вставляю Форма.ОбновитьОтображениеДанных(); после копирование данных формы. тоданные выводятся и снова исчезают! что не так
E_Migachev
15.05.2012 18:44Комментарий: 5
E_Migachev
mrDen, смотри 2 код, как раз эта процедура
mrDen
13.05.2012 13:58Комментарий: 4
mrDen
Сделал все по инструкции а они пишет
метод обьекта не обнаружен "ВыполнитьКоманду"

Хотя вот так написал

Код 1C v 8.2 УП
 ДобавитьКоманду(ТаблицаКоманд,
    "Заполнить документ",
    "Заполнить документ",
    "ВызовКлиентскогоМетода",
    Истина);
   

Код 1C v 8.2 УП
 &НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
   
E_Migachev
11.04.2012 11:47Комментарий: 3
E_Migachev
pa240775, может Форма.Закрыть();
pa240775
10.04.2012 13:39Комментарий: 2
pa240775
объект заблокирован мной же. время = времени вывполнения обработки
pa240775
10.04.2012 13:24Комментарий: 1
pa240775
Сделал все как рекомендуется. Данные на форме обновляются. Но записать документ нет возможности. Пишет что Объект заблокирован...

Код 1C v 8.х
 
&НаКлиенте
Процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
	
	//Если ИдентификаторКоманды = "Заполнить" Тогда
	//	
	//	Документ = ОбъектыНазначения[0];
	//	КонецЕсли;

	    //Спросим у пользователя разрешение на продолжение обработки
    Режим = РежимДиалогаВопрос.ДаНет;
    Текст = "Текущие данные документа будут заменены новыми без возможности восстановления.
    |Продолжить?";
    Ответ = Вопрос(Текст, Режим, 0);
    Если Ответ = КодВозвратаДиалога.Да Тогда
   		ЦенаДляУстановки = 1;
		Если ВвестиЧисло(ЦенаДляУстановки, "Введите цену для установки", 10, 2) Тогда
			
	
        //Если пользователь дал разрешение на продолжение, то начнем перебирать все
        //документы, у которых мы планируем заполнить табличную часть
        Для каждого Элемент из ОбъектыНазначения Цикл

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

            //Но нам не надо открывать новую форму (окно) для изменяемого документа, а
            //Нам надо все изменения показать в уже открытых у клиента окнах
            Окна = ПолучитьОкна();
            Для каждого Окно из Окна Цикл

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

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

		КонецЦикла;
		КонецЕсли;
    КонецЕсли;

	
КонецПроцедуры   
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!