Имя: Пароль:
1C
1С v8
Вызвать процедуру менеджера документа из другого документа (Печать)
,
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) Отвечаю сам себе ) .

Если кому интересно, по второму вопросу ответ нашел. В командах печати есть параметр КомандаПечати.ДополнительныеПараметры, такой же есть и в вызываемой функции (ОписаниеКоманды.ДополнительныеПараметры). Это структура, так что можно запихнуть в нее что угодно и переслать в функцию общего модуля.