Как вывести адрес склада в печатную форму документа в 1С

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

При разработке и кастомизации печатных форм в 1С:Предприятие часто возникает задача вывода дополнительных реквизитов объектов, которые не хранятся в основном документе. Одной из таких задач является вывод точного адреса склада в печатной форме «Расходная накладная по складам». В данной статье мы подробно разберем, как правильно извлечь контактную информацию склада и корректно отобразить ее в макете через запятую после наименования. Чтобы реализовать такие доработки без изменения основной конфигурации, можно использовать шаблон для создания внешних подключаемых печатных форм.

Анализ структуры хранения данных

Прежде чем приступать к написанию кода, проанализируем, где именно хранится адрес склада. В современных конфигурациях, таких как 1С:Управление нашей фирмой (УНФ), склады хранятся в справочнике СтруктурныеЕдиницы. Адрес же не является обычным строковым реквизитом, а хранится в подчиненной таблице (регистре или табличной части) КонтактнаяИнформация. Это позволяет хранить несколько видов адресов (фактический, юридический) и телефонов для одного объекта.

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

Решение задачи с помощью запроса

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

Разберем пример кода, который можно интегрировать в процедуру печати:


// Определяем склад, адрес которого нужно получить
СкладСсылка = ВыборкаСклады.Склад; 

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |    КИ.Представление КАК Адрес
    |ИЗ
    |    Справочник.СтруктурныеЕдиницы.КонтактнаяИнформация КАК КИ
    |ГДЕ
    |    КИ.Ссылка = &СкладСсылка
    |    И КИ.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес)";

Запрос.УстановитьПараметр("СкладСсылка", СкладСсылка);

РезультатЗапроса = Запрос.Выполнить();
ВыборкаАдрес = РезультатЗапроса.Выбрать();

ТекстАдреса = "";
Если ВыборкаАдрес.Следующий() Тогда
    ТекстАдреса = ВыборкаАдрес.Адрес;
КонецЕсли;

В данном примере мы используем параметр &СкладСсылка, который передает конкретный элемент справочника СтруктурныеЕдиницы. Обратите внимание на условие по типу контактной информации — это критически важный момент, чтобы не получить вместо адреса номер телефона или адрес электронной почты.

Объединение наименования склада и адреса

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

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


// Формируем итоговое представление склада
НаименованиеСклада = Строка(СкладСсылка);
Если ЗначениеЗаполнено(ТекстАдреса) Тогда
    ПредставлениеСклада = НаименованиеСклада + ", " + ТекстАдреса;
Иначе
    ПредставлениеСклада = НаименованиеСклада;
КонецЕсли;

// Установка параметра в область макета
ОбластьМакета = Макет.ПолучитьОбласть("Склад");
ОбластьМакета.Параметры.ПредставлениеСклада = ПредставлениеСклада;
ТабДокумент.Вывести(ОбластьМакета);

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

Использование функций общего модуля (стандарт BSP)

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

Рассмотрим, как получить адрес склада с помощью общего модуля УправлениеКонтактнойИнформацией:


СкладСсылка = ВыборкаСклады.Склад;

// Получаем вид контактной информации (например, Фактический адрес склада)
ВидАдреса = Справочники.ВидыКонтактнойИнформации.СправочникСтруктурныеЕдиницыАдрес;

// Используем готовую функцию БСП
ТекстАдреса = УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта(СкладСсылка, ВидАдреса);

// Выводим в макет аналогично предыдущему примеру
НаименованиеСклада = Строка(СкладСсылка);
ПредставлениеСклада = НаименованиеСклада + ?(ЗначениеЗаполнено(ТекстАдреса), ", " + ТекстАдреса, "");
ОбластьМакета.Параметры.ПредставлениеСклада = ПредставлениеСклада;

Этот способ предпочтительнее, так как УправлениеКонтактнойИнформацией.ПредставлениеКонтактнойИнформацииОбъекта автоматически обрабатывает все нюансы хранения данных, включая историю изменений (если она включена) и корректное форматирование адреса в строку.

Типичные ошибки и способы их исправления

В процессе реализации разработчики часто сталкиваются со следующими проблемами:

  1. Ошибка типа параметра: Как было отмечено в обсуждении на форуме, передача ссылки на документ вместо ссылки на склад приведет к пустому результату запроса. Всегда проверяйте, какой объект является владельцем контактной информации.
  2. Несколько адресов: Если у склада заполнено несколько адресов, запрос без уточнения Вида или Типа может вернуть несколько строк, что приведет к дублированию информации в печатной форме. Всегда накладывайте фильтр на конкретный вид контактной информации.
  3. Пустые значения: Если адрес не заполнен, код должен корректно обрабатывать NULL или пустую строку, чтобы в печатной форме не появлялись странные символы или лишние знаки пунктуации.

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

← На главную