При оформлении первичных документов и печатных форм (счет, протокол согласования цен, накладная) часто возникает задача разграничения информации о покупателе. Если контрагентом выступает юридическое лицо, в документе требуется указывать его наименование, УНН (ИНН) и банковские реквизиты. Если же покупателем является физическое лицо, расчетного счета и организации у него нет, поэтому в печатную форму требуется вывести паспортные данные (серию, номер, дату выдачи и кем выдан документ). Разберем, как реализовать такую логику в платформе 1С:Предприятие 7.7.
Прежде чем приступать к правке кода или макетов в конфигураторе, выясним причину, по которой изменения могут не отображаться на печати. Проанализируем типичный фрагмент кода вызова макета в типовых или доработанных конфигурациях:
ИмяФайлаПечатнойФормы = КаталогИБ() + "ExtForms\PrnForms\1cbs.mxl";
Если ФС.СуществуетФайл(ИмяФайлаПечатнойФормы) = 1 Тогда
Таб.ИсходнаяТаблица(ИмяФайлаПечатнойФормы);
ИначеЕсли НомерТекущейФормы = 7 Тогда
Таб.ИсходнаяТаблица("Счет");
ИначеЕсли (НомерТекущейФормы = 9) Тогда
Таб.ИсходнаяТаблица("Протокол");
ИначеЕсли (НомерТекущейФормы = 8) Тогда
Таб.ИсходнаяТаблица("СчетПротокол");
КонецЕсли;
Обратим внимание: если файл по пути КаталогИБ() + "ExtForms\PrnForms\1cbs.mxl" физически существует на диске, платформа загружает именно внешнюю таблицу. В этом случае любые изменения встроенных таблиц в конфигураторе («Счет», «Протокол») не будут видны пользователю. Если используется внешний файл .mxl, его необходимо открыть отдельно через меню Файл → Открыть, внести правки и сохранить.
Рассмотрим наиболее универсальный вариант, не требующий дублирования строк в макете. В этом случае ячейка таблицы настраивается на вывод единой строковой переменной, содержимое которой рассчитывается в процедуре печати в зависимости от вида контрагента.
Разберем по шагам реализацию этого способа:
Печать).Контрагенты отвечает за тип лица. В типовых конфигурациях это реквизит ЮрФизЛицо, принимающий значение из системного перечисления Перечисление.ЮрФизЛицо (значения ЮрЛицо, ФизЛицо или аналогичные).ПечПокупатель:
Перем ПечПокупатель;
Если Контрагент.ЮрФизЛицо = Перечисление.ЮрФизЛицо.ФизЛицо Тогда
// Формируем паспортные данные для физлица
ПаспортныеДанные = "паспорт: " + СокрЛП(Контрагент.СерияПаспорта) + " № " + СокрЛП(Контрагент.НомерПаспорта);
Если ПустоеЗначение(Контрагент.КемВыдан) = 0 Тогда
ПаспортныеДанные = ПаспортныеДанные + ", выдан: " + СокрЛП(Контрагент.КемВыдан);
КонецЕсли;
Если ПустоеЗначение(Контрагент.ДатаВыдачи) = 0 Тогда
ПаспортныеДанные = ПаспортныеДанные + " от " + Формат(Контрагент.ДатаВыдачи, "ДДДММГГГГ");
КонецЕсли;
ПечПокупатель = СокрЛП(Контрагент.ПолнНаименование) + ", " + ПаспортныеДанные + ", адрес: " + СокрЛП(Контрагент.ЮридическийАдрес);
Иначе
// Формируем стандартные реквизиты для юридического лица
ПечПокупатель = СокрЛП(Контрагент.ПолнНаименование) + ", УНН " + СокрЛП(Контрагент.УНН) +
", р/с " + СокрЛП(Контрагент.Р/Счет) + " в " + СокрЛП(Контрагент.Банк);
КонецЕсли;
В самой таблице печатной формы выберем ячейку, где выводится покупатель, откроем ее свойства (двойным кликом), укажем тип Выражение и впишем имя переменной: ПечПокупатель. Также включим флаг Переносить слова, чтобы длинные строки корректно умещались по высоте строки.
Рассмотрим альтернативный вариант, когда визуальный вид строки для физического лица кардинально отличается от юридического лица. В платформе 1С 7.7 невозможно программно скрыть отдельную ячейку таблицы, поэтому используется вывод альтернативных секций строк.
Разберем по шагам:
ШапкаЮрЛицо со стандартными полями (банк, расчетный счет, УНН) и секцию ШапкаФизЛицо, где вместо банковских полей размещены ячейки с паспортными данными покупателя.
Если Контрагент.ЮрФизЛицо = Перечисление.ЮрФизЛицо.ФизЛицо Тогда
Таб.ВывестиСекцию("ШапкаФизЛицо");
Иначе
Таб.ВывестиСекцию("ШапкаЮрЛицо");
КонецЕсли;
Посмотрим на пример заполнения полей в секции ШапкаФизЛицо. Если в ячейке установлен тип Шаблон, обращение к реквизитам оформляется в квадратных скобках:
Покупатель: [СокрЛП(Контрагент.ПолнНаименование)], Паспорт: [СокрЛП(Контрагент.СерияПаспорта)] № [СокрЛП(Контрагент.НомерПаспорта)], выдан [СокрЛП(Контрагент.КемВыдан)]
Обратим внимание на следующие правила работы со справочником контрагентов:
Контрагенты в дереве метаданных и проверим, как именно названы поля (например, ПаспортСерия, СерияПаспорта или единый строковый реквизит ДокументУдостоверяющийЛичность).Контрагент.ЮрФизЛицо должна осуществляться именно со значением перечисления через Перечисление.ИмяПеречисления.ИмяЗначения, а не со строковым литералом "ФизЛицо", так как прямое сравнение ссылки со строкой вернет ложь.