Как добавить и изменять контактную информацию через БСП для нового, еще не записанного объекта 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", "Фактический адрес" и т.д.), которые вы планируете использовать. Это важно для корректного отображения и классификации контактных данных.

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

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

← К списку