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