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