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