В практической работе бухгалтерии крупных предприятий часто возникает эстетическая и экономическая проблема: полное официальное наименование организации (например, «Общество с ограниченной ответственностью "Научно-производственное объединение Западный Альянс Машиностроения"») при печати счетов-фактур и УПД растягивает строку «Продавец» на три, а то и четыре строчки. В результате печатная форма выглядит перегруженной, а сам документ из-за этого может не поместиться на одном листе, увеличивая расход бумаги.
Главный бухгалтер логично требует выводить в поле «Продавец» короткое рабочее или сокращенное наименование (например, «ООО "НПО ЗАМ"»). Но как реализовать это в типовой и заблокированной от изменений конфигурации 1С:ERP Управление предприятием 2 (или 1С:Комплексная автоматизация)?
В этой статье мы подробно разберем, почему стандартные подходы не всегда удобны, и пошагово реализуем изящное решение через механизм расширения конфигурации, которое не помешает будущим обновлениям системы.
Первая мысль, которая возникает у многих специалистов — изменить макет печатной формы через стандартный интерфейс в меню «Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм». Однако в случае со счетом-фактурой и УПД этот фокус не сработает.
Дело в том, что в ячейку макета передается уже готовая, склеенная в коде текстовая строка (параметры ПредставлениеПоставщика или ПредставлениеПродавца). Программа динамически собирает её по следующему шаблону:
[ПолноеНаименованиеОрганизации] + [, ИНН] + [, КПП] + [, АдресРегистрации]
Поскольку вся строка формируется программно в модулях конфигурации, простым редактированием визуального макета невозможно извлечь из неё только полное наименование и заменить его на сокращенное. Требуется вмешательство в программный код.
Внедрение внешней печатной формы (ВПФ) — это классический и безопасный способ кастомизации документов. Но у него есть два существенных недостатка в контексте данной задачи:
Использование расширения конфигурации позволяет точечно перехватить логику заполнения данных, сохранив при этом типовую форму и стандартную кнопку печати.
---
Прежде чем писать код в расширении, давайте проанализируем архитектуру типового решения и выясним, где именно генерируются печатные формы счетов-фактур:
Обработка.ПечатьОбщихФорм.ЗаполнитьТабличныйДокументСчетФактура (или её вариации под конкретные постановления правительства РФ).ФормированиеПечатныхФорм (или ФормированиеПечатныхФормСервер).Основная функция, которая собирает реквизиты юридического лица в структуру:
ФормированиеПечатныхФорм.СведенияОЮрФизЛице(Организация, Дата)
Далее эта структура передается в метод формирования итогового текста:
ФормированиеПечатныхФорм.ОписаниеОрганизации(СведенияОПоставщике, "ПолноеНаименование, ...")
Разберем два эффективных способа решения нашей задачи с помощью расширения.
---
Если бухгалтерия согласна с тем, чтобы сокращенное наименование выводилось во всех печатных формах компании (не только в счете-фактуре, но и в Торг-12, Актах, Расходных накладных и т. д.), самым простым и надежным решением будет перехват функции получения сведений об организации.
Выполним следующие шаги по реализации:
ФормированиеПечатныхФорм (в зависимости от релиза ERP это может быть ФормированиеПечатныхФормСервер или аналогичный модуль, где расположена функция получения сведений).СведенияОЮрФизЛице аннотацию &После (&After). Это позволит нам перехватить возвращаемую структуру данных и скорректировать её «на лету» без нарушения типовой логики.Разберем пример программного кода для общего модуля расширения:
&После("СведенияОЮрФизЛице")
Функция Расш1_СведенияОЮрФизЛице(ЮрФизЛицо, ДатаПериода, ДляФизЛицаТолькоИнициалы = Истина, БанковскийСчет = Неопределено)
// Результат работы стандартной функции — это структура "Результат" со сведениями о контрагенте или организации
// Проверим, что переданный объект является нашей организацией
Если ЗначениеЗаполнено(ЮрФизЛицо)
И ТипЗнч(ЮрФизЛицо) = Тип("СправочникСсылка.Организации") Тогда
// Подменяем полное наименование на сокращенное
Если ТипЗнч(Результат) = Тип("Структура") Тогда
Если Результат.Свойство("ПолноеНаименование") И Результат.Свойство("СокращенноеНаименование") Тогда
// Если сокращенное наименование заполнено, подставляем его вместо полного
Если ЗначениеЗаполнено(Результат.СокращенноеНаименование) Тогда
Результат.ПолноеНаименование = Результат.СокращенноеНаименование;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат Результат;
КонецФункции
Преимущества этого способа:
СведенияОЮрФизЛице не меняется годами.---
Что делать, если сокращенное наименование требуется выводить строго в счете-фактуре и УПД, а в остальных документах (например, в официальных договорах или регламентированных актах) обязательно должно оставаться полное наименование?
В этом случае нам нужно вмешаться в процесс формирования конкретного печатного листа. Мы перехватим процедуру вывода данных, когда табличный документ уже практически сформирован, найдем в нем ячейку с полным наименованием нашей компании и заменим текст программно.
Выполним пошагово:
Обработка.ПечатьОбщихФорм.ЗаполнитьТабличныйДокументСчетФактура (или актуальную для вашей версии ERP процедуру печати, например, по Постановлению № 534).&После.Рассмотрим пример кода, реализующий автозамену текста в готовом табличном документе:
&После("ЗаполнитьТабличныйДокументСчетФактура")
Процедура Расш1_ЗаполнитьТабличныйДокументСчетФактура(ТабличныйДокумент, ДанныеДляПечати, ОбъектыПечати, ОпцииПечатиСчетаФактуры, КомплектыПечати = Неопределено)
// Задаем переменные с наименованиями нашей организации
// В реальной практике их можно получать динамически из справочника Организации
ПолноеНазваниеОрганизации = "Общество с ограниченной ответственностью ""Научно-производственное объединение Западный Альянс Машиностроения""";
СокращенноеНазваниеОрганизации = "ООО ""НПО ЗАМ""";
// Обходим ячейки сформированного табличного документа
Для Строка = 1 По ТабличныйДокумент.ВысотаТаблицы Цикл
Для Колонка = 1 По ТабличныйДокумент.ШиринаТаблицы Цикл
ОбластьЯчейки = ТабличныйДокумент.Область(Строка, Колонка);
// Если в ячейке содержится полное наименование, производим точечную замену подстроки
Если Найти(ОбластьЯчейки.Текст, ПолноеНазваниеОрганизации) > 0 Тогда
ОбластьЯчейки.Текст = СтрЗаменить(ОбластьЯчейки.Текст, ПолноеНазваниеОрганизации, СокращенноеНазваниеОрганизации);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Если на вашем предприятии счета-фактуры выписываются в формате УПД (Универсальный передаточный документ), аналогичным образом необходимо перехватить процедуру заполнения реквизитов шапки УПД, например, ЗаполнитьРеквизитыШапкиУПД в той же обработке.
Преимущества этого способа:
---
При реализации доработок печатных форм через расширения всегда придерживайтесь следующих правил разработки:
&Вместо (&Instead): Полная замена типовых процедур печати приведет к тому, что при первом же обновлении конфигурации новые требования законодательства по налогам не вступят в силу или программа начнет выдавать критические ошибки при печати документов. Используйте только &После или &Перед.Справочник.Организации по ссылке из документа.Мы проанализировали проблему длинных наименований в печатных формах счетов-фактур и разобрали два эффективных и безопасных способа её решения с помощью расширения конфигурации. Выбор конкретного метода зависит от требований вашего отдела бухгалтерии.