Описание задачи
В настоящей статье мы рассмотрим ситуацию, когда прямо из отчета СКД нужно создать документ. Для наглядности приведем реальный пример, с которым в дальнейшем и будем работать. Итак, у фирмы есть имущество. Оно либо хранится на складе, либо находится у кого то в пользовании. Есть отчет, который отражает свободное имущество, которое в данный момент находится на складе. Задача заключается в том, чтобы можно было открыть отчет, выбрать в нем имущество и передать его в пользование. Стандартные методами СКД такое сделать не получится, поэтому придется дорабатывать отчет программно.
Отчет СКД – создание формы отчета
Итак, для начала создадим форму отчета. Если вы не знаете, как это сделать, можно почитать об этом в другой статье по СКД (пункт Решение задачи). Есть два варианты решения задачи. В первом варианте в пользование передается только одно конкретное имущество. Более интересный вариант, когда можно сформировать список имущества и передать его в пользование. Рассмотрим оба варианта. Для этого создадим на форме реквизит СписокПередачиВПользование с типом ТаблицаЗначений. Далее добавим две колонки – Имущество и инвентарный номер. Первый реквизит это ссылка. У вас при решении подобной задачи предметная область может быть другая, главное понять суть.
Теперь поместим созданную таблицу значений на форму, например ниже табличного документа Результат. Далее на вкладке Команды создадим две команды – ОчиститьСписок и ПередатьВПользование. Разместим их на командной панели созданной таблицы списка выбранного имущества. Должно получиться примерно следующее:
Описание процедур и функций
Наконец, приступим непосредственно к написанию кода. В свойствах табличного документа Результат инициируем событие ОбработкаДополнительнойРасшифровки. Добавим два дополнительных пункта контекстного меню – сформировать документ передачи в пользование или добавить в список имущество. В первом случае выбранное имущество будет передано в пользование. Во втором случае имущество добавится в список, который после можно будет передать в пользование.
&НаКлиенте
Процедура РезультатОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка, ДополнительныеПараметры)
СтандартнаяОбработка = Ложь;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет));
ОписаниеОповещения = Новый ОписаниеОповещения("ПоказатьВыборДействияЗавершение", ЭтаФорма, Расшифровка);
ДополнительныеДействияМеню = Новый СписокЗначений;
ДополнительныеДействияМеню.Добавить("Сформировать документ Передача в пользование");
ДополнительныеДействияМеню.Добавить("Добавить в список для передачи в пользование");
ОбработкаРасшифровки.ПоказатьВыборДействия(ОписаниеОповещения, Расшифровка, , ДополнительныеДействияМеню);
КонецПроцедуры
Теперь нужно описать выбор каждого из действий:
&НаКлиенте
Процедура ПоказатьВыборДействияЗавершение(ВыполненноеДейсвтие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт
Если ВыполненноеДейсвтие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда
ПоказатьЗначение(Неопределено, ПараметрВыполненногоДействия);
ИначеЕсли ВыполненноеДейсвтие = "Сформировать документ Передача в пользование" Тогда
ПолеРасшифровки = ПолеРасшифровки(ДополнительныеПараметры);
СоздатьДокументПередачаВПользование(ПолеРасшифровки);
ИначеЕсли ВыполненноеДейсвтие = "Добавить в список для передачи в пользование" Тогда
ПолеРасшифровки = ПолеРасшифровки(ДополнительныеПараметры);
ДобавитьВСписокПередачиВПользование(ПолеРасшифровки);
КонецЕсли;
КонецПроцедуры
Итак, у нас появилась неизвестная функция ПолеРасшифровки. Данная функция определяет поле расшифровки по самой расшифровке. Опишем ее:
&НаСервере
Функция ПолеРасшифровки(Расшифровка)
Возврат ПолучитьИзВременногоХранилища(ДанныеРасшифровки).Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
КонецФункции
Далее опишем процедуру создания документа передачи в пользование. Она сделана универсальной, чтобы можно было передать в пользование как одно конкретное имущество, так и список. Еще одна особенность заключается в проверке на группу. Другими словам, функция проверяет, не пытается ли пользователь добавить в список группу имущества. В противном случае программа выдаст предупреждение.
&НаКлиенте
Процедура СоздатьДокументПередачаВПользование(Имущество) Экспорт
Если Имущество <> Неопределено И ТипЗнч(Имущество) <> Тип("Массив") Тогда
ИмуществоЭтоГруппа = ИмуществоЭтоГруппа(Имущество);
Если ИмуществоЭтоГруппа Тогда
ПоказатьПредупреждение(, "Невозможно передать в пользование группу имущества");
Иначе
ФормаПередачаВИспользование = ПолучитьФорму("Документ.ПередачаВПользование.ФормаОбъекта");
ДанныеФормы = ФормаПередачаВИспользование.Объект;
ЗаполнитьПередачаВПользование(ДанныеФормы, Имущество);
КопироватьДанныеФормы(ДанныеФормы, ФормаПередачаВИспользование.Объект);
ФормаПередачаВИспользование.Открыть();
КонецЕсли;
ИначеЕсли ТипЗнч(Имущество) = Тип("Массив") Тогда
ФормаПередачаВИспользование = ПолучитьФорму("Документ.ПередачаВПользование.ФормаОбъекта");
ДанныеФормы = ФормаПередачаВИспользование.Объект;
ЗаполнитьПередачаВПользование(ДанныеФормы, Имущество);
КопироватьДанныеФормы(ДанныеФормы, ФормаПередачаВИспользование.Объект);
ФормаПередачаВИспользование.Открыть();
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПередачаВПользование(ДанныеФормы, Имущество)
ДокПередачаВПользование = Документы.ПередачаВПользование.СоздатьДокумент();
ДокПередачаВПользование.Автор = Пользователи.ТекущийПользователь();
ДокПередачаВПользование.Ответственный = УправлениеСтроительствомСервер.ПолучитьПервогоСотрудникаПользователя(Пользователи.ТекущийПользователь());
ДокПередачаВПользование.Дата = ТекущаяДата();
ДокПередачаВПользование.Организация = ОрганизацииСлужебный.ОрганизацияПоУмолчанию();
Если ТипЗнч(Имущество) = Тип("Массив") Тогда
Для каждого Стр Из Имущество Цикл
СтрПередачаВПользование = ДокПередачаВПользование.ТаблицаИмущества.Добавить();
СтрПередачаВПользование.Имущество = Стр;
КонецЦикла;
Иначе
СтрПередачаВПользование = ДокПередачаВПользование.ТаблицаИмущества.Добавить();
СтрПередачаВПользование.Имущество = Имущество;
КонецЕсли;
ЗначениеВДанныеФормы(ДокПередачаВПользование, ДанныеФормы);
КонецПроцедуры
Функция ИмуществоЭтоГруппа(Имущество) Экспорт
Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(Имущество, "ЭтоГруппа");
КонецФункции // ()
Итак, мы описали процесс передачи в пользование одного конкретного имущества. Кроме того, описан процесс заполнения списка имущества для передачи в пользование. Осталось только создать документа на основе имеющихся данных. Так как универсальная процедура создания документа передачи в пользование уже описано, осталось ее вызвать по нажатии на кнопку. Опишем команду ПередатьВПользование:
&НаКлиенте
Процедура ПередатьВПользованеие(Команда)
СоздатьДокументПередачаВПользование(МассивСтрокТаблицыЗначений("Имущество"));
СписокПередачиВПользование.Очистить();
КонецПроцедуры
&НаСервере
Функция МассивСтрокТаблицыЗначений(ИмяКолонки)
Возврат СписокПередачиВПользование.Выгрузить(, ИмяКолонки).ВыгрузитьКолонку(ИмяКолонки);
КонецФункции // ()
Ну и напоследок опишем команду очистки списка добавленного имущества
&НаКлиенте
Процедура ОчиститьСписок(Команда)
СписокПередачиВПользование.Очистить();
КонецПроцедуры
Осталось посмотреть, как в итоге будет выглядеть отчет СКД.
Если внимательно посмотреть на отчет, то можно увидеть отбор “не равно ЛишняяИерархия”, что это такое можно почитать в нашей статье.
Пингбэк: 1С СКД Как свернуть группировки при открытии отчета - АйтиВиар