|
БСП: Печатная форма с изменяемым макетом | ☑ | ||
---|---|---|---|---|
0
NikePopov
01.08.14
✎
14:15
|
Доброго всем дня!
Для БСП версии 2.1 начал делать обработку. Обработка представляет собой внешнюю печатную форму, очень простую по своей структуре. В обработке есть - макет(куча текста, в паре мест подставляются номер и дата документа и реквизиты контрагента и организации) - модуль объекта с текстом Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; МассивНазначений = Новый Массив; МассивНазначений.Добавить("Документ.Питание_Приход"); ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //возможны варианты - ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов, ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); ПараметрыРегистрации.Вставить("Наименование", "Экспертное заключение"); //имя под kt обработка зарегистрирована будет в справочнике внешних обработок ПараметрыРегистрации.Вставить("Версия", "1.1"); ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ); ПараметрыРегистрации.Вставить("ВерсияБСП", "1.2.1.4"); ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма к документу Приход "); //команды ТаблицаКоманд = Новый ТаблицаЗначений; ТаблицаКоманд.Колонки.Добавить("Представление"); //как будет выглядеть описание печ.формы для пользователя ТаблицаКоманд.Колонки.Добавить("Идентификатор"); //имя нашего макета ТаблицаКоманд.Колонки.Добавить("Использование"); //ВызовСерверногоМетода ТаблицаКоманд.Колонки.Добавить("ПоказыватьОповещение"); //Истина ТаблицаКоманд.Колонки.Добавить("Модификатор"); //ПечатьМХL НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = "Напечатать ""Экспертное заключение"""; НоваяКоманда.Идентификатор = "ЭкспертноеЗаключение"; //Внешняя печатная форма НоваяКоманда.Использование = "ВызовСерверногоМетода"; //здесь можно прописать использование как серверного так и клиентского, отличие в том, что серверный метод будет обращаться к экспортной процедуре из модуля объекта, клиентский - к экспортной процедуре из модуля формы объекта НоваяКоманда.ПоказыватьОповещение = Истина; НоваяКоманда.Модификатор = "ПечатьMXL"; ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции Функция ПолучитьСтруктуруЗаполнения(Ссылка) Результат = Новый Структура; Питание_НаСервере.ЗаполнитьСтруктуруОрганизации(Ссылка.Организация, Результат, Ссылка.Дата); Результат.Вставить("НаименованиеПоставщика", Ссылка.Поставщик.НаименованиеПолное); Результат.Вставить("НомерДоговора", Ссылка.Договор.Номер); Возврат Результат; КонецФункции // ПолучитьСтруктуруЗаполнения() Функция СформироватьЭкспертноеЗаключение(ТабДокумент, ИмяМакета, Ссылка) Макет = ПолучитьМакет(ИмяМакета); ОбластьДокумента = Макет.ПолучитьОбласть("Документ"); СтруктураЗаполнения = ПолучитьСтруктуруЗаполнения(Ссылка); ОбластьДокумента.Параметры.Заполнить(СтруктураЗаполнения); ТабДокумент.Вывести(ОбластьДокумента); Возврат ТабДокумент; КонецФункции // СформироватьЭкспертноеЗаключение() Функция СформироватьТабличныйДокумент(ИмяМакета, МассивОбъектов) ТабДокумент = Новый ТабличныйДокумент; Для каждого Ссылка Из МассивОбъектов Цикл СформироватьЭкспертноеЗаключение(ТабДокумент, ИмяМакета, Ссылка) КонецЦикла; Возврат ТабДокумент; КонецФункции // СформироватьТабличныйДокумент() Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт // Реализация логики команды печати Для каждого СтруктураПечатнойФормы Из КоллекцияПечатныхФорм Цикл СтруктураПечатнойФормы.ТабличныйДокумент = СформироватьТабличныйДокумент(СтруктураПечатнойФормы.ИмяМакета, МассивОбъектов); КонецЦикла; КонецПроцедуры Собственно отлично все кроме одного: надо чтобы макета пользователь в дальнейшем мог бы изменить. То есть текст макета может меняться и пользователь достаточно компетентен для того, чтобы его сам поправить не сломав указанные там параметры. Не могу понять, какую функцию требуется использовать в БСП для получения актуального пользовательского макета(пример использования есть в БП 3.0 для счета на оплату), чтобы использовать стандартный механизм получения пользовательской формы. Я знаю, что строку Макет = ПолучитьМакет(ИмяМакета); надо поменять на что-то типа Макет = ДополнительныеОтчетыИОбработки.ПолучитьПользовательскийМакет("ВнешняяОбработка.ЭкспертноеЗаключение." + ИмяМакета); Но конкретной функции найти не могу. А в бухгалтерии вообще запутался в куче вызываемых процедур. Никто не сталкивался с таким вопросом? |
|||
1
NikePopov
01.08.14
✎
14:21
|
Что макет хранится в регистре сведений "ПользовательскиеМакетыПечати" я знаю. И написать такую функцию не сложно. Просто в следующий раз не придется этим заниматься, если сейчас найти решение.
|
|||
2
NikePopov
01.08.14
✎
14:27
|
Так, функция найдена: УправлениеПечатью.ПолучитьМакет(ПолныйПутьКМакету)
|
|||
3
NikePopov
01.08.14
✎
14:28
|
Но не ясно, кто положит начальный макет туда?
|
|||
4
Леха Дум
01.08.14
✎
14:31
|
Эта функция используется для встроенных объектов - если макет встроен в конфу - работать будет, для внешнего макета - хз - попробуй - расскажешь. Смысл в том, что пользователь может измененить исходный макет - измененный макет сохраняется в регистре сведений. Функция анализирует наличие макета в рег.сведений - есть берет из регистра, нет - берет указанный в пути
|
|||
5
NikePopov
01.08.14
✎
14:50
|
(4) Это понятно. судя по коду возьмет из внешней обработки без проблем. Но после первого запуска она не появляется в регистре. Функция "УправлениеПечатью.ПолучитьМакет" только проверяет есть ли он в регистре и возвращает какой сможет, но не кладет его для редактирования в регистр. А значит пользователь не сможет его поменять.
|
|||
6
acsent
01.08.14
✎
14:54
|
Нужно самому регистрировать макет
|
|||
7
NikePopov
01.08.14
✎
14:57
|
(6) Если способ единственный, тогда всё ясно.
(4) И тут я ошибся процедура ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени не работает с внешними обработками. И мне стало совсем грустно. |
|||
8
Леха Дум
01.08.14
✎
15:31
|
я чего то не понял - на кой ляд тебе эта функция, если печатная форма подключаемая? Если все же нужно дать возможность пользователям редактировать макет - укажи в параметре функции путь на встроенный макет (добавь его в конфигурацию) и все должно получиться
|
|||
9
NikePopov
04.08.14
✎
12:38
|
(8) Я не планирую выезжать на 1 ч. для "настройки макета" или консультировать по телефону(например, поменялась формулировка "исполнение соглашения" на "выполнение обязательств").
То есть, мне нужно, чтобы пользователь смог сам решить "свои" проблемы в данном случае. Я могу написать инструкцию: 1. Зайди в дополнительные отчеты и обработки(прав, кстати у него на это нет) 2. Сохрани обработку на диск 3. Открой ее конфигуратором(тоже проблема с правами) 4. Измени макет(там внизу ...) 5. Сохрани обработку 6. Загрузи ее обратно(тоже прав нет) Итог: 1. Напряг администратора БД 2. Неизвестно будет ли работать обработка 3. Заморочил человека Хочу написать инструкцию: 1. Сформируй отчет(права есть) 2. Нажми на карандашик над отчетом(права есть) 3. Исправь макет(права есть) 4. Нажми кнопку "закончить рекдактирование" 5. Переформируй отчет. Итог: 1. Я не нужен для решения данной проблемы 2. Администратор БД не нужен 3. Сотруднику интуитивно понятно что делать Вариант с добавлением макета в конфигурацию известен, но не хочу включать возможность редактирования в девственную информационную базу. Во-первых, просто интересно сделать без снятия с поддержки. Во-вторых, это дает повод другим пришедшим 1С-никам без зазрения совести что-то подменять в конфигурации БД с лозунгом: "Она у вас всё равно уже измененная, что с ней будет?" |
|||
10
Kamas
04.08.14
✎
12:55
|
(9) сохрани mxl на диск или в базу куда нить хоть как доп реквизит к справочнику внешние обработки
|
|||
11
Kamas
04.08.14
✎
12:57
|
(10) да значение в строку пихаеш в допреквизиты значение из строки достаеш и заполняеш. И отдельно функция для редактирования нажал подправил сохранил печатаеш.
|
|||
12
GreatOne
04.08.14
✎
13:06
|
сейчас гляну, тоже возился. Далеко лежит просто
|
|||
13
NikePopov
04.08.14
✎
13:07
|
(11) Это проще в стандартном и предназначенном для этого регистре. Он вполне для этого подходит.
Не подходит только процедура редактирования. |
|||
14
GreatOne
04.08.14
✎
13:11
|
Макет = УправлениеПечатью.МакетПечатнойФормы("Обработка.ПечатьОбщихФорм.ПФ_MXL_ТОРГ12");
вроде оно. Нет сейчас под рукой базы с БСП( Если не ошибаюсь, префикс ПФ_MXL тоже обязательный для имя макета. |
|||
15
Злопчинский
04.08.14
✎
14:18
|
на Инфостарте есть разработки подобного рода, по первому осмотру/впечатлению - вроде неплохие
|
|||
16
NikePopov
04.08.14
✎
16:17
|
(14) Не смог найти что-то похожее на "МакетПечатнойФормы" ни в одном из методов модулей УправлениеПечатью*.
Не нашел Обработка.ПечатьОбщихФорм, и какого-либо специфичного алгоритма анализа данного значения, а обработки такой нет. Выдаст ошибку при получении макета. Вариант логичен с точки зрения методологии БСП, но не могу найти ничего на это похожего. (15) Был бы признателен, если поделитесь более подробной информацией. До создания ветки форма - прошерстил довольно много информации, в том числе и на infostart. Ничего похожего не нашел. |
|||
17
Мимохожий Однако
04.08.14
✎
16:33
|
Добавь в обработку форму настройки макета с соответствующей командной кнопкой. Макет выведи на форму и сохраняй с реквизит типа Хранилище значений. При открытии формы заполняй макетом по умолчанию или из заполненного реквизита с макетом, который правит пользователь.
При формировании используй сохраненный макет. |
|||
18
NikePopov
04.08.14
✎
17:53
|
(17) Благодарю за идею. Но с ней как и с остальными обходится стандартный механизм(БСП). В этом собственно и проблема. Сделать макет редактируемым проблемы нет. Можно его хранить в хранилище значений(17), в соседнем файле(10), в допреквизите(11) в специализированном регистре(раз уж БСП есть в конфигурации). Все эти варианты одинаково хороши.
Но задача была другой: Использовать механизм БСП. Если выполнить данную задачу можно достигнуть следующие бонусы: 1. Стандарт интерфейса; 2. Обработка прогрессирует(или деградирует) вместе с БСП; 3. Не надо писать никаких дополнительных форму, команд или прочего кода; 4. Надежность: механизм тестируется огромным числом пользователей "1С:Предприятие 8". Как решается задача в обход стандартного механизма - вполне понятно. Как реализовать в общепринятом порядке - вот какой вопрос. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |