|
Вызвать процедуру менеджера документа из другого документа (Печать) | ☑ | ||
---|---|---|---|---|
0
slafor
26.09.20
✎
00:01
|
Хочу распечатать один документ из другого. Конкретно - надо из документа другого вида вызвать процедуру печати Реализации товаров и услуг, чтобы распечатать "Комплект печатных форм с настройкой". Для этого, как я понимаю, надо как-то обратиться к экспортной процедуре Печать из менеджера документа Реализации. Читаю-читаю на эту тему, и никак не могу понять...
Есть ссылка на документ Реализации. Получаю объект - там такой процедуры нет. Наверное, потому что она в модуле менеджера. Как обратиться к менеджеру? |
|||
1
RomanYS
26.09.20
✎
00:03
|
Документы.РеализацияЧегоТоТам.ЭкспортныйМетод(параметры,..);
|
|||
2
Garykom
гуру
26.09.20
✎
00:09
|
(0) Модуль менеджера относится "ко всем объектам данного вида".
Модуль объекта к "конкретному объекту". Так что см. (1) |
|||
3
slafor
26.09.20
✎
00:40
|
(1)(2) Спасибо.
Но оказалось, что этого мало ) УТ 11 написана на БСП и для печати комплекта документов (печатных форм) надо вызывать экспортную процедуру общего модуля (УправлениеПечатьюУТКлиент.ПечатьКомплектаДокументовСНастройкой(ОписаниеКоманды)), а при записи 1С ругается, говорит, что "Переменная не определена (УправлениеПечатьюУТКлиент) (Проверка: Сервер)". Хотя после точки (УправлениеПечатьюУТКлиент.) сама подсказывает нужные процедуры и функции общего модуля. Странно... |
|||
4
RomanYS
26.09.20
✎
00:43
|
(3) Почему странно? Наличие в одной строке "Клиент" и "Сервер" намекает...
"Переменная не определена (УправлениеПечатьюУТКлиент) (Проверка: Сервер)" |
|||
5
slafor
26.09.20
✎
10:10
|
(4) Да, действительно...
Просто никогда с БСП до этого не работал, но надо же когда-то начинать. Дело в том, что в УТ 11 есть такой документ - "Задание на перевозку". В нем есть ТЧ Распоряжения - как правило, там либо заказы клиентов, либо реализации (те, которые без заказов). Так вот, нам надо добавить в меню Печать пунктик "Комплект документов с настройкой...", но на печать надо выводить печатные формы из реализаций. То есть получается так, что сначала я получаю список реализаций (по заказам, или без заказов - по заказам я их, естественно, получаю запросом), а потом по каждой реализации запускаю стандартную процедуру печати документов с настройкой. Вроде все просто. В модуле менеджера документа "Задание на перевозка" есть стандартная процедура ДобавитьКомандыПечати. В ней можно дописать такой код: // Комплект документов с настройкой КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Обработчик = "УправлениеПечатьюУТКлиент.ПечатьКомплектаДокументовСМНастройкой"; КомандаПечати.МенеджерПечати = ""; КомандаПечати.Идентификатор = "КомплектДокументовСНастройкой"; КомандаПечати.Представление = НСтр("ru = 'Комплект документов с настройкой...'"); КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; (p.s. Кстати, странно, почему это в типовой заложено и работает, ведь менеджер объекта работает на сервере, а общий модуль УправлениеПечатьюУТКлиент - клиентский... Но работает). Естественно, мне пишут, что "печать комплекта документов для Задания на перевозку не поддерживается". Но мне и не нужно печатать комплект для этого документа, мне нужно печатать его для связанных с ним реализаций. Делаю вот что. Создаю новый модуль ДополнительныйМодульКлиент (клиентский), подменяю в процедуре ДобавитьКомандыПечати стандартный обработчик на новый (из нового модуля, ДополнительныйМодульКлиент.ПечатьКомплектаДокументовСМНастройкой), а в нем собираюсь получить список реализаций и вызвать стандартную функцию (УправлениеПечатьюУТКлиент.ПечатьКомплектаДокументовСМНастройкой). Но тут нужен запрос, а модуль-то клиентский! Делаю еще один общий модуль - ДополнительныйМодульСервер (серверный), чтобы вызвать его из модуля ДополнительныйМодульКлиент (кдиентский) и вернуть результат обратно. Но клиентский общий модуль не видит модуля серверного. Совсем запутался и прошу помощи ). Может быть, подскажете, что я деляю не так? Или кто-то уже с этим сталкивался? |
|||
6
slafor
26.09.20
✎
10:34
|
Немного добавлю для пояснения.
В процедуре УправлениеПечатьюУТКлиент.ПечатьКомплектаДокументовСМНастройкой стоят такие строки: ОткрытьФорму( "РегистрСведений.НастройкиПечатиОбъектов.Форма.НастройкаПечатиКомплекта", Новый Структура("Объекты", ОписаниеКоманды.ОбъектыПечати)); В качестве объектов печати там стоит документ "Задание на перевозку", а мне нужно, чтобы стоял "Реализация товаров и услуг". |
|||
7
slafor
26.09.20
✎
10:49
|
Пробую установить на общем модуле обе галки - клиент и сервер - и разместить все в одном модуле.
Но процедура, которая &НаКлиенте не видит функцию, которая &НаСервере... |
|||
8
Ненавижу 1С
гуру
26.09.20
✎
10:49
|
сделайте уже внешней печатной формой и не делайте моск!
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм,ОбъектыПечати, ПараметрыВывода) Экспорт // Устанавливаем признак доступности печати покомплектно. ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина; НаименованиеПФ = "ИТ_УПДРасширенный"; Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм,НаименованиеПФ) Тогда // Формируем табличный документ и добавляем его в коллекцию печатных форм. УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, НаименованиеПФ, НаименованиеПФ, ПечатьДокумента(МассивОбъектов, ОбъектыПечати), , ); КонецЕсли; КонецПроцедуры |
|||
9
slafor
26.09.20
✎
10:56
|
(8) Нужно именно с настройкой, причем с сохраняемой...
|
|||
10
hhhh
26.09.20
✎
11:21
|
(9) а разве во внешней печатной форме настроки несохраняемые?
|
|||
11
slafor
26.09.20
✎
11:27
|
(10) Я имею ввиду, что нужно сохранять список объектов (ПФ) для печати. Для этого и существует РС и форма НастройкаПечатиКомплекта. Неужели никак не получится вызвать ее программно? Нужно только ОбъектыПечати изменить, но как это сделать, если она открывается из клиента, а запрос там не работает, и серверные функции не видно?
В общем, мне главное надо понять, откуда в этой процедуре берутся ОбъектыПечати... ОткрытьФорму( "РегистрСведений.НастройкиПечатиОбъектов.Форма.НастройкаПечатиКомплекта", Новый Структура("Объекты", ОписаниеКоманды.ОбъектыПечати)); |
|||
12
Ненавижу 1С
гуру
26.09.20
✎
11:45
|
(11) там все это есть, я добавил свою внешнюю обработку, потом засунул ее в комплект
|
|||
13
slafor
26.09.20
✎
11:48
|
Вот в менеджере документа есть код:
КомандаПечати = КомандыПечати.Добавить(); КомандаПечати.Обработчик = "УправлениеПечатьюУТКлиент.ПечатьКомплектаДокументовСНастройкой"; КомандаПечати.МенеджерПечати = ""; КомандаПечати.Идентификатор = "КомплектДокументовСНастройкой"; КомандаПечати.Представление = НСтр("ru = 'Комплект документов на принтер'"); КомандаПечати.ПроверкаПроведенияПередПечатью = Истина; Он добавляет команду печати, по которой вызывается обработчик УправлениеПечатьюУТКлиент.ПечатьКомплектаДокументовСНастройкой. Обработчик - это функция общего модуля ПечатьКомплектаДокументовСНастройкой(ОписаниеКоманды). В структуре ОписаниеКоманды есть массив ОбъектыПечати. Единственное, что мне нужно понять - это откуда берется эта структура и этот массив, и как его изменить. Все. И проблема будет решена. Надеюсь ) |
|||
14
Ненавижу 1С
гуру
26.09.20
✎
12:05
|
(13) есть желание ломать типовую - вперед, проходили это
|
|||
15
slafor
26.09.20
✎
12:27
|
(14) Не, вот именно этого я не хочу. Тоже проходил )
Но ведь эта структура откуда-то все-таки берется же... |
|||
16
slafor
26.09.20
✎
18:33
|
Получилось!!!
Правда, не так, как я хотел. Сделал отдельную кнопку (не в меню Печать), а из нее напрямую обратился к функции в общем модуле. Пришлось, правда, вручную описывать всю структуру параметра ОписаниеКоманды. Как-то так: &НаКлиенте Процедура ПечатьКомплектаРеализаций(Команда) МассивРеализаций = ПолучитьКомплектРеализацийНаСервере(); ОписаниеКоманды = Новый Структура; ОписаниеКоманды.Вставить("Вид","Печать"); ОписаниеКоманды.Вставить("Идентификатор", "КомплектДокументовСНастройкой"); ОписаниеКоманды.Вставить("Представление", "Комплект документов с настройкой..."); ОписаниеКоманды.Вставить("Подменю", ""); ОписаниеКоманды.Вставить("Важность", ""); ОписаниеКоманды.Вставить("Порядок", 2); <...полное описание структуры, где-то 20- строк никому не нужного кода, иначе работать не будет> //и самое главное ОписаниеКоманды.Вставить("ОбъектыПечати", МассивРеализаций); УправлениеПечатьюУТКлиент.ПечатьКомплектаДокументовСНастройкой(ОписаниеКоманды); И все работает. Правда, пока пробовал не в цикле, а когда в массиве только одна реализация. |
|||
17
slafor
26.09.20
✎
18:34
|
А вставить в меню Печать не получается, поскольку она тупо завязана на БСП...
|
|||
18
Ненавижу 1С
гуру
26.09.20
✎
18:37
|
(16) не хотят люди использовать нормальные инструменты...
|
|||
19
slafor
26.09.20
✎
20:02
|
(18) Знать бы еще, где описаны эти инструменты...
Работать-то работает, правда, если в массиве объектов печати ОписаниеКоманды.ОбъектыПечати больше одного объекта-ссылки (скажем, несколько ссылок на разные Реализации), то на печать попадает только одна, последняя... Можно, конечно, вызывать функцию из общего модуля в цикле, но тогда для каждого шага "вылезают" свои настройки. Оно, в принципе, так и задумывалось... Но зачем тогда в качестве параметра ОбъектыПечати выступает именно массив? И еще. В процедуре менеджера документа Задание на перевозку - ДобавитьКомандыПечати - при создании нового элемента меню указывается т.н. "обработчик" - КомандаПечати.Обработчик, хотелось бы узнать, там можно указать только процедуру в общем модуле или есть варианты? Я попробовал взять из модуля формы, из модуля объекта - ничего не получилось. Может быть, я просто что-то не так сделал? Хотелось бы поместить мою процедуру в меню Печать, а не бросать ее на форму отдельной кнопкой. |
|||
20
slafor
26.09.20
✎
20:58
|
(19) Отвечаю сам себе ) .
Если кому интересно, по второму вопросу ответ нашел. В командах печати есть параметр КомандаПечати.ДополнительныеПараметры, такой же есть и в вызываемой функции (ОписаниеКоманды.ДополнительныеПараметры). Это структура, так что можно запихнуть в нее что угодно и переслать в функцию общего модуля. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |