В практике разработки на платформе 1С часто возникает задача создания удобных интерфейсов для быстрого ввода данных. Одной из базовых задач для начинающего разработчика является создание обработки, которая позволяет в «одно окно» ввести данные и программно создать объект в базе данных. В этой статье мы подробно разберем, как реализовать механизм создания элементов и групп в справочнике Контрагенты, правильно распределив нагрузку между клиентом и сервером.
Прежде чем приступать к написанию кода, проанализируем необходимые изменения в конфигурации. Нам требуется добавить два реквизита в справочник Контрагенты: ИНН и Телефон. Важно обратить внимание на типы данных. Несмотря на то, что в учебных заданиях иногда просят использовать тип Число для ИНН, в реальных проектах мы всегда используем тип Строка. Это необходимо, так как ИНН может начинаться с нуля, который будет потерян при числовом типе, а также для упрощения валидации длины (10 или 12 символов).
Для телефона мы также выберем тип Строка (12 символов). Рекомендуем также настроить маску ввода в свойствах реквизита формы, чтобы пользователь не ошибался при вводе номера.
Создадим новую обработку с именем ВводКонтрагентов. Для того чтобы пользователи могли легко найти её в интерфейсе, нам нужно включить её в состав подсистемы Продажи. Рассмотрим, как это сделать правильно:
Продажи.В самой обработке создадим форму. На форме нам понадобятся три реквизита: Наименование (Строка), ИНН (Строка или Число, согласно заданию) и Телефон (Строка). Разместим их на форме и добавим две команды: Создать элемент и Создать группу.
Разберем один из самых важных аспектов разработки на управляемых формах — разделение кода на клиентскую и серверную части. Создание объекта и его запись в базу данных возможны только на стороне сервера (директива &НаСервере), в то время как открытие формы созданного объекта — это интерфейсное действие, доступное только на клиенте (директива &НаКлиенте).
Проанализируем пример функции для создания контрагента на сервере. Мы будем передавать данные с формы в структуру, записывать объект и возвращать ссылку на него обратно на клиент.
&НаСервере
Функция СоздатьКонтрагентаНаСервере(ДанныеЗаполнения, ЭтоГруппа = Ложь)
Если ЭтоГруппа Тогда
НовыйОбъект = Справочники.Контрагенты.СоздатьГруппу();
Иначе
НовыйОбъект = Справочники.Контрагенты.СоздатьЭлемент();
НовыйОбъект.ИНН = ДанныеЗаполнения.ИНН;
НовыйОбъект.Телефон = ДанныеЗаполнения.Телефон;
КонецЕсли;
НовыйОбъект.Наименование = ДанныеЗаполнения.Наименование;
Попытка
НовыйОбъект.Записать();
Возврат НовыйОбъект.Ссылка;
Исключение
ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при записи: " + ОписаниеОшибки());
Возврат Неопределено;
КонецПопытки;
КонецФункции
Теперь рассмотрим, как вызвать серверную функцию и открыть форму нового объекта. Выясним причину, по которой нам нужно возвращать именно ссылку: метод ОткрытьФорму требует уникальный идентификатор объекта (ссылку), чтобы отобразить уже существующую в базе запись, а не пустую форму.
&НаКлиенте
Процедура СоздатьЭлемент(Команда)
ДанныеДляСервера = Новый Структура;
ДанныеДляСервера.Вставить("Наименование", Объект.Наименование);
ДанныеДляСервера.Вставить("ИНН", Объект.ИНН);
ДанныеДляСервера.Вставить("Телефон", Объект.Телефон);
НоваяСсылка = СоздатьКонтрагентаНаСервере(ДанныеДляСервера, Ложь);
Если ЗначениеЗаполнено(НоваяСсылка) Тогда
ПараметрыФормы = Новый Структура("Ключ", НоваяСсылка);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
КонецЕсли;
КонецПроцедуры
Аналогичным образом реализуем процедуру для создания группы. Важно помнить, что для группы мы не заполняем реквизиты ИНН и Телефон, так как в типовых иерархических справочниках группы обычно содержат только наименование и родителя.
Посмотрим на настройки справочника Контрагенты. Чтобы метод СоздатьГруппу() отработал без ошибок, в конфигураторе на закладке Иерархия должен быть установлен флаг Иерархический справочник, а тип иерархии выбран как Иерархия групп и элементов. Если справочник не является иерархическим, попытка создания группы приведет к ошибке выполнения программы.
Разберем, как сделать наше решение более надежным. Профессиональным подходом считается проверка на существование контрагента с таким же ИНН перед созданием нового. Это позволяет избежать дублирования данных в системе.
Проанализируем дополнение серверной логики поиском дублей:
&НаСервере
Функция НайтиДубльПоИНН(ИНН)
Возврат Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
КонецФункции
Использование метода НайтиПоРеквизиту эффективно, если по данному реквизиту в конфигураторе установлен признак Индексировать. Это значительно ускорит работу поиска при большом количестве записей в справочнике.
Мы проанализировали процесс создания вспомогательной обработки для работы со справочниками. Основные шаги включают:
СоздатьЭлемент() и СоздатьГруппу() на сервере, обязательный вызов Записать() и возврат ссылки на клиент для открытия формы через ОткрытьФорму с параметром Ключ.Соблюдение этих правил позволит вам создавать чистый, эффективный и отказоустойчивый код на платформе 1С:Предприятие 8.3.