Как программно создавать элементы и группы справочника в 1С через вспомогательную обработку

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

В практике разработки на платформе 1С часто возникает задача создания удобных интерфейсов для быстрого ввода данных. Одной из базовых задач для начинающего разработчика является создание обработки, которая позволяет в «одно окно» ввести данные и программно создать объект в базе данных. В этой статье мы подробно разберем, как реализовать механизм создания элементов и групп в справочнике Контрагенты, правильно распределив нагрузку между клиентом и сервером.

Анализ постановки задачи и подготовка структуры данных

Прежде чем приступать к написанию кода, проанализируем необходимые изменения в конфигурации. Нам требуется добавить два реквизита в справочник Контрагенты: ИНН и Телефон. Важно обратить внимание на типы данных. Несмотря на то, что в учебных заданиях иногда просят использовать тип Число для ИНН, в реальных проектах мы всегда используем тип Строка. Это необходимо, так как ИНН может начинаться с нуля, который будет потерян при числовом типе, а также для упрощения валидации длины (10 или 12 символов).

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

Создание обработки и настройка интерфейса

Создадим новую обработку с именем ВводКонтрагентов. Для того чтобы пользователи могли легко найти её в интерфейсе, нам нужно включить её в состав подсистемы Продажи. Рассмотрим, как это сделать правильно:

  1. Откроем свойства обработки в конфигураторе.
  2. Перейдем на закладку Подсистемы.
  3. Установим флажок напротив подсистемы Продажи.

В самой обработке создадим форму. На форме нам понадобятся три реквизита: Наименование (Строка), ИНН (Строка или Число, согласно заданию) и Телефон (Строка). Разместим их на форме и добавим две команды: Создать элемент и Создать группу.

Программная логика: разделение на клиент и сервер

Разберем один из самых важных аспектов разработки на управляемых формах — разделение кода на клиентскую и серверную части. Создание объекта и его запись в базу данных возможны только на стороне сервера (директива &НаСервере), в то время как открытие формы созданного объекта — это интерфейсное действие, доступное только на клиенте (директива &НаКлиенте).

Проанализируем пример функции для создания контрагента на сервере. Мы будем передавать данные с формы в структуру, записывать объект и возвращать ссылку на него обратно на клиент.


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

Реализация команд на стороне клиента

Теперь рассмотрим, как вызвать серверную функцию и открыть форму нового объекта. Выясним причину, по которой нам нужно возвращать именно ссылку: метод ОткрытьФорму требует уникальный идентификатор объекта (ссылку), чтобы отобразить уже существующую в базе запись, а не пустую форму.


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

Аналогичным образом реализуем процедуру для создания группы. Важно помнить, что для группы мы не заполняем реквизиты ИНН и Телефон, так как в типовых иерархических справочниках группы обычно содержат только наименование и родителя.

Работа с иерархией справочника

Посмотрим на настройки справочника Контрагенты. Чтобы метод СоздатьГруппу() отработал без ошибок, в конфигураторе на закладке Иерархия должен быть установлен флаг Иерархический справочник, а тип иерархии выбран как Иерархия групп и элементов. Если справочник не является иерархическим, попытка создания группы приведет к ошибке выполнения программы.

Лучшие практики и дополнительные проверки

Разберем, как сделать наше решение более надежным. Профессиональным подходом считается проверка на существование контрагента с таким же ИНН перед созданием нового. Это позволяет избежать дублирования данных в системе.

Проанализируем дополнение серверной логики поиском дублей:


&НаСервере
Функция НайтиДубльПоИНН(ИНН)
    Возврат Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
КонецФункции

Использование метода НайтиПоРеквизиту эффективно, если по данному реквизиту в конфигураторе установлен признак Индексировать. Это значительно ускорит работу поиска при большом количестве записей в справочнике.

Резюме

Мы проанализировали процесс создания вспомогательной обработки для работы со справочниками. Основные шаги включают:

  1. Проектирование структуры: определение типов реквизитов и настройка иерархии справочника.
  2. Разработка интерфейса: создание формы обработки и команд, привязка к подсистеме.
  3. Программная реализация: использование методов СоздатьЭлемент() и СоздатьГруппу() на сервере, обязательный вызов Записать() и возврат ссылки на клиент для открытия формы через ОткрытьФорму с параметром Ключ.

Соблюдение этих правил позволит вам создавать чистый, эффективный и отказоустойчивый код на платформе 1С:Предприятие 8.3.

← На главную