В типовых конфигурациях 1С (таких как 1С:ERP Управление предприятием 2.4, 1С:Комплексная автоматизация 2, 1С:Управление торговлей 11), построенных на базе Библиотеки стандартных подсистем (БСП), работа с контактной информацией унифицирована. Пользователи часто сталкиваются с тем, что стандартных полей ввода адреса (дом, корпус, квартира) недостаточно. Например, для служб доставки критически важно указывать в структурированном виде номер этажа, код домофона, офиса или вводить дополнительные примечания к адресу.
В этой статье мы подробно разберем, как устроен механизм адресных сведений в БСП, как расширить список доступных типов объектов адресации и как сделать это правильно с помощью механизма расширений, не снимая конфигурацию с поддержки.
Прежде чем переходить к доработке, проанализируем, как система строит форму ввода адреса и сохраняет введенные данные. Когда мы нажимаем кнопку выбора (три точки) рядом с полем адреса, открывается специализированная форма ввода контактной информации. Список доступных дополнительных полей (таких как «Офис», «Бокс», «Помещение», «Этаж») формируется динамически на основе настроек БСП.
За определение структуры полей отвечает общий модуль, содержащий сведения о типах объектов адресации РФ. Система инициализирует доступные типы строений и помещений, сопоставляя их с кодами ФИАС (Федеральной информационной адресной системы).
Вся введенная информация упаковывается в XML- или JSON-строку (в зависимости от версии БСП) и записывается в реквизит ЗначенияПолей табличной части контактной информации соответствующего справочника (например, «Контрагенты» или «Физические лица»). Если мы просто добавим реквизит на форму, система не сможет его сериализовать и сохранить в XML. Поэтому расширять адресную информацию необходимо строго через переопределение стандартной структуры типов объектов адресации.
Выясним причину, по которой те или иные поля отображаются в форме ввода. В современных версиях БСП за наполнение списка объектов адресации отвечает функция ТипыОбъектовАдресацииАдресаРФ(). В зависимости от точной версии вашей БСП эта функция может быть расположена в общем модуле:
РаботаСАдресамиКлиентСервер (начиная с БСП 3.0 и выше);УправлениеКонтактнойИнформациейКлиентСервер (в более ранних редакциях БСП).Эта функция возвращает массив структур, описывающих каждый элемент адреса (код, наименование, тип, порядок вывода и код соответствия ФИАС). Нам необходимо переопределить эту функцию, добавив свои кастомные элементы.
Чтобы сохранить конфигурацию на поддержке и облегчить будущие обновления 1С:ЕРП, реализуем изменения через Расширение конфигурации. Рассмотрим этот процесс по шагам.
РасширениеАдресов) и снимите флажки «Безопасный режим» и «Защита от опасных действий» (это необходимо для корректной работы клиент-серверных общих модулей).РаботаСАдресамиКлиентСервер (или УправлениеКонтактнойИнформациейКлиентСервер). Нажмите по нему правой кнопкой мыши и выберите Добавить в расширение.ТипыОбъектовАдресацииАдресаРФ() с помощью аннотации &После.Разберем, почему мы используем именно аннотацию &После. Исходная функция возвращает массив уже готовых структур. Нам достаточно добавить в этот массив свои элементы. При этом мы не заменяем основной алгоритм, что гарантирует стабильность системы при обновлении.
Посмотрим на пример реализации. Поскольку вспомогательная функция СтрокаОбъектаАдресации в типовом общем модуле не является экспортируемой, мы не можем вызвать ее напрямую в расширении. Нам необходимо создать структуру нового типа адресации вручную.
Вставьте следующий программный код в модуль расширения:
&После("ТипыОбъектовАдресацииАдресаРФ")
Функция Расш_ТипыОбъектовАдресацииАдресаРФ(Результат)
// Создаем структуру вручную для нового поля "Этаж"
НовыйТипЭтаж = Новый Структура("Ключ, Код, Наименование, Тип, Порядок, КодФИАС");
НовыйТипЭтаж.Ключ = ВРег("Этаж"); // Ключ поиска в верхнем регистре
НовыйТипЭтаж.Код = "2060"; // Уникальный числовой код объекта
НовыйТипЭтаж.Наименование = "Этаж"; // Представление для пользователя
НовыйТипЭтаж.Тип = 3; // 1 - владение, 2 - здание, 3 - помещение
НовыйТипЭтаж.Порядок = 6; // Порядок отображения в выпадающем списке
НовыйТипЭтаж.КодФИАС = ""; // Оставляем пустым, так как ФИАС не регламентирует этажи
Результат.Добавить(НовыйТипЭтаж);
// Создаем структуру вручную для нового поля "Примечание"
НовыйТипПримечание = Новый Структура("Ключ, Код, Наименование, Тип, Порядок, КодФИАС");
НовыйТипПримечание.Ключ = ВРег("Примечание");
НовыйТипПримечание.Код = "2070";
НовыйТипПримечание.Наименование = "Примечание";
НовыйТипПримечание.Тип = 3;
НовыйТипПримечание.Порядок = 7;
НовыйТипПримечание.КодФИАС = "";
Результат.Добавить(НовыйТипПримечание);
Возврат Результат;
КонецФункции
Важное примечание по параметрам структуры:
Ключ — обязательно должен быть приведен к верхнему регистру (используйте функцию ВРег()), иначе механизмы поиска БСП не смогут его идентифицировать.Код — должен быть уникальным текстовым числом. Диапазон кодов для помещений обычно начинается с "2000". Используйте свободные коды, например, "2060", "2070".Тип — указывает, к какой группе относится элемент на форме. 1 поместит элемент в группу владений, 2 — к зданиям/сооружениям (корпус, строение), 3 — к помещениям (офис, квартира, комната).Когда пользователь заполнит новое поле (например, напишет «Этаж: 5» и «Примечание: Вход со двора»), БСП применит функцию КодСериализацииОбъектаАдресации(). Данная функция сканирует массив, сформированный нашей измененной процедурой ТипыОбъектовАдресацииАдресаРФ(), находит коды 2060 и 2070 и формирует XML-структуру:
<Structure>
<Property Name="Этаж">
<Value xsi:type="xs:string">5</Value>
</Property>
<Property Name="Примечание">
<Value xsi:type="xs:string">Вход со двора</Value>
</Property>
</Structure>
Благодаря этому данные будут успешно сохранены в реквизите ЗначенияПолей и отобразятся при повторном открытии карточки адреса.
Прежде чем внедрять данное решение в рабочую базу («production»), проанализируем возможные последствия для смежных систем:
УправлениеКонтактнойИнформацией.ПредставлениеАдреса()), которые учитывают все элементы из XML автоматически.Если риски нарушения формата ФИАС для вас критичны, рассмотрим альтернативные варианты решения задачи без изменения программного кода БСП:
Таким образом, мы рассмотрели устройство адресной системы в БСП и научились расширять КЛАДР новыми типами полей с помощью расширения конфигурации. Применяйте описанную методику аккуратно, учитывая требования регламентированной отчетности и интеграции с ФИАС.