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