Обработка табличных частей для 1с 8.3

Различные типовые конфигурации позволяют привязать внешнюю обработку к форме документа так, как если бы она была частью конфигурации, это очень полезно если нет возможности снять конфигурацию с поддержки, а заказчик просит удобную обработку табличной части документа. Для примера создадим обработку для конфигурации бухгалтерия 3.0, будем обрабатывать табличную часть документа требование-накладная.

Создадим новую обработку через конфигуратор.

Для того чтобы обработка корректно зарегистрировалась, необходимо добавить специальные процедуры в модуль объекта нашей новой обработки.

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

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

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

Эти процедуры используются при добавлении обработки в систему. Для информации, описание значений "параметров регистрации":

Вид — в зависимости от предназначения обработки может принимать значения:

  • Отчет
  • ЗаполнениеОбъекта
  • Печатная форма
  • Дополнительная обработка
  • СозданиеСвязанныхОбъектов
  • Дополнительный отчет

В нашем случае для обработки заполнения табличной части нам необходим вид обработки «ЗаполнениеОбъекта»

Назначение — в этом поле перечисляются документы, для которых эта обработка предназначена (в которых она появится после регистрации в информационной базе). Для перечисления этих документов создадим массив «Назначения» и добавим в него документ «ТребованиеНакладная».

Наименование — это наименование будет отображаться в списке дополнительных обработок.

Версия — версия нашего нового программного продукта.

Информация — этот ключ нашей структуры содержит дополнительную информацию о нашей обработке.

Безопасный режим — принимает значение Истина/Ложь. Мы будем использовать безопасный режим.

Команды — этот ключ структуры содержит перечень поставляемых нашей обработкой команд. Для команд мы создадим функцию ПолучитьТаблицуКоманд() и процедуру ДобавитьКоманду().

Немного подробнее остановимся на полях таблицы значений команд.

Представление — это представление команды для пользователя: какое название для него будет представлено в интерфейсе.

Идентификатор — это внутренний идентификатор команды в пределах нашей обработки

Использование — в зависимости от использования команды может принимать значения:

  • ВызовСерверногоМетода — из модуля обработки вызывается серверная процедура.
  • ОткрытиеФормы — используется для открытия формы обработки.
  • ВызовКлиентского метода — для вызова клиентской процедуры из модуля обработки.
  • СценарийвБезопасномРежиме — серверная процедура в безопасном режиме.

В нашем случае мы работаем с формой объекта 1С 8.3, поэтому нам необходимо использовать ВызовКлиентскогоМетода для вызова команды внешней обработки.

ПоказыватьОповещение — имеет одно из двух значений: Истина/Ложь.
Модификатор — дополнительный модификатор команды.

После добавления процедур в модуль объекта обработку уже можно добавить в список обработок, но она еще ничего не умеет делать, поэтому надо создать какую-нибудь процедуру с полезным действием. Создадим и откроем на экране новую форму обработки:

В открывшейся форме добавим процедуры полезного действия, цель - добавлять в табличную часть остатки по счету 10.Х:

 

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

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

&НаСервереБезКонтекста
Функция ЗаполнитьНаСервере(Счет,Склад,Организация,Дата)
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Счет", Счет);
	Запрос.УстановитьПараметр("Склад", Склад);
	Запрос.УстановитьПараметр("Организация", Организация);
	Запрос.УстановитьПараметр("Дата", Дата);
	
	ТекстЗапроса = "ВЫБРАТЬ
	               |	ХозрасчетныйОстатки.Счет КАК Счет,
	               |	ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
	               |	ХозрасчетныйОстатки.Субконто3 КАК Субконто3,
	               |	ХозрасчетныйОстатки.Организация КАК Организация,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК КоличествоОстаток,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоОстатокДт) КАК КоличествоОстатокДт,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоОстатокКт) КАК КоличествоОстатокКт,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоРазвернутыйОстатокДт) КАК КоличествоРазвернутыйОстатокДт,
	               |	СУММА(ХозрасчетныйОстатки.КоличествоРазвернутыйОстатокКт) КАК КоличествоРазвернутыйОстатокКт
	               |ИЗ
	               |	РегистрБухгалтерии.Хозрасчетный.Остатки(
	               |			&Дата,
	               |			Счет = &Счет,
	               |			,
	               |			Субконто3 = &Склад
	               |				И Организация = &Организация) КАК ХозрасчетныйОстатки
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	ХозрасчетныйОстатки.Счет,
	               |	ХозрасчетныйОстатки.Субконто1,
	               |	ХозрасчетныйОстатки.Субконто3,
	               |	ХозрасчетныйОстатки.Организация
	               |
	               |ИМЕЮЩИЕ
	               |	СУММА(ХозрасчетныйОстатки.КоличествоОстатокДт) > 0";
	
	Запрос.Текст = ТекстЗапроса;
	
	РезультатЗапроса = Запрос.Выполнить();
	
	Выборка = РезультатЗапроса.Выбрать();
	
	Строки = Новый Массив();
	
	Пока Выборка.Следующий() Цикл
		НоваяСтрока = Новый Структура("Номенклатура,ЕдиницаИзмерения,Коэффициент,Количество,Счет,ОтражениеВУСН");
		НоваяСтрока.Номенклатура = Выборка.Субконто1;
		НоваяСтрока.ЕдиницаИзмерения = Выборка.Субконто1.ЕдиницаИзмерения;
		НоваяСтрока.Коэффициент 	= 1;
		НоваяСтрока.Количество 		= Выборка.КоличествоОстатокДт;
		НоваяСтрока.Счет 			= Выборка.Счет;
		НоваяСтрока.ОтражениеВУСН 	= Перечисления.ОтражениеВУСН.Принимаются;
		
		Строки.Добавить(НоваяСтрока);
	КонецЦикла; 
	
	Возврат Строки;
		
КонецФункции

Главная процедура ВыполнитьКоманду(ИдентификаторКоманды, ОбъектыНазначенияМассив), остальной код вызывается отсюда.

Готово, теперь сохраняем обработку идем в режиме 1с:предприятие в меню Администрирование - Печатные формы, отчеты и обработки - Дополнительные обработки - Добавляем в список нашу обработку

Проверяем работу, в документе "тебования-накладная" появится новое меню "Заполнить документ":

Добавить комментарий