Как подключить внешнюю печатную форму к справочнику «Договоры контрагентов» в УТ 10.3?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

При работе с конфигурацией «1С:Управление торговлей 10.3» (работающей на обычных формах) разработчики часто сталкиваются с задачей привязки внешней печатной формы (ВПФ) к справочнику ДоговорыКонтрагентов. Типичный сценарий: печатная форма успешно функционирует из документов продажи (например, из реализации товаров и услуг), но бизнес-процесс требует, чтобы этот же договор можно было распечатать напрямую из карточки договора контрагента.

Однако при попытке настроить принадлежность печатной формы в режиме «1С:Предприятие» пользователи обнаруживают, что справочник ДоговорыКонтрагентов просто отсутствует в списке доступных для выбора объектов. Выясним причину этого ограничения и подробно разберем, как решить эту задачу различными способами.

Почему справочника «Договоры контрагентов» нет в стандартном списке принадлежности?

Проанализируем архитектуру подсистемы печати внешних обработок в «1С:Управление торговлей 10.3». Механизм регистрации ВПФ жестко завязан на список разрешенных метаданных, который прописан непосредственно в коде конфигурации.

Если мы заглянем в модуль формы настройки принадлежности справочника ВнешниеОбработки, то обнаружим процедуру инициализации списка доступных объектов. Разработчики фирмы «1С» жестко ограничили список доступных справочников, создав фиксированный массив:


ДоступныеСправочники = Новый Массив;
ДоступныеСправочники.Добавить(Метаданные.Справочники.Контрагенты);
ДоступныеСправочники.Добавить(Метаданные.Справочники.Номенклатура);
ДоступныеСправочники.Добавить(Метаданные.Справочники.ФизическиеЛица);

Как мы видим, справочник ДоговорыКонтрагентов изначально не был предусмотрен разработчиками типового решения для использования совместно с подсистемой внешних печатных форм. Это связано с тем, что в типовой конфигурации форма элемента этого справочника не содержит стандартного механизма интеграции с обработками печати и кнопки «Печать» как таковой.

Рассмотрим подробнее три основных метода решения этой проблемы в зависимости от того, насколько глубоко вы готовы вносить изменения в конфигурацию базы данных.

Способ 1. Доработка конфигурации через Конфигуратор (Рекомендуемый при возможности изменения базы)

Если ваша база данных находится на поддержке с возможностью изменения, мы можем напрямую устранить это ограничение. Разберем этот процесс по шагам.

Шаг 1. Расширение списка доступных справочников в механизме регистрации ВПФ

  1. Откройте базу данных в режиме Конфигуратор.
  2. Найдите справочник ВнешниеОбработки.
  3. Перейдите к формам справочника и откройте форму настройки принадлежности (обычно это вспомогательная форма выбора объектов метаданных).
  4. Найдите строку инициализации массива ДоступныеСправочники и добавьте туда наш целевой справочник:

ДоступныеСправочники.Добавить(Метаданные.Справочники.ДоговорыКонтрагентов);

После этого изменения справочник появится в списке выбора принадлежности печатных форм, и вы сможете сопоставить вашу обработку с договорами контрагентов в режиме «1С:Предприятие».

Шаг 2. Интеграция кнопки печати в форму договора

Просто связать обработку со справочником недостаточно. Нам необходимо, чтобы в самой карточке договора появилась кнопка для вызова печати. Выполним следующие действия:

  1. В дереве метаданных найдите справочник ДоговорыКонтрагентов и откройте его основную форму элемента.
  2. Разместите на форме новую кнопку или добавьте пункт в командную панель под названием Печать.
  3. В модуле формы напишите обработчик нажатия на эту кнопку, который будет обращаться к общему модулю подсистемы печати:

Процедура ДействияФормыПечать(Кнопка)
    // Передаем ссылку на текущий договор и форму для открытия диалога выбора ВПФ
    УниверсальныеМеханизмы.ОткрытьФормуВыбораПечатныхФормОбъекта(Ссылка, ЭтаФорма);
КонецПроцедуры

Теперь при нажатии на кнопку система автоматически определит все зарегистрированные для этого справочника внешние печатные формы и выведет их список пользователю.

Способ 2. Использование механизма авторегистрации ВПФ (Без изменения диалога выбора принадлежности)

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

Мы можем обойти ограничение экранной формы выбора с помощью механизма авторегистрации, который отрабатывает в момент загрузки файла .epf в базу данных.

  1. Откройте вашу внешнюю печатную форму в Конфигураторе как отдельный файл.
  2. В модуле объекта обработки найдите или создайте экспортируемую функцию ПолучитьПараметрыАвторегистрации().
  3. Пропишите в ней жесткую привязку к справочнику договоров:

Функция ПолучитьПараметрыАвторегистрации() Экспорт
    ПараметрыРегистрации = Новый Структура;
    МассивНазначений = Новый Массив;
    МассивНазначений.Добавить(Метаданные.Справочники.ДоговорыКонтрагентов);
    ПараметрыРегистрации.Вставить("ОбъектыНазначения", МассивНазначений);
    Возврат ПараметрыРегистрации;
КонецФункции

Когда вы будете загружать эту обработку в справочник ВнешниеОбработки, система прочитает эту функцию и спросит: «Использовать параметры авторегистрации?». При нажатии «Да» табличная часть принадлежности заполнится строкой со справочником договоров автоматически, минуя стандартную форму выбора, где этого справочника нет.

Важное примечание: Даже при успешной авторегистрации шаг по добавлению кнопки печати на форму элемента договора (Шаг 2 из первого способа) остается обязательным, иначе пользователю будет негде нажать кнопку для запуска процесса.

Способ 3. Печать из карточки Контрагента с выбором договора (Без изменения конфигурации вообще)

Этот способ идеально подходит, если ваша конфигурация находится на строгой поддержке, изменения вносить запрещено, а внешние печатные формы обновлять и регистрировать нужно стандартными средствами.

Идея заключается в том, чтобы перенести точку входа для печати на уровень выше — в справочник Контрагенты, который изначально доступен для регистрации внешних печатных форм.

Проанализируем алгоритм реализации этого метода:

  1. Регистрируем внешнюю печатную форму для справочника Контрагенты.
  2. Внутри самой внешней печатной формы (в процедуре Печать() модуля объекта) проверяем тип переданного объекта. Нам будет передана ссылка на контрагента.
  3. Если у этого контрагента несколько договоров, мы программно открываем небольшое диалоговое окно (форму, созданную прямо внутри внешней обработки .epf), где предлагаем пользователю выбрать нужный договор из списка активных договоров данного контрагента.
  4. После выбора договора обработка получает все необходимые реквизиты договора (номер, дату, условия) и формирует печатный лист.

Давайте посмотрим на пример реализации такого кода в модуле объекта внешней печатной формы:


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

Этот элегантный обходной путь позволяет пользователям получать печатные формы договоров прямо из карточки контрагента, не прибегая к какому-либо изменению метаданных типовой конфигурации «1С:Управление торговлей 10.3».

← На главную