При работе с конфигурацией «1С:Управление торговлей 10.3» (работающей на обычных формах) разработчики часто сталкиваются с задачей привязки внешней печатной формы (ВПФ) к справочнику ДоговорыКонтрагентов. Типичный сценарий: печатная форма успешно функционирует из документов продажи (например, из реализации товаров и услуг), но бизнес-процесс требует, чтобы этот же договор можно было распечатать напрямую из карточки договора контрагента.
Однако при попытке настроить принадлежность печатной формы в режиме «1С:Предприятие» пользователи обнаруживают, что справочник ДоговорыКонтрагентов просто отсутствует в списке доступных для выбора объектов. Выясним причину этого ограничения и подробно разберем, как решить эту задачу различными способами.
Проанализируем архитектуру подсистемы печати внешних обработок в «1С:Управление торговлей 10.3». Механизм регистрации ВПФ жестко завязан на список разрешенных метаданных, который прописан непосредственно в коде конфигурации.
Если мы заглянем в модуль формы настройки принадлежности справочника ВнешниеОбработки, то обнаружим процедуру инициализации списка доступных объектов. Разработчики фирмы «1С» жестко ограничили список доступных справочников, создав фиксированный массив:
ДоступныеСправочники = Новый Массив;
ДоступныеСправочники.Добавить(Метаданные.Справочники.Контрагенты);
ДоступныеСправочники.Добавить(Метаданные.Справочники.Номенклатура);
ДоступныеСправочники.Добавить(Метаданные.Справочники.ФизическиеЛица);
Как мы видим, справочник ДоговорыКонтрагентов изначально не был предусмотрен разработчиками типового решения для использования совместно с подсистемой внешних печатных форм. Это связано с тем, что в типовой конфигурации форма элемента этого справочника не содержит стандартного механизма интеграции с обработками печати и кнопки «Печать» как таковой.
Рассмотрим подробнее три основных метода решения этой проблемы в зависимости от того, насколько глубоко вы готовы вносить изменения в конфигурацию базы данных.
Если ваша база данных находится на поддержке с возможностью изменения, мы можем напрямую устранить это ограничение. Разберем этот процесс по шагам.
Шаг 1. Расширение списка доступных справочников в механизме регистрации ВПФ
ВнешниеОбработки.ДоступныеСправочники и добавьте туда наш целевой справочник:
ДоступныеСправочники.Добавить(Метаданные.Справочники.ДоговорыКонтрагентов);
После этого изменения справочник появится в списке выбора принадлежности печатных форм, и вы сможете сопоставить вашу обработку с договорами контрагентов в режиме «1С:Предприятие».
Шаг 2. Интеграция кнопки печати в форму договора
Просто связать обработку со справочником недостаточно. Нам необходимо, чтобы в самой карточке договора появилась кнопка для вызова печати. Выполним следующие действия:
ДоговорыКонтрагентов и откройте его основную форму элемента.Печать.
Процедура ДействияФормыПечать(Кнопка)
// Передаем ссылку на текущий договор и форму для открытия диалога выбора ВПФ
УниверсальныеМеханизмы.ОткрытьФормуВыбораПечатныхФормОбъекта(Ссылка, ЭтаФорма);
КонецПроцедуры
Теперь при нажатии на кнопку система автоматически определит все зарегистрированные для этого справочника внешние печатные формы и выведет их список пользователю.
Посмотрим на ситуацию, когда вам не хочется (или нельзя) изменять форму выбора принадлежности в справочнике ВнешниеОбработки, но вы готовы добавить вызов печати на форму самого договора.
Мы можем обойти ограничение экранной формы выбора с помощью механизма авторегистрации, который отрабатывает в момент загрузки файла .epf в базу данных.
ПолучитьПараметрыАвторегистрации().
Функция ПолучитьПараметрыАвторегистрации() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить(Метаданные.Справочники.ДоговорыКонтрагентов);
ПараметрыРегистрации.Вставить("ОбъектыНазначения", МассивНазначений);
Возврат ПараметрыРегистрации;
КонецФункции
Когда вы будете загружать эту обработку в справочник ВнешниеОбработки, система прочитает эту функцию и спросит: «Использовать параметры авторегистрации?». При нажатии «Да» табличная часть принадлежности заполнится строкой со справочником договоров автоматически, минуя стандартную форму выбора, где этого справочника нет.
Важное примечание: Даже при успешной авторегистрации шаг по добавлению кнопки печати на форму элемента договора (Шаг 2 из первого способа) остается обязательным, иначе пользователю будет негде нажать кнопку для запуска процесса.
Этот способ идеально подходит, если ваша конфигурация находится на строгой поддержке, изменения вносить запрещено, а внешние печатные формы обновлять и регистрировать нужно стандартными средствами.
Идея заключается в том, чтобы перенести точку входа для печати на уровень выше — в справочник Контрагенты, который изначально доступен для регистрации внешних печатных форм.
Проанализируем алгоритм реализации этого метода:
Контрагенты.Печать() модуля объекта) проверяем тип переданного объекта. Нам будет передана ссылка на контрагента..epf), где предлагаем пользователю выбрать нужный договор из списка активных договоров данного контрагента.Давайте посмотрим на пример реализации такого кода в модуле объекта внешней печатной формы:
Функция Печать(ОбъектСсылка, Кнопка) Экспорт
// ОбъектСсылка в данном случае — это Ссылка на Контрагента
Если ТипЗнч(ОбъектСсылка) = Тип("СправочникСсылка.Контрагенты") Тогда
// Запрос для получения списка договоров контрагента
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДоговорыКонтрагентов.Ссылка КАК Договор,
| ДоговорыКонтрагентов.Наименование КАК Наименование
|ИЗ
| Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов
|ГДЕ
| ДоговорыКонтрагентов.Владелец = &Владелец";
Запрос.УстановитьПараметр("Владелец", ОбъектСсылка);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Предупреждение("У данного контрагента нет зарегистрированных договоров!");
Возврат Неопределено;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
// Если договор один — печатаем его сразу без лишних вопросов
Если РезультатЗапроса.Выгрузить().Количество() = 1 Тогда
Выборка.Следующий();
Возврат СформироватьМакетДоговора(Выборка.Договор);
Иначе
// Если договоров несколько, открываем форму выбора из нашей же обработки
ФормаВыбора = ПолучитьФорму("ФормаВыбораДоговора");
ФормаВыбора.СписокДоговоров.Загрузить(РезультатЗапроса.Выгрузить());
ВыбранныйДоговор = ФормаВыбора.ОткрытьМодально();
Если ВыбранныйДоговор <> Неопределено Тогда
Возврат СформироватьМакетДоговора(ВыбранныйДоговор);
КонецЕсли;
EndЕсли;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Этот элегантный обходной путь позволяет пользователям получать печатные формы договоров прямо из карточки контрагента, не прибегая к какому-либо изменению метаданных типовой конфигурации «1С:Управление торговлей 10.3».