Как изменить имя файла при сохранении печатных форм в 1С:Бухгалтерия 3.0, чтобы добавить название контрагента?

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

При активной работе в 1С:Бухгалтерия предприятия 3.0 (БП3) пользователи часто сталкиваются с необходимостью массового сохранения документов в электронные форматы (PDF, Excel). По умолчанию система формирует стандартные имена файлов, например: «Накладная № 10 от 13.01.19». Когда документов много, их идентификация по одним лишь номерам становится неудобной. Возникает задача: добавить в название файла наименование контрагента, чтобы получилось «Накладная № 10 ООО Комус от 13.01.19».

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

Разберем логику формирования имени файла в системе

Прежде чем приступать к написанию кода, проанализируем, как 1С понимает, под каким именем нужно сохранить документ. В основе механизма лежит объект ТабличныйДокумент. У этого объекта существует специальное свойство — ИспользуемоеИмяФайла.

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

Решение 1: Использование внешних печатных форм (ВПФ)

Это самый «чистый» способ, который подходит даже для базовых версий 1С и облачных сервисов (например, 1С:Фреш). Суть заключается в том, что мы создаем отдельную обработку, которая заменяет типовую печатную форму.

Рассмотрим алгоритм реализации во внешней печатной форме:

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

Посмотрим на пример кода внутри процедуры Печать:


// Получаем данные контрагента
НаименованиеКонтрагента = СсылкаНаОбъект.Контрагент.Наименование;
НомерДокумента = ПрефиксИНомерОбъекта(СсылкаНаОбъект.Номер);
ДатаДокумента = Формат(СсылкаНаОбъект.Дата, "ДФ='дд ММ гггг'");

// Формируем заголовок
ИмяФайла = СтрШаблон("Накладная № %1 %2 от %3", НомерДокумента, НаименованиеКонтрагента, ДатаДокумента);

// Устанавливаем свойство табличного документа
ТабличныйДокумент.ИспользуемоеИмяФайла = ИмяФайла;

Преимущество: Не требуется вносить изменения в саму конфигурацию, легко обновлять программу.

Решение 2: Использование расширения конфигурации

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

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

Проанализируем ситуацию: когда пользователь нажимает кнопку «Сохранить», система вызывает процедуры формирования параметров сохранения. Мы можем использовать механизм &После для процедуры, которая заполняет структуру печатных форм.

Пример реализации в расширении для перехвата формирования имен:


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

Важный момент: при массовой печати (когда выбрано 20 накладных) 1С формирует коллекцию. Мы должны итерационно пройтись по каждому объекту в этой коллекции, получить ссылку на документ и вытащить данные контрагента.

Решение 3: Перехват в общем модуле УправлениеПечатьюБП

В конфигурации 1С:Бухгалтерия 3.0 есть специфические модули, отвечающие за формирование печатных данных. Проанализируем работу модуля УправлениеПечатьюБП. В нем часто подготавливаются данные для печати через менеджеры объектов.

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

Особенности работы в базовых версиях и 1С:Фреш

Нужно учитывать ограничения версий программного продукта:

  1. Базовые версии: Расширения в них не поддерживаются (начиная с определенных релизов платформы работа с расширениями в базовых запрещена программно). В этом случае единственным рабочим вариантом остается создание внешних печатных форм через меню «Дополнительные отчеты и обработки».
  2. 1С:Фреш: Расширения проходят длительную проверку безопасности. Если результат нужен «здесь и сейчас», быстрее будет внедрить внешнюю печатную форму, так как требования к их коду более стандартизированы.

Рекомендации по реализации «Шаблонизатора»

Если запросы пользователей часто меняются (сегодня просят добавить контрагента, завтра — ИНН, послезавтра — город доставки), рекомендуем реализовать небольшую настройку. Создайте в расширении константу или регистр сведений, где будет храниться строка-шаблон, например: [ТипДокумента] № [Номер] [Контрагент] от [Дата].

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

Рассмотрим пример такой замены:


Шаблон = "[ТипДокумента] № [Номер] [Контрагент] от [Дата]";
Результат = СтрЗаменить(Шаблон, "[ТипДокумента]", "Накладная");
Результат = СтрЗаменить(Результат, "[Номер]", Объект.Номер);
Результат = СтрЗаменить(Результат, "[Контрагент]", Объект.Контрагент.Наименование);
Результат = СтрЗаменить(Результат, "[Дата]", Формат(Объект.Дата, "ДЛФ=D"));

Резюмируем: Для разовой и быстрой задачи лучше всего подходит создание внешней печатной формы. Для системного изменения логики именования во всей базе оптимально использовать расширение конфигурации с перехватом процедур модуля УправлениеПечатью. Это сохранит поддержку конфигурации и обеспечит удобство работы пользователей при массовой выгрузке документов.

← На главную