Как добавить ИНН контрагента в печатную форму Приходного кассового ордера (КО-1)

Программист 1C:Бухгалтерия Бухгалтерский учет Финансы и профессиональные услуги
← На главную

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

Поиск и идентификация макета

Прежде всего, нам необходимо выяснить, где именно в конфигурации «спрятан» макет кассового ордера. Проанализируем структуру программы: в отличие от многих других документов, где макет находится непосредственно внутри объекта, «Приходный кассовый ордер» использует общий макет. Это связано с тем, что форма КО-1 является унифицированной и может использоваться разными документами.

Выясним точное имя макета. Как показывает практика и анализ кода модуля менеджера, макет называется ПФ_MXL_KO1. Он находится в ветке Общие -> Общие макеты. Чтобы убедиться в этом, мы можем заглянуть в модуль менеджера документа ПриходныйКассовыйОрдер (или ПоступлениеНаличных в новых версиях БП 3.0), где процедура печати обращается к нему следующим образом:

Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_KO1");

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

Способ 1. Редактирование через пользовательский режим (без программирования)

Если нам нужно только изменить визуальное отображение (например, добавить слово «ИНН» в текст), мы можем воспользоваться встроенным редактором макетов. Разберем этот путь:

  1. Перейдем в раздел Администрирование — Печатные формы, отчеты и обработки — Макеты печатных форм.
  2. Найдем в списке макет с именем «Приходный кассовый ордер (КО-1)» (или ПФ_MXL_KO1).
  3. Нажмем кнопку «Изменить». Система создаст пользовательскую копию макета.

Важное ограничение: если мы просто добавим параметр [ИНН] в ячейку макета, он не заполнится данными автоматически. Программа «не знает», что в этот параметр нужно передать ИНН контрагента. Поэтому данный способ подходит только для изменения статического текста. Для вывода динамических данных нам придется использовать программные методы.

Способ 2. Создание внешней печатной формы (ВПФ)

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

Проанализируем пример кода для регистрации внешней печатной формы:


Функция СведенияОВнешнейОбработке() Экспорт
    ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке("2.2.2.1");
    ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
    ПараметрыРегистрации.Назначение.Добавить("Документ.ПоступлениеНаличных");
    ПараметрыРегистрации.Наименование = "Приходный кассовый ордер (с ИНН)";
    
    Команда = ПараметрыРегистрации.Команды.Добавить();
    Команда.Представление = "Приходный кассовый ордер (с ИНН)";
    Команда.Идентификатор = "ПКО_ИНН";
    Команда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода();
    Команда.ПоказыватьОповещение = Истина;
    
    Возврат ПараметрыРегистрации;
КонецФункции

После регистрации нам нужно реализовать процедуру Печать, которая будет получать данные из документа. Основная задача здесь — получить ИНН плательщика. Посмотрим, как это сделать, учитывая, что плательщиком может быть как контрагент (юридическое лицо), так и физическое лицо.


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ПКО_ИНН");
    Если ПечатнаяФорма <> Неопределено Тогда
        ПечатнаяФорма.ТабличныйДокумент = СформироватьТабличныйДокумент(МассивОбъектов, ОбъектыПечати);
        ПечатнаяФорма.ПолныйПутьКМакету = "ВнешняяПечатнаяФорма.ПКО_ИНН";
    КонецЕсли;
КонецПроцедуры

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

Способ 3. Использование расширения конфигурации

Если вы работаете в современной версии 1С:Предприятие 8.3, использование расширений является наиболее гибким методом. Разберем алгоритм работы с расширением:

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

Проанализируем ситуацию: в типовых конфигурациях на БСП формирование данных часто вынесено в отдельные функции типа ДанныеДляПечатиПКО. Нам нужно перехватить этот метод и добавить в структуру данных поле ИНН.

Пример программного кода в расширении для добавления ИНН:


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

После того как данные добавлены в структуру, в самом макете (который мы также заимствовали в расширение) достаточно указать параметр [ИНН] в нужной ячейке, и система сама подставит значение, так как имя поля в данных теперь совпадает с именем параметра в макете.

Особенности работы с физическими лицами

Важно помнить, что в ПКО плательщиком может выступать не только организация из справочника Контрагенты, но и сотрудник (справочник ФизическиеЛица). Выясним, как универсально получить ИНН в этом случае. У обоих справочников есть реквизит ИНН, но если вы используете сложный запрос, нужно предусмотреть обработку обоих типов данных:


// Универсальное получение ИНН через обращение к типу
ИНН = "";
Если ТипЗнч(ОбъектПлательщик) = Тип("СправочникСсылка.Контрагенты") Тогда
    ИНН = ОбъектПлательщик.ИНН;
ИначеЕсли ТипЗнч(ОбъектПлательщик) = Тип("СправочникСсылка.ФизическиеЛица") Тогда
    ИНН = ОбъектПлательщик.ИНН;
КонецЕсли;

Заключение

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

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

← На главную