Как передать параметры из формы объекта во внешнюю печатную форму в 1С:Бухгалтерии 2.0?

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

При разработке дополнительных печатных форм разработчики часто сталкиваются с дилеммой: встроить макет и код в дерево конфигурации или использовать механизм внешних печатных форм (ВПФ). Изменение типовой конфигурации влечет за собой усложнение последующих обновлений, особенно при наличии распределенной информационной базы или множества независимых баз. В то же время типовой механизм ВПФ в конфигурациях на обычных формах (таких как «Бухгалтерия предприятия 2.0» на платформе 1С:Предприятие 8.2 и 8.3) передает в обработку только ссылку на текущий объект через реквизит СсылкаНаОбъект.

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

Где хранить доработку: конфигурация или внешняя обработка

Рассмотрим плюсы и минусы обоих подходов к размещению печатной формы в условиях многопользовательской или распределенной среды:

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

Если принято решение использовать ВПФ, разберем технические способы обхода ограничения по передаче реквизитов формы.

Способ 1. Получение открытой формы через СсылкаНаОбъект

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

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


Функция Печать() Экспорт

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

    // Формирование макета с полученными параметрами
    ЗаполнитьТабличныйДокумент(ТабДокумент, СсылкаНаОбъект, ДатаСведений, Организация);

    Возврат ТабДокумент;

КонецФункции

Важно: этот способ надежно работает, когда пользователь нажимает кнопку печати непосредственно в открытой карточке основного средства. Если же печать запускается из формы списка справочника, вызов ФормаОбъекта.Открыта() вернет значение Ложь, так как форма элемента еще не создавалась. В этом случае коду необходимо предусмотреть значения по умолчанию либо диалог запроса параметров.

Способ 2. Интерактивный ввод параметров при печати

Если данные на форме не были заполнены или печать выполняется из общего списка справочника, оптимально запросить недостающие данные напрямую у пользователя перед формированием печатного документа.

Посмотрим на пример использования платформенного диалога ВвестиДату() в коде внешней обработки:


Функция Печать() Экспорт

    ТабДокумент = Новый ТабличныйДокумент;
    ВыбраннаяДата = ТекущаяДата();
    
    ФормаОбъекта = СсылкаНаОбъект.ПолучитьФорму("ФормаЭлемента");
    
    Если ФормаОбъекта.Открыта() Тогда
        ВыбраннаяДата = ФормаОбъекта.ЭлементыФормы.ДатаСведений.Значение;
    Иначе
        // Запрашиваем дату среза интерактивно
        Подсказка = "Укажите дату среза сведений для формирования приложения:";
        Если Не ВвестиДату(ВыбраннаяДата, Подсказка, ЧастиДаты.Дата) Тогда
            Возврат Неопределено; // Пользователь отказался от ввода
        КонецЕсли;
    КонецЕсли;
    
    СформироватьОтчет(ТабДокумент, СсылкаНаОбъект, ВыбраннаяДата);
    
    Возврат ТабДокумент;

КонецФункции

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

Способ 3. Получение данных запросом к регистрам сведений

В типовой конфигурации «Бухгалтерия предприятия 2.0» многие экранные реквизиты являются вычисляемыми. Проанализируем структуру хранения данных: сведения об организации и первоначальном состоянии основного средства фиксируются документами принятия к учету и ввода начальных остатков, а текущие состояния отражаются в периодических регистрах сведений (например, СостоянияОСОрганизаций или ПервоначальныеСведенияОСБухгалтерскийУчет).

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

Способы централизованного распространения ВПФ без изменения конфигурации

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

  1. Включение справочника «Внешние обработки» в план обмена: если базы объединены через РИБ или стандартный обмен данными, включение этого справочника в состав плана обмена позволяет зарегистрировать обработку один раз в центральном узле. При очередном сеансе синхронизации бинарные данные файла .epf автоматически распространяются по всем узлам.
  2. Использование внешней обработки-загрузчика: в базу внедряется обработка-оболочка, которая в процедуре печати обращается к общему сетевому ресурсу, считывает актуальный файл макета через ВнешниеОбработки.Создать() и передает управление в актуальную версию. При таком подходе для обновления печатной формы достаточно перезаписать один файл на сетевом диске.
  3. Регламентное фоновое обновление: регламентное задание по расписанию проверяет дату модификации внешнего файла в сетевой папке или на FTP-сервере и при наличии обновлений перезаписывает реквизит ХранилищеВнешнейОбработки новыми двоичными данными прямо в базе данных.
← На главную