В практике разработчика 1С часто возникают задачи, когда типовые формы отчетов, такие как Книга покупок или Книга продаж в конфигурации «Бухгалтерия предприятия 3.0», не полностью удовлетворяют эстетическим или внутренним регламентным требованиям заказчика. Например, бухгалтерии может потребоваться изменить разделитель в строке представления счета-фактуры — заменить стандартное « от » на точку с запятой «;». На первый взгляд задача кажется простой, но из-за архитектурных особенностей БП 3.0 (динамическое формирование, фоновые проверки контрагентов) стандартные подходы могут не работать.
В данной статье мы подробно разберем, как программно вмешаться в процесс формирования печатной формы, рассмотрим различные методы реализации и проанализируем, почему изменения могут «пропадать» после вывода на экран.
Этот способ считается наиболее корректным с точки зрения архитектуры 1С. Вместо того чтобы править уже «нарисованные» пиксели в таблице, мы меняем сами данные в момент их подготовки. В «1С:Бухгалтерия 3.0» за формирование каждой строки Книги покупок отвечает специальная процедура в модуле менеджера отчета.
Проанализируем алгоритм действий. Нам необходимо создать расширение и перехватить процедуру ЗаполнитьСтрокуКнигиПокупок. Рассмотрим пример кода, который позволяет изменить представление номера и даты счета-фактуры:
&После("ЗаполнитьСтрокуКнигиПокупок")
Процедура ИЗМ_ЗаполнитьСтрокуКнигиПокупок(СоставСтроки, ДанныеСтроки, РеквизитыСФ, ПредставлениеСФ, СписокСФ)
// Изменяем данные непосредственно в структуре, которая пойдет на вывод
Если СоставСтроки.Свойство("НомерОтДата") Тогда
НовоеЗначение = СтрЗаменить(ПредставлениеСФ.НомерОтДата, " от ", "; ");
СоставСтроки.Вставить("НомерОтДата", НовоеЗначение);
КонецЕсли;
КонецПроцедуры
Преимущества этого метода:
Иногда требуется внести изменения сразу во множество отчетов (Книга покупок, Книга продаж, дополнительные листы). В этом случае удобнее использовать точку входа, через которую проходят все эти отчеты. В БП 3.0 такой точкой является общий модуль ПроверкаКонтрагентов.
Рассмотрим ситуацию: разработчик пытается внести изменения в процедуру ПоказатьВыбранныйЛист в форме отчета, но видит, что изменения на секунду появляются и тут же исчезают. Это происходит потому, что после формирования основного табличного документа срабатывает механизм проверки контрагентов, который перерисовывает таблицу. Чтобы «вклиниться» после всех проверок, нужно использовать расширение для процедуры ВывестиРазделОтчета.
Посмотрим на пример реализации:
&Вместо("ВывестиРазделОтчета")
Процедура ИЗМ_ВывестиРазделОтчета(Форма, ПолеТабличногоДокумента, НомерРаздела)
// Вызываем стандартную обработку
СтандартнаяОбработка = Истина;
РаботаСКонтрагентамиПереопределяемый.ВывестиРазделОтчета(Форма, ПолеТабличногоДокумента, НомерРаздела, СтандартнаяОбработка);
Если НЕ СтандартнаяОбработка Тогда
Возврат;
КонецЕсли;
// Получаем результат формирования отчета из временного хранилища
РазделыОтчета = РазделыОтчетаВФорме(Форма);
СтрокаРаздела = РазделыОтчета.Найти(НомерРаздела, "НомерРаздела");
Если СтрокаРаздела <> Неопределено Тогда
РезультатФормированияОтчета = СтрокаРаздела.ХранилищеОтчета.Получить();
// Проверяем, нужный ли это нам отчет по параметрам печати
ИмяПараметров = РезультатФормированияОтчета.ИмяПараметровПечати;
Если ИмяПараметров = "ПАРАМЕТРЫ_ПЕЧАТИ_КнигаПокупок" Или ИмяПараметров = "ПАРАМЕТРЫ_ПЕЧАТИ_КнигаПродаж" Тогда
// Запускаем цикл поиска и замены текста
ПараметрПоиска = " от ";
НайденнаяОбласть = РезультатФормированияОтчета.НайтиТекст(ПараметрПоиска);
Пока НайденнаяОбласть <> Неопределено Цикл
НайденнаяОбласть.Текст = СтрЗаменить(НайденнаяОбласть.Текст, ПараметрПоиска, ";");
// Ищем следующее вхождение
НайденнаяОбласть = РезультатФормированияОтчета.НайтиТекст(ПараметрПоиска, НайденнаяОбласть);
КонецЦикла;
КонецЕсли;
// Выводим измененный документ в поле формы
ПолеТабличногоДокумента.Вывести(РезультатФормированияОтчета);
КонецЕсли;
КонецПроцедуры
Разберем важный технический нюанс. Метод НайтиТекст() удобен, но на больших отчетах (сотни и тысячи страниц) он может существенно замедлять работу. При каждом вызове метода платформа сканирует весь ТабличныйДокумент с самого начала (если не указан параметр начала поиска).
Для оптимизации рекомендуется:
Проанализируем потенциальные опасности использования метода СтрЗаменить() ко всему тексту ячейки. Главный риск заключается в том, что подстрока " от " может встретиться не только в дате счета-фактуры, но и:
Именно поэтому Способ 1 (через модуль менеджера) является более предпочтительным, так как он работает с конкретным полем данных НомерОтДата, не затрагивая остальное содержимое строки.
Выясним, как данные изменения влияют на сдачу отчетности в ФНС. В конфигурациях 1С логика формирования печатной формы (визуального представления) и логика формирования XML-файла для выгрузки в налоговую — это два разных программных механизма.
Если вы изменили разделитель только в ТабличныйДокумент, то в печатной версии (на бумаге или в PDF) бухгалтер увидит ";", но в XML-файл, который уходит через «1С-Отчетность», данные попадут в стандартном формате, предусмотренном законодательством.
Внимание: Категорически не рекомендуется менять форматы представления данных в модулях выгрузки XML, так как это приведет к ошибкам форматного контроля на стороне налоговой службы, и отчет не будет принят.
Для успешного внедрения правок выполните следующие действия:
&После для процедуры ЗаполнитьСтрокуКнигиПокупок в модуле менеджера отчета.ПроверкаКонтрагентов.ВывестиРазделОтчета.Таким образом, мы рассмотрели механизмы взаимодействия с печатными формами в БП 3.0 и научились обходить ограничения, связанные с динамической отрисовкой отчетов.