Как добавить и изменять контактную информацию через БСП для нового, еще не записанного объекта 1С?

Программист 1С v8.3 (Управляемые формы)
← На главную

При разработке информационных систем на платформе 1С:Предприятие часто возникает задача работы с контактной информацией (телефоны, адреса электронной почты, фактические и юридические адреса) для различных объектов системы, таких как контрагенты, сотрудники, физические лица и так далее. Особый интерес представляет сценарий, когда мы хотим дать пользователю возможность ввести и отредактировать контактную информацию для нового, еще не записанного в базу данных объекта. Например, создать нового заказчика, добавить ему телефоны и адреса, и только после этого сохранить всю информацию целиком.

Библиотека стандартных подсистем (БСП) предоставляет мощный и гибкий механизм для работы с контактной информацией. Разобраться в деталях реализации поможет справочник по методам БСП, который содержит множество примеров использования стандартных инструментов. Давайте разберем, как мы можем использовать его для решения нашей задачи, обеспечивая удобство для пользователя и корректную работу системы.

Решение 1: Работа с объектом в памяти до записи

Основной принцип работы БСП с контактной информацией для незаписанных объектов заключается в том, что все изменения сначала накапливаются в самом объекте в оперативной памяти, а не сразу сохраняются в базу данных. Это позволяет пользователю многократно изменять контактную информацию до тех пор, пока он не примет решение окончательно записать основной объект.

Как это работает?

  1. Передача объекта вместо ссылки: Ключевой момент – это передача в функции БСП не ссылки на объект (которая может быть пустой для нового объекта), а самого объекта-владельца (например, элемент справочника, созданный командой СоздатьЭлемент()).

    Рассмотрим подробнее: когда мы передаем объект, например, НовыйЭлементСправочника, функции БСП, такие как УстановитьКонтактнуюИнформациюОбъекта из общего модуля УправлениеКонтактнойИнформацией, будут работать непосредственно с этим объектом в памяти. Контактная информация будет добавлена в его табличную часть, но сам объект при этом не будет записан в базу данных.

  2. Хранение в табличной части: В современных версиях БСП контактная информация хранится в специальной табличной части объекта-владельца, которая обычно имеет имя КонтактнаяИнформация. Это означает, что все введенные данные для нового объекта временно находятся в этой табличной части в оперативной памяти. Мы можем их редактировать, удалять, добавлять новые, и все это будет происходить без обращения к базе данных.

    Разберем ситуацию: ранее, в некоторых старых подходах, для хранения контактной информации могли использоваться регистры сведений. Однако в актуальных версиях БСП этот механизм реализован через табличную часть самого объекта, что значительно упрощает работу с незаписанными элементами, поскольку вся информация "путешествует" вместе с объектом в памяти.

  3. Отложенная запись: Окончательное сохранение контактной информации в базу данных произойдет только тогда, когда будет явно вызван метод Записать() для основного объекта-владельца. Это полностью соответствует требованию, чтобы пользователь мог изменять контактную информацию для еще не записанного в базу заказчика, а запись производилась только по нажатию кнопки "Записать".

Пример работы с объектом в коде:

Допустим, мы создаем новый элемент справочника "Заказчики" и хотим добавить ему контактную информацию до записи.


// Создаем новый элемент справочника "Заказчики"
НовыйЗаказчик = Справочники.Заказчики.СоздатьЭлемент();

// Заполняем основные реквизиты нового заказчика
НовыйЗаказчик.Наименование = "Новый тестовый заказчик";
НовыйЗаказчик.ИНН = "1234567890";
// ... другие реквизиты ...

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

// Добавляем строки в табличную часть контактной информации
// Например, добавим телефон
НоваяСтрокаКИ = ТаблицаКонтактнойИнформации.Добавить();
НоваяСтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Телефон"); // Предполагаем, что такой вид существует
НоваяСтрокаКИ.Представление = "+7 (XXX) XXX-XX-XX";
НоваяСтрокаКИ.Значение = "+79XXXXXXXXX";
НоваяСтрокаКИ.Тип = "Телефон";

// Добавляем адрес электронной почты
НоваяСтрокаКИ = ТаблицаКонтактнойИнформации.Добавить();
НоваяСтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Email"); // Предполагаем, что такой вид существует
НоваяСтрокаКИ.Представление = "test@example.com";
НоваяСтрокаКИ.Значение = "test@example.com";
НоваяСтрокаКИ.Тип = "АдресЭлектроннойПочты";

// Устанавливаем (или обновляем) контактную информацию в объект.
// Важно: в данном случае мы передаем именно объект НовыйЗаказчик,
// а не ссылку. Объект при этом не будет записан в базу данных.
УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъекта(НовыйЗаказчик, ТаблицаКонтактнойИнформации);

// На этом этапе НовыйЗаказчик содержит всю контактную информацию в своей табличной части,
// но еще не записан в базу данных. Пользователь может продолжить редактирование.

// Когда пользователь нажмет кнопку "Записать" или произойдет другое событие,
// вызываем метод Записать() для основного объекта.
// НовыйЗаказчик.Записать();

Решение 2: Интеграция подсистемы "Контактная информация" в пользовательский объект

Для того чтобы наш объект, например, справочник "Заказчики", полностью поддерживал механизм работы с контактной информацией БСП, нам необходимо выполнить ряд шагов по его интеграции. Это позволит не только программно работать с КИ, но и предоставит стандартный пользовательский интерфейс для ее редактирования.

Разберем по шагам, что необходимо сделать:

  1. Добавление табличной части: Первым делом, в наш объект необходимо добавить табличную часть с именем КонтактнаяИнформация. Она должна иметь предопределенную структуру (реквизиты: Вид, Представление, Значение, Тип и др.).
  2. Включение в определяемый тип: Наш объект должен быть включен в предопределенный определяемый тип ВладелецКонтактнойИнформации.
  3. Размещение группы на форме: На форме элемента необходимо разместить группу ГруппаКонтактнаяИнформация. Если вы занимаетесь динамическим созданием интерфейса, вам может пригодиться инструмент для программного изменения форм, который стандартизирует процесс добавления элементов.
  4. Вызов процедур БСП в модуле формы: Для корректной работы подсистемы нужно вызвать процедуры общего модуля УправлениеКонтактнойИнформациейКлиентСервер. Чтобы убедиться, что все вызовы экспортных процедур выполнены корректно, рекомендуется провести анализ конфигурации на наличие ошибок.
    • ПриСозданииНаСервере: Инициализирует подсистему для новой формы.
    • ПриЧтенииНаСервере: Подготавливает информацию для отображения.
    • ПередЗаписьюНаСервере: Собирает данные из формы перед сохранением.

    Посмотрим на пример кода для модуля формы:

    
    // В модуле формы элемента справочника "Заказчики"
    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        СтандартнаяОбработка = Ложь;
        УправлениеКонтактнойИнформациейКлиентСервер.ПриСозданииНаСервере(ЭтотОбъект, "ГруппаКонтактнаяИнформация");
    КонецПроцедуры
    
    &НаСервере
    Процедура ПриЧтенииНаСервере(ТекущийОбъект)
        УправлениеКонтактнойИнформациейКлиентСервер.ПриЧтенииНаСервере(ЭтотОбъект, "ГруппаКонтактнаяИнформация");
    КонецПроцедуры
    
    &НаСервере
    Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
        УправлениеКонтактнойИнформациейКлиентСервер.ПередЗаписьюНаСервере(ЭтотОбъект, Отказ, ПараметрыЗаписи);
        Если Отказ Тогда
            Возврат;
        КонецЕсли;
    КонецПроцедуры
    
  5. Настройка видов контактной информации: Убедитесь, что в соответствующем справочнике настроены все нужные виды (Телефон, Email и др.) для вашего типа объекта.

Таким образом, мы выяснили, что механизм БСП спроектирован с учетом возможности редактирования данных для незаписанных объектов. Основной подход заключается в передаче самого объекта в процедуры БСП, что позволяет накапливать изменения в оперативной памяти. Интеграция подсистемы требует соблюдения структуры метаданных и правильного вызова обработчиков в форме.

Следуя этим рекомендациям, мы можем эффективно организовать работу с контактной информацией, предоставляя пользователям гибкий и интуитивно понятный интерфейс.

← На главную