Имя: Пароль:
1C
1С v8
БСП: Печатная форма с изменяемым макетом
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".

Как решается задача в обход стандартного механизма - вполне понятно. Как реализовать в общепринятом порядке - вот какой вопрос.
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший