В продолжении темы поднятой ранее на форуме "Правильная модификация решения: механизм учета доп. характеристик и свойств, надстройки к механизму ВПФ Залоговый билет" по данному отраслевому решению выкладываю свои наработки (требующие серьезной отладки под Ваше решение). Камнем преткновения стала печатная форма Залогового билета. Особенность в том, что сам документ содержит очень много специфических данных, рассчитываемых по алгоритмам самого документа. Естественно, что все это дело вытащить без потерь функциональности без ошибок проблематично. Я поступил так:
1. Создал панель кнопок в документе (см рисунок 1).
Рисунок 1 - кнопки документа
2. Вставил в конфигурацию нижеприведенный код:
//###Дор+
//Описание доработки: Вызов ВПФ для печати:
Процедура ДействияФормыпДоговорЗалога(Кнопка)
ПечатьИзВПФ("ВДГБ_ВПФ_ДоговорЗалога"); // Приходится передавать ДокументОбъект!
КонецПроцедуры
Процедура ДействияФормыпЗалоговыйБилет(Кнопка)
ПечатьИзВПФ("ВДГБ_ВПФ_ЗалоговыйБилет"); // Приходится передавать ДокументОбъект!
КонецПроцедуры
Процедура ДействияФормыпДоговорЗайма2014(Кнопка)
ПечатьИзВПФ("ВДГБ_ВПФ_ДоговорЗайма2014"); // Приходится передавать ДокументОбъект!
КонецПроцедуры
Процедура ДействияФормыпДоговорЗалогаПТС(Кнопка)
ПечатьИзВПФ("ВДГБ_ВПФ_ДоговорЗалогаПТС"); // Приходится передавать ДокументОбъект!
КонецПроцедуры
// Описание доработки: Вызывает данные функции из справочника ВПФ по строгому соответствию имени и передает им объект.
Процедура ПечатьИзВПФ(ИмяВПФ);
СсылкаНаВПФ = Справочники.ВнешниеОбработки.НайтиПоНаименованию(ИмяВПФ);
Если СсылкаНаВПФ.Пустая() Тогда
Сообщить("В справочнике 'Внешние обработки' не нашли внешнюю печатную форму с наименованием '"+ИмяВПФ+"'");
Возврат;
КонецЕсли;
Попытка
ИмяВременногоФайла = КаталогВременныхФайлов()+"тмп_впф.epf";
Исключение
Сообщить ("Невозможно создать файл обработке в каталоге временных файлов <<"+
+КаталогВременныхФайлов()+">>. Возможно, не хватает прав доступа в Windows в папку для данного сеанса 1С ");
Возврат;
КонецПопытки;
ДвоичныеДанные = СсылкаНаВПФ.ХранилищеВнешнейОбработки.Получить();
ДвоичныеДанные.Записать(ИмяВременногоФайла);
Попытка
ОбрОбъект = ВнешниеОбработки.Создать(ИмяВременногоФайла);
ОбрОбъект.ДокОбъект = ЭтотОбъект; // НЕ исп. метод скопировать. Передать ТАК - особенности ВДГБ;
Исключение
Сообщить("Ошибка создания объекта из временного файла обработки "+ИмяВременногоФайла);
Возврат;
КонецПопытки;
// Проба печати
Попытка
ТаблДок = ОбрОбъект.Печать();
ТаблДок.Вывести();
Исключение
А=1; // Точка останова для отладки!
Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке() )); // ВНЕШНЮЮ печатную форму из справончика ВПФ можно спокойно поправить!
КонецПопытки;
КонецПроцедуры
//###Дор-
3. Создал "с нуля" ВПФ для залогового билета (и параллельно обычные ВПФ договоров ПТС и прочих без использования данного механизма (фрагменты тут в статье и приложениях в виде объектов конфигурации в *.cf и внешних отчетов и обработок.
4. По залоговым вещам (вроде) добавил регистр сведений и еще что-то(см рисунки 2 и 3 по объектам учета)...
Рисунок 2 - вариант 1 с регистором сведений
Рисунок 3 - вариант 2 с регистром сведений
Далее, фрагменты кода из конфигурации:
Перем мУчетнаяПолитикаЛомбарда Экспорт; // Хранит настройки учетной политики ломбарда.
Перем мДокументОбъект Экспорт; // Хранит объект вызвавшего документа. СЮДА передадим для ЗалоговогоБИЛЕТА!
Перем мВалютаРегламентированногоУчета; // Хранит значение константы "Валюта регламентированного учета"
Перем мДанныеКредитования;
Перем мСхема;
///Перем СсылкаНаОбъект;
//---------------
//---------------
Функция ПолучитьУсловияПоСхемеКредитования()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.Период,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.СхемаКредитования,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ИзмерениеКредита,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ИзмерениеХранения,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ИзмерениеПросрочки,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ИзмерениеОценки,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ИзмерениеСнятияСРеализации,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ПериодКредита,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ПериодХранения,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ПериодПросрочки,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ВариантРасчетаСуммыЗаКредит,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ВариантРасчетаСуммыЗаХранение,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ВариантРасчетаСуммыЗаОценку,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ВариантРасчетаСуммыЗаПросрочку,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ЗаКредит,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ЗаХранение,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ЗаПросрочку,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ЗаОценку,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ЗаСнятиеСРеализации,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ОграничениеНачисленияЗаКредит,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.МинимальныйСрокКредит,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.МинимальныйСрокХранение,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.МинимальнаяСуммаКредит,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.МинимальнаяСуммаХранение,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ОснованиеРасчетаКредита,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ОснованиеРасчетаХранения,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ОснованиеРасчетаПросрочки,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ОснованиеРасчетаОценки,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.ОснованиеРасчетаСнятияСРеализации,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.УдалитьОтСуммыСсудыКредит,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.УдалитьОтСуммыСсудыХранение,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.УдалитьОтСуммыСсудыПросрочку,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.УдалитьОтСуммыСсудыОценку,
| ЛМБ_УсловияПредоставленияКредитаСрезПоследних.УдалитьОтСуммыСсудыСнятиеСРеализации
|ИЗ
| РегистрСведений.ЛМБ_УсловияПредоставленияКредита.СрезПоследних(&ДатаДок, СхемаКредитования = &Схема) КАК ЛМБ_УсловияПредоставленияКредитаСрезПоследних";
Запрос.УстановитьПараметр("ДатаДок", ДокОбъект.Дата);
Запрос.УстановитьПараметр("Схема", ДокОбъект.СхемаКредитования);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("Ошибка получения схемы кредитования для документа (схема не установлена в документе) "+ДокОбъект);
ВызватьИсключение("Ошибка получения схемы кредитования для документа"+ДокОбъект);
Возврат Неопределено;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий(); // Точно есть один!
Возврат Выборка;
КонецФункции
Функция ПолучитьПроцентПоКредиту()
Возврат мСхема.ЗаКредит;
КонецФункции
Функция ПолучитьПроцентЗаХранение()
Возврат мСхема.ЗаХранение;
КонецФункции
Функция ПолучитьСтруктуруХарактеристикВещи (Вещь)
Стр = Новый Структура("Имя, Значение"); // Имя и значение характерискик АВТО (если они есть)
Если ТипЗнч(Вещь) <> Тип("СправочникСсылка.ЛМБ_ЗалоговыеВещи") Тогда
Возврат Стр; // не тот тип
КонецЕсли;
Если Вещь.ПустаяСсылка() Тогда
Возврат Стр; // пустая
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЗначенияСвойствОбъектов.Значение,
| ЗначенияСвойствОбъектов.Свойство КАК ДопРеквизит
|ИЗ
| РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
|ГДЕ
| ЗначенияСвойствОбъектов.Объект = &Вещь
| И НЕ ЗначенияСвойствОбъектов.Свойство.ПометкаУдаления";
Запрос.УстановитьПараметр("Вещь", Вещь);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Стр; // Пусто или прав не хватило для прочтения(маловероятно) - тогда для ошибки периода исп. убрать РАЗРЕШЕННЫЕ
КонецЕсли;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Стр.Вставить(Выборка.ДопРеквизит, Выборка.Значение);
КонецЦикла;
Возврат Стр;
КонецФункции
Функция ХарактеристикиВещиТекстомВВидеСписка (Вещь)
стр = ""; // На выходе Марка машины: ГАЗ + переносСтроки и.т.д.
Структ = ПолучитьСтруктуруХарактеристикВещи(Вещь);
Если Структ.Количество() = 0 Тогда
Возврат стр; // Вернем пустую строку
КонецЕсли;
Для каждого ЭлемСтр Из Структ Цикл
Стр = Стр + ЭлемСтр.Ключ +": "+ЭлемСтр.Значение+Символы.ПС;
КонецЦикла;
Возврат Стр;
КонецФункции
Зачем ТАК спросите Вы? ВПФ все-таки проще править и заменить, чем лезть в конфигурацию. Хотя именно залоговый билет с глюками и пригодится как строительный материал программистам, которым по долгу службы в принудительном порядке или уже добровольно придется дорабатывать ТАКОЕ отраслевое решение. Печатные формы кроме залогового билета (по ней основная сложность) могут быть работоспособны.
Надеюсь, данная методика и материалы могут пригодиться.
P.S. Ниже буду приводить редкие материалы, посвященные разработе по данной тематике
- интересное решение //infostart.ru/public/205109/ - Подбор залоговых вещей в документ "Подготовка к продаже" в конфигурации "ВДГБ: Ломбард 3"