Избегание дублирования кода в клиентском обработчике печати документа

1. native-api 13.09.22 17:28 Сейчас в теме
Необходимо при печати документа выполнять ряд функций, которые возможно только на клиенте (выгрузить данные в файл, обработать его внешней программой и результат показать в форме печати). Поэтому сделал клиентский обработчик согласно Библиотека стандартных подсистем 3.1.7. -- Глава 3 -- Разработка команд печати. Обработчик разместил в модуле формы ФормаДокумента:

	КомандаПечати.Обработчик = "Форма.Расш1_МояКомандаПечати";


Однако, вижу, что эта команда печати добавилась также в форму списка документов! И при ее выборе 1С ищет обработчик в модуле формы списка! Т.е. мне, получается, нужно писать 2 аналогичных обработчика!

Можно ли как-то избежать дублирования кода в данном случае? Я вижу вариант только создавать общий модуль: насколько мне известно, код из модуля другой формы вызвать нельзя, а код в других модулях, доступных нескольким формам (документа и менеджера), может выполняться только на сервере. Однако, выглядит неправильным создавать общий модуль, предназначенный только для одного типа документов.
Найденные решения
10. soft_wind 14.12.22 17:13 Сейчас в теме
(9)
ПолучитьФорму (GetForm)
Синтаксис:
ПолучитьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>)
Параметры:
<ИмяФормы> (обязательный)
Тип: Строка.
Имя формы. Образуется как полный путь к объекту метаданных Форма (например, "Справочник.Контрагенты.Форма.ФормаОбъекта", "ОбщаяФорма.ФормаСохраненияФайла") или как полный путь к прикладному объекту, дополненный именем формы по умолчанию (например, "Справочник.Товары.ФормаВыбора").


Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).
Вызов метода выполняет обращение к серверу.

можете получить ее с ключем (т.е. с нужным документом) !
native-api; +1 Ответить
11. native-api 11.06.24 13:25 Сейчас в теме
В качестве общего решения написал функцию для вызова подключаемой команды для выделенных строк списка:

// Выполнить подключаемую команду печати для всех выделенных строк формы списка
//
// Параметры:
//  ФормаСписка			- ФормаКлиентскогоПриложения: {Список: ДинамическийСписок[{Ссылка:(ДокументСсылка|СправочникСсылка)}]} -
//							форма списка, из которой взять выделенные строки
//  ОписаниеКоманды		- Структура: ПодключаемыеКоманды.ОписаниеКоманды - описание подключаемой команды
//
&НаКлиенте
Процедура Расш1_ВыполнитьПодключаемуюКомандуДляВыделенныхСтрок(Знач ФормаСписка, Знач ОписаниеКоманды) Экспорт
	
	Перем ИДСтроки, ИмяФормыОбъекта, КомандаОбъекта, ТекущиеДанные, ФормаОбъекта;
	
	Для Каждого ИДСтроки Из ФормаСписка.Элементы.Список.ВыделенныеСтроки Цикл
		ТекущиеДанные = ФормаСписка.Элементы.Список.ДанныеСтроки(ИДСтроки);
		Если ТекущиеДанные <> Неопределено Тогда
			Если ИмяФормыОбъекта = Неопределено Тогда
				ИмяФормыОбъекта = Расш1_ОбщегоНазначенияВызовСервера.ИмяТаблицыПоСсылке(ТекущиеДанные.Ссылка)
					+ ".ФормаОбъекта"; //вызывает БСП ОбщегоНазначения.ИмяТаблицыПоСсылке
			КонецЕсли;

			ФормаОбъекта = ПолучитьФорму(ИмяФормыОбъекта,Новый Структура("Ключ",ТекущиеДанные.Ссылка));
			КомандаОбъекта = ФормаОбъекта.Команды.Найти(ОписаниеКоманды.ИмяВФорме);
			ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ФормаОбъекта,КомандаОбъекта,ФормаОбъекта.Объект);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Использование: в модуле формы списка

&НаКлиенте
Функция ПечатьЧегоТо(ОписаниеКоманды) Экспорт
	Расш1_ВыполнитьПодключаемуюКомандуДляВыделенныхСтрок(ЭтотОбъект, ОписаниеКоманды);
КонецФункции

// в модуле формы объекта:

&НаКлиенте
Функция ПечатьЧегоТо(ОписаниеКоманды) Экспорт
	ОписаниеКоманды);
    // реализация
КонецФункции
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. -AI- 14.09.22 11:03 Сейчас в теме
есть же команды привязанные не к форме, а к справочнику или документы
мож туда всё загнать?
Прикрепленные файлы:
3. native-api 14.09.22 11:29 Сейчас в теме
(2) Так команды печати -- это не команды командного интерфейса, а подключаемые команды. БСП динамически создает элементы в панели команд формы при ее открытии, вызывая заданные коллбэки (смотрите по ссылке).

Я разве могу создать такой фейковый "модуль команды", без реальной команды командного интерфейса? Он небось везде появится в интерфейсе и будет всех смущать.
5. -AI- 14.09.22 12:08 Сейчас в теме
(3) я на самом деле сильно не вникал, что вам надо,

я просто показал что есть "команды", часто они используются для запуска обработчика печати,
код в них выполняется на клиенте, в них ДО запуска обработчика печати можно затолкать много чего....


в т.ч. запуск интерфейсных окон и т.д.
4. native-api 14.09.22 11:46 Сейчас в теме
(2) Согласно 1C:Enterprise Development Tools Руководство разработчика -- Модуль команды, процедуры, определенные в модуле команды, нельзя вызывать из других мест, даже со словом "Экспорт".

Так что не подходит, независимо от предыдущего сообщения :(
6. -AI- 14.09.22 13:28 Сейчас в теме
(4) идея была не вызывать этот код, а в этом коде делать что надо, а результат отправлять обработчику печати в параметрах
7. native-api 14.12.22 16:18 Сейчас в теме
Лучших идей предложено не было. Сделал общий модуль.
8. soft_wind 14.12.22 16:35 Сейчас в теме
"в форму списка документов! "
в форме списка можно получить форму элемента! и не отрывая ее, пользоваться функционалом!
9. native-api 14.12.22 16:55 Сейчас в теме
(8) Можете привести пример? Я нашел метод `ПолучитьФорму`, но он доступен только в толстом клиенте.
10. soft_wind 14.12.22 17:13 Сейчас в теме
(9)
ПолучитьФорму (GetForm)
Синтаксис:
ПолучитьФорму(<ИмяФормы>, <Параметры>, <Владелец>, <Уникальность>, <Окно>, <НавигационнаяСсылка>)
Параметры:
<ИмяФормы> (обязательный)
Тип: Строка.
Имя формы. Образуется как полный путь к объекту метаданных Форма (например, "Справочник.Контрагенты.Форма.ФормаОбъекта", "ОбщаяФорма.ФормаСохраненияФайла") или как полный путь к прикладному объекту, дополненный именем формы по умолчанию (например, "Справочник.Товары.ФормаВыбора").


Доступность:
Тонкий клиент, веб-клиент, мобильный клиент, толстый клиент, мобильное приложение (клиент).
Вызов метода выполняет обращение к серверу.

можете получить ее с ключем (т.е. с нужным документом) !
native-api; +1 Ответить
11. native-api 11.06.24 13:25 Сейчас в теме
В качестве общего решения написал функцию для вызова подключаемой команды для выделенных строк списка:

// Выполнить подключаемую команду печати для всех выделенных строк формы списка
//
// Параметры:
//  ФормаСписка			- ФормаКлиентскогоПриложения: {Список: ДинамическийСписок[{Ссылка:(ДокументСсылка|СправочникСсылка)}]} -
//							форма списка, из которой взять выделенные строки
//  ОписаниеКоманды		- Структура: ПодключаемыеКоманды.ОписаниеКоманды - описание подключаемой команды
//
&НаКлиенте
Процедура Расш1_ВыполнитьПодключаемуюКомандуДляВыделенныхСтрок(Знач ФормаСписка, Знач ОписаниеКоманды) Экспорт
	
	Перем ИДСтроки, ИмяФормыОбъекта, КомандаОбъекта, ТекущиеДанные, ФормаОбъекта;
	
	Для Каждого ИДСтроки Из ФормаСписка.Элементы.Список.ВыделенныеСтроки Цикл
		ТекущиеДанные = ФормаСписка.Элементы.Список.ДанныеСтроки(ИДСтроки);
		Если ТекущиеДанные <> Неопределено Тогда
			Если ИмяФормыОбъекта = Неопределено Тогда
				ИмяФормыОбъекта = Расш1_ОбщегоНазначенияВызовСервера.ИмяТаблицыПоСсылке(ТекущиеДанные.Ссылка)
					+ ".ФормаОбъекта"; //вызывает БСП ОбщегоНазначения.ИмяТаблицыПоСсылке
			КонецЕсли;

			ФормаОбъекта = ПолучитьФорму(ИмяФормыОбъекта,Новый Структура("Ключ",ТекущиеДанные.Ссылка));
			КомандаОбъекта = ФормаОбъекта.Команды.Найти(ОписаниеКоманды.ИмяВФорме);
			ПодключаемыеКомандыКлиент.ВыполнитьКоманду(ФормаОбъекта,КомандаОбъекта,ФормаОбъекта.Объект);
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

// Использование: в модуле формы списка

&НаКлиенте
Функция ПечатьЧегоТо(ОписаниеКоманды) Экспорт
	Расш1_ВыполнитьПодключаемуюКомандуДляВыделенныхСтрок(ЭтотОбъект, ОписаниеКоманды);
КонецФункции

// в модуле формы объекта:

&НаКлиенте
Функция ПечатьЧегоТо(ОписаниеКоманды) Экспорт
	ОписаниеКоманды);
    // реализация
КонецФункции
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот