Как в 1С 7.7 вывести паспортные данные вместо расчетного счета, если контрагент является физическим лицом?

Программист 1С v7.7 1C:Бухгалтерия Бухгалтерский учет Торговля и дистрибуция
← На главную

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

Особенность работы с внешними файлами печатных форм

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


ИмяФайлаПечатнойФормы = КаталогИБ() + "ExtForms\PrnForms\1cbs.mxl";
Если ФС.СуществуетФайл(ИмяФайлаПечатнойФормы) = 1 Тогда
    Таб.ИсходнаяТаблица(ИмяФайлаПечатнойФормы);   
ИначеЕсли НомерТекущейФормы = 7 Тогда
    Таб.ИсходнаяТаблица("Счет");
ИначеЕсли (НомерТекущейФормы = 9) Тогда
    Таб.ИсходнаяТаблица("Протокол"); 
ИначеЕсли (НомерТекущейФормы = 8) Тогда
    Таб.ИсходнаяТаблица("СчетПротокол"); 
КонецЕсли;

Обратим внимание: если файл по пути КаталогИБ() + "ExtForms\PrnForms\1cbs.mxl" физически существует на диске, платформа загружает именно внешнюю таблицу. В этом случае любые изменения встроенных таблиц в конфигураторе («Счет», «Протокол») не будут видны пользователю. Если используется внешний файл .mxl, его необходимо открыть отдельно через меню Файл → Открыть, внести правки и сохранить.

Способ 1. Формирование динамической текстовой переменной в модуле

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

Разберем по шагам реализацию этого способа:

  1. Откроем модуль документа в конфигураторе и найдем процедуру формирования печатной формы (обычно Печать).
  2. Выясним, какой реквизит в справочнике Контрагенты отвечает за тип лица. В типовых конфигурациях это реквизит ЮрФизЛицо, принимающий значение из системного перечисления Перечисление.ЮрФизЛицо (значения ЮрЛицо, ФизЛицо или аналогичные).
  3. Перед выводом секции шапки сформируем текстовую переменную, например, ПечПокупатель:

Перем ПечПокупатель;

Если Контрагент.ЮрФизЛицо = Перечисление.ЮрФизЛицо.ФизЛицо Тогда
    // Формируем паспортные данные для физлица
    ПаспортныеДанные = "паспорт: " + СокрЛП(Контрагент.СерияПаспорта) + " № " + СокрЛП(Контрагент.НомерПаспорта);
    Если ПустоеЗначение(Контрагент.КемВыдан) = 0 Тогда
        ПаспортныеДанные = ПаспортныеДанные + ", выдан: " + СокрЛП(Контрагент.КемВыдан);
    КонецЕсли;
    Если ПустоеЗначение(Контрагент.ДатаВыдачи) = 0 Тогда
        ПаспортныеДанные = ПаспортныеДанные + " от " + Формат(Контрагент.ДатаВыдачи, "ДДДММГГГГ");
    КонецЕсли;
    
    ПечПокупатель = СокрЛП(Контрагент.ПолнНаименование) + ", " + ПаспортныеДанные + ", адрес: " + СокрЛП(Контрагент.ЮридическийАдрес);
Иначе
    // Формируем стандартные реквизиты для юридического лица
    ПечПокупатель = СокрЛП(Контрагент.ПолнНаименование) + ", УНН " + СокрЛП(Контрагент.УНН) + 
                    ", р/с " + СокрЛП(Контрагент.Р/Счет) + " в " + СокрЛП(Контрагент.Банк);
КонецЕсли;

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

Способ 2. Разделение макета на разные секции

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

Разберем по шагам:

  1. Откроем исходную таблицу печатной формы в конфигураторе.
  2. Создадим две секции строк вместо одной: секцию ШапкаЮрЛицо со стандартными полями (банк, расчетный счет, УНН) и секцию ШапкаФизЛицо, где вместо банковских полей размещены ячейки с паспортными данными покупателя.
  3. В коде формирования печатной формы заменим прямой вывод секции на условную конструкцию:

Если Контрагент.ЮрФизЛицо = Перечисление.ЮрФизЛицо.ФизЛицо Тогда
    Таб.ВывестиСекцию("ШапкаФизЛицо");
Иначе
    Таб.ВывестиСекцию("ШапкаЮрЛицо");
КонецЕсли;

Посмотрим на пример заполнения полей в секции ШапкаФизЛицо. Если в ячейке установлен тип Шаблон, обращение к реквизитам оформляется в квадратных скобках:

Покупатель: [СокрЛП(Контрагент.ПолнНаименование)], Паспорт: [СокрЛП(Контрагент.СерияПаспорта)] № [СокрЛП(Контрагент.НомерПаспорта)], выдан [СокрЛП(Контрагент.КемВыдан)]

Важные замечания по проверке реквизитов

Обратим внимание на следующие правила работы со справочником контрагентов:

  1. Проверка имен реквизитов: точные имена реквизитов серии, номера и даты выдачи паспорта могут различаться в зависимости от конфигурации. Обязательно откроем справочник Контрагенты в дереве метаданных и проверим, как именно названы поля (например, ПаспортСерия, СерияПаспорта или единый строковый реквизит ДокументУдостоверяющийЛичность).
  2. Сравнение перечислений: проверка условия Контрагент.ЮрФизЛицо должна осуществляться именно со значением перечисления через Перечисление.ИмяПеречисления.ИмяЗначения, а не со строковым литералом "ФизЛицо", так как прямое сравнение ссылки со строкой вернет ложь.
← На главную