При переходе с устаревших конфигураций на платформе «1С:Предприятие 8.2» (например, «Управление торговлей 10.3») на современные системы вроде «Управление торговлей 11» разработчики часто сталкиваются с радикальными изменениями в архитектуре хранения данных. Одной из таких подсистем является Контактная информация (КИ), реализованная на базе Библиотеки Стандартных Подсистем (БСП).
Попытки записать адрес или телефон «по-старинке» напрямую в табличную часть объекта приводят к тому, что данные либо не сохраняются вовсе, либо отображаются на форме некорректно и исчезают при первой же перезаписи карточки пользователем. В этой статье мы подробно разберем, почему так происходит, изучим внутреннее устройство подсистемы КИ и рассмотрим несколько рабочих способов программного заполнения контактной информации — от быстрого обходного пути до методологически правильной интеграции с сервисами стандартизации адресов (такими как DaData).
В старых конфигурациях контактная информация хранилась в отдельном регистре сведений РегистрСведений.КонтактнаяИнформация. В современных версиях «Управление торговлей 11» (начиная с редакции 11.0 и новее) архитектура изменилась:
КонтактнаяИнформация конкретного справочника (например, Контрагенты, Партнеры, ФизическиеЛица).Тип, Вид и Представление, табличная часть содержит скрытые, но критически важные реквизиты: ЗначенияПолей (в старых версиях БСП хранит XML-структуру) или Значение (в новых версиях БСП хранит JSON-строку).Выясним причину проблемы: когда вы записываете только текстовую строку в поле Представление, механизм БСП при открытии формы пытается распарсить структурированное поле ЗначенияПолей (или Значение). Понимая, что структурированных данных нет, система считает адрес пустым. При последующем сохранении формы пустое значение перезаписывает ваше текстовое представление, и данные бесследно исчезают. Чтобы решить эту задачу, нам необходимо передать системе данные в правильном формате.
Рассмотрим самый простой способ программного внесения изменений, который отлично подойдет для разовых обработок переноса данных или в ситуациях, когда жесткие требования к валидации адреса отсутствуют. Нам потребуется получить объект контрагента, напрямую заполнить строки его табличной части и принудительно записать объект в режиме загрузки данных, чтобы обойти платформенные проверки БСП.
Проанализируем пример кода, выполняемый на стороне сервера:
// Получаем объект контрагента по ссылке
КонтрагентОбъект = СсылкаНаКонтрагента.ПолучитьОбъект();
ТабличнаяЧастьКИ = КонтрагентОбъект.КонтактнаяИнформация;
// Перед добавлением желательно проверить, нет ли уже такого вида КИ у контрагента
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Вид", Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента);
НайденныеСтроки = ТабличнаяЧастьКИ.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() > 0 Тогда
НоваяСтрока = НайденныеСтроки[0];
Иначе
НоваяСтрока = ТабличнаяЧастьКИ.Добавить();
КонецЕсли;
// Заполняем обязательные реквизиты контактной информации
НоваяСтрока.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
НоваяСтрока.Вид = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
НоваяСтрока.Представление = ФактическийАдресСтрока; // Наша переменная с адресом
// Включаем режим загрузки данных для обхода проверок БСП
КонтрагентОбъект.ОбменДанными.Загрузка = Истина;
КонтрагентОбъект.Записать();
Важное предупреждение: использование флага ОбменДанными.Загрузка = Истина временно отключает бизнес-логику проведения и проверки заполнения объекта. Этот метод эффективен для быстрого исправления данных разработчиком, однако в регулярных бизнес-процессах и при интеграции с внешними API его использовать не рекомендуется.
hr>
В актуальных версиях «1С:Управление торговлей 11» подсистема контактной информации работает под управлением современных стандартов БСП 3.x, где данные сериализуются во внутренний формат JSON. Для правильной записи мы должны использовать экспортные функции общего модуля УправлениеКонтактнойИнформацией.
Разберем по шагам правильный алгоритм программной записи:
Посмотрим на пример реализации данного алгоритма:
// 1. Задаем исходные параметры
ВидКИ = Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента;
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Адрес;
АдресСтрокой = "101000, г. Москва, ул. Мясницкая, д. 40, стр. 1";
// 2. Преобразуем текстовую строку во внутренний JSON-формат БСП
КонтактнаяИнформацияJSON = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияПоПредставлению(АдресСтрокой, ВидКИ);
// 3. Получаем объект для записи
КонтрагентОбъект = СсылкаНаКонтрагента.ПолучитьОбъект();
// 4. Используем стандартную процедуру БСП для корректного внедрения КИ в объект
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(КонтрагентОбъект, КонтактнаяИнформацияJSON, ВидКИ, ТипКИ);
// 5. Записываем объект без отключения проверок
КонтрагентОбъект.Записать();
Этот способ является максимально надежным, так как БСП самостоятельно парсит строку адреса, пытается сопоставить ее с адресным классификатором (ГАР/ФИАС) и корректно заполняет все служебные поля табличной части. После такой записи у пользователя в интерфейсе адрес отобразится идеально.
hr>
Если вы поддерживаете старую базу (например, редакции УТ 11.0, 11.1 или 11.2), то современные функции работы с JSON-строками в ней отсутствуют. В этих версиях БСП структурированные данные хранятся в формате XML, формируемом через XDTO-пакеты.
Рассмотрим, как решить задачу в этом случае:
ВидКИ = Справочники.ВидыКонтактнойИнформации.ФактАдресContragenta;
ТипКИ = Перечисления.ТипыКонтактнойИнформации.Адрес;
АдресСтрокой = "190000, г. Санкт-Петербург, Невский пр-кт, д. 1";
// Получаем объект XDTO по текстовому представлению адреса
ОбъектXDTOКИ = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOПоПредставлению(АдресСтрокой, ТипКИ);
// Преобразуем полученную структуру XDTO в XML-строку для реквизита "ЗначенияПолей"
ЗначенияПолейXML = УправлениеКонтактнойИнформациейСлужебный.КонтактнаяИнформацияXDTOВXML(ОбъектXDTOКИ);
// Получаем объект и записываем данные в табличную часть
КонтрагентОбъект = СсылкаНаКонтрагента.ПолучитьОбъект();
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(КонтрагентОбъект, ЗначенияПолейXML, ВидКИ, ТипКИ);
КонтрагентОбъект.Записать();
Разберем более сложную и практическую ситуацию. Передавать в 1С «сырую» неразобранную строку адреса из внешней системы (в нашем случае из dadata.ru) — не самый эффективный вариант, ведь БСП будет пытаться разобрать ее своими силами, что может привести к ошибкам распознавания. DaData возвращает структурированный ответ в формате JSON, где адрес уже разбит по полям (индекс, регион, город, улица, дом и т.д.).
Посмотрим, как собрать структурированный адрес 1С на основе полученных из внешнего API параметров:
// Создаем пустую структуру адреса по стандартам 1С БСП
СтруктураАдреса = УправлениеКонтактнойИнформациейКлиентСервер.СтруктураКонтактнойИнформацииПоТипу(Перечисления.ТипыКонтактнойИнформации.Адрес);
// Заполняем структуру данными, полученными от DaData
СтруктураАдреса.Страна = "РОССИЯ";
СтруктураАдреса.Индекс = ДанныеDaData.postal_code;
СтруктураАдреса.Регион = ДанныеDaData.region_with_type;
СтруктураАдреса.Город = ДанныеDaData.city_with_type;
СтруктураАдреса.Улица = ДанныеDaData.street_with_type;
СтруктураАдреса.Дом = ДанныеDaData.house;
СтруктураАдреса.Представление = ДанныеDaData.result; // Полный стандартизированный адрес строкой
// Передаем заполненную структуру в БСП для генерации XML/JSON
ЗначениеДляЗаписи = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияВФорматеБазыДанных(СтруктураАдреса, Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента);
// Записываем структурированные данные в объект
КонтрагентОбъект = СсылкаНаКонтрагента.ПолучитьОбъект();
УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(КонтрагентОбъект, ЗначениеДляЗаписи, Справочники.ВидыКонтактнойИнформации.ФактАдресКонтрагента, Перечисления.ТипыКонтактнойИнформации.Адрес);
КонтрагентОбъект.Записать();
Такой подход гарантирует 100% корректность интеграции. Адрес автоматически привяжется к внутреннему адресному классификатору базы данных 1С (ГАР / ФИАС), а менеджеры компании смогут без проблем использовать его при выставлении счетов, оформлении доставок и формировании регламентированной отчетности.
Используйте рассмотренные стандартные процедуры БСП, избегайте записи «сырых» строк в табличную часть без конвертации, и механизмы работы с контактной информацией вашей системы «1С:Управление торговлей 11» будут работать стабильно и без сбоев!