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