При разработке информационных систем на платформе 1С:Предприятие часто возникает задача работы с контактной информацией (телефоны, адреса электронной почты, фактические и юридические адреса) для различных объектов системы, таких как контрагенты, сотрудники, физические лица и так далее. Особый интерес представляет сценарий, когда мы хотим дать пользователю возможность ввести и отредактировать контактную информацию для нового, еще не записанного в базу данных объекта. Например, создать нового заказчика, добавить ему телефоны и адреса, и только после этого сохранить всю информацию целиком.
Библиотека стандартных подсистем (БСП) предоставляет мощный и гибкий механизм для работы с контактной информацией. Давайте разберем, как мы можем использовать его для решения нашей задачи, обеспечивая удобство для пользователя и корректную работу системы.
Основной принцип работы БСП с контактной информацией для незаписанных объектов заключается в том, что все изменения сначала накапливаются в самом объекте в оперативной памяти, а не сразу сохраняются в базу данных. Это позволяет пользователю многократно изменять контактную информацию до тех пор, пока он не примет решение окончательно записать основной объект.
Как это работает?
СоздатьЭлемент()).
Рассмотрим подробнее: когда мы передаем объект, например, НовыйЭлементСправочника, функции БСП, такие как УстановитьКонтактнуюИнформациюОбъекта из общего модуля УправлениеКонтактнойИнформацией, будут работать непосредственно с этим объектом в памяти. Контактная информация будет добавлена в его табличную часть, но сам объект при этом не будет записан в базу данных.
КонтактнаяИнформация. Это означает, что все введенные данные (телефоны, адреса и т.д.) для нового объекта временно находятся в этой табличной части в оперативной памяти. Мы можем их редактировать, удалять, добавлять новые, и все это будет происходить без обращения к базе данных.
Разберем ситуацию: ранее, в некоторых старых подходах, для хранения контактной информации могли использоваться регистры сведений. Однако в актуальных версиях БСП этот механизм реализован через табличную часть самого объекта, что значительно упрощает работу с незаписанными элементами, поскольку вся информация "путешествует" вместе с объектом в памяти.
Записать() для основного объекта-владельца. Это полностью соответствует требованию, чтобы пользователь мог изменять контактную информацию для еще не записанного в базу заказчика, а запись производилась только по нажатию кнопки "Записать".
Пример работы с объектом в коде:
Допустим, мы создаем новый элемент справочника "Заказчики" и хотим добавить ему контактную информацию до записи.
// Создаем новый элемент справочника "Заказчики"
НовыйЗаказчик = Справочники.Заказчики.СоздатьЭлемент();
// Заполняем основные реквизиты нового заказчика
НовыйЗаказчик.Наименование = "Новый тестовый заказчик";
НовыйЗаказчик.ИНН = "1234567890";
// ... другие реквизиты ...
// Получаем табличную часть для контактной информации из объекта
// Если ее нет, БСП создаст ее автоматически или вернет существующую
ТаблицаКонтактнойИнформации = УправлениеКонтактнойИнформацией.КонтактнаяИнформацияОбъекта(НовыйЗаказчик);
// Добавляем строки в табличную часть контактной информации
// Например, добавим телефон
НоваяСтрокаКИ = ТаблицаКонтактнойИнформации.Добавить();
НоваяСтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Телефон"); // Предполагаем, что такой вид существует
НоваяСтрокаКИ.Представление = "+7 (XXX) XXX-XX-XX";
НоваяСтрокаКИ.Значение = "+79XXXXXXXXX";
НоваяСтрокаКИ.Тип = "Телефон";
// Добавляем адрес электронной почты
НоваяСтрокаКИ = ТаблицаКонтактнойИнформации.Добавить();
НоваяСтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.НайтиПоНаименованию("Email"); // Предполагаем, что такой вид существует
НоваяСтрокаКИ.Представление = "test@example.com";
НоваяСтрокаКИ.Значение = "test@example.com";
НоваяСтрокаКИ.Тип = "АдресЭлектроннойПочты";
// Устанавливаем (или обновляем) контактную информацию в объект.
// Важно: в данном случае мы передаем именно объект НовыйЗаказчик,
// а не ссылку. Объект при этом не будет записан в базу данных.
УправлениеКонтактнойИнформацией.УстановитьКонтактнуюИнформациюОбъекта(НовыйЗаказчик, ТаблицаКонтактнойИнформации);
// На этом этапе НовыйЗаказчик содержит всю контактную информацию в своей табличной части,
// но еще не записан в базу данных. Пользователь может продолжить редактирование.
// Когда пользователь нажмет кнопку "Записать" или произойдет другое событие,
// вызываем метод Записать() для основного объекта.
// Только после этого вся информация, включая контактную, будет сохранена в базу.
// НовыйЗаказчик.Записать();
Для того чтобы наш объект, например, справочник "Заказчики", полностью поддерживал механизм работы с контактной информацией БСП, нам необходимо выполнить ряд шагов по его интеграции. Это позволит не только программно работать с КИ, но и предоставит стандартный пользовательский интерфейс для ее редактирования.
Разберем по шагам, что необходимо сделать:
КонтактнаяИнформация. Эта табличная часть должна иметь предопределенную структуру, соответствующую требованиям БСП (обычно это набор реквизитов: Вид, Представление, Значение, Тип, Страна, Регион и т.д.).
ВладелецКонтактнойИнформации. Это сообщает БСП, что данный объект является владельцем контактной информации и может использовать соответствующие механизмы.
ГруппаКонтактнаяИнформация. В эту группу БСП будет автоматически выводить элементы управления для редактирования контактной информации.
УправлениеКонтактнойИнформациейКлиентСервер в обработчиках событий формы элемента. Проанализируем эти процедуры:
ПриСозданииНаСервере(ЭтотОбъект, "ГруппаКонтактнаяИнформация"): Эту процедуру вызываем в обработчике события формы ПриСозданииНаСервере. Она отвечает за инициализацию подсистемы при создании новой формы элемента, в том числе и для нового, еще незаписанного объекта.
ПриЧтенииНаСервере(ЭтотОбъект, "ГруппаКонтактнаяИнформация"): Вызываем в обработчике события формы ПриЧтенииНаСервере. Эта процедура считывает контактную информацию из объекта и подготавливает ее для отображения и редактирования на форме.
ПередЗаписьюНаСервере(ЭтотОбъект, Отказ, ПараметрыЗаписи): Вызываем в обработчике события формы ПередЗаписьюНаСервере. Эта процедура перед записью основного объекта собирает всю отредактированную контактную информацию из формы и записывает ее обратно в табличную часть объекта, а также выполняет необходимые проверки.
Посмотрим на пример кода для модуля формы:
// В модуле формы элемента справочника "Заказчики"
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Вызываем стандартную обработку
СтандартнаяОбработка = Ложь;
// Инициализация подсистемы контактной информации
УправлениеКонтактнойИнформациейКлиентСервер.ПриСозданииНаСервере(ЭтотОбъект, "ГруппаКонтактнаяИнформация");
// ... Ваш дополнительный код при создании на сервере ...
КонецПроцедуры
&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
// Вызываем стандартную обработку для чтения контактной информации
УправлениеКонтактнойИнформациейКлиентСервер.ПриЧтенииНаСервере(ЭтотОбъект, "ГруппаКонтактнаяИнформация");
// ... Ваш дополнительный код при чтении на сервере ...
КонецПроцедуры
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ПараметрыЗаписи)
// Передаем управление подсистеме контактной информации для обработки перед записью
УправлениеКонтактнойИнформациейКлиентСервер.ПередЗаписьюНаСервере(ЭтотОбъект, Отказ, ПараметрыЗаписи);
// Если Отказ = Истина после вызова, значит, есть ошибки в КИ, и запись основного объекта будет отменена.
Если Отказ Тогда
Возврат;
КонецЕсли;
// ... Ваш дополнительный код перед записью на сервере ...
КонецПроцедуры
// Также могут потребоваться вызовы в ПриЗаписиНаСервере, ПриЗаписи и т.д.
// в зависимости от специфики и версии БСП.
ВидыКонтактнойИнформации: Убедитесь, что в справочнике ВидыКонтактнойИнформации настроены все необходимые виды КИ (например, "Телефон", "Email", "Фактический адрес" и т.д.), которые вы планируете использовать. Это важно для корректного отображения и классификации контактных данных.
Таким образом, мы выяснили, что механизм БСП для работы с контактной информацией спроектирован с учетом возможности редактирования данных для незаписанных объектов. Основной подход заключается в передаче самого объекта в процедуры БСП, что позволяет накапливать изменения в его табличной части КонтактнаяИнформация в оперативной памяти, а окончательное сохранение происходит только при явной записи основного объекта. Интеграция подсистемы в пользовательский объект требует добавления табличной части, включения в определяемый тип, размещения группы на форме и вызова соответствующих процедур БСП в обработчиках событий формы.
Следуя этим рекомендациям, мы можем эффективно организовать работу с контактной информацией, предоставляя пользователям гибкий и интуитивно понятный интерфейс.
← К списку