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