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