При разработке внешних обработок для импорта данных (например, из XML-файлов или сторонних систем) часто возникает задача программного создания элементов справочника Контрагенты. Одной из ключевых сложностей для начинающих разработчиков является установка типа контрагента: юридическое или физическое лицо. По умолчанию система часто подставляет значение "Юридическое лицо", и попытка изменить это через "список выбора" на форме является ошибочным путем. Разберем, как правильно решить эту задачу на уровне программного кода, не привязываясь к интерактивным действиям пользователя.
Первый и самый очевидный способ — это прямое обращение к реквизиту создаваемого объекта. В большинстве типовых конфигураций 1С (таких как Бухгалтерия предприятия 3.0, УТ 11, ERP) за тип контрагента отвечает реквизит ЮридическоеФизическоеЛицо. Он имеет тип перечисления.
Рассмотрим пример кода, который создает нового контрагента и назначает ему тип "Физическое лицо":
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
// Устанавливаем тип лица
НовыйКонтрагент.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо;
// Заполняем остальные данные
НовыйКонтрагент.Наименование = "Иванов Иван Иванович";
НовыйКонтрагент.НаименованиеПолное = "Иванов Иван Иванович";
НовыйКонтрагент.ИНН = "123456789012"; // Для физлиц ИНН состоит из 12 цифр
Попытка
НовыйКонтрагент.Записать();
Сообщить("Контрагент успешно создан: " + НовыйКонтрагент.Ссылка);
Исключение
Сообщить("Ошибка при записи: " + ОписаниеОшибки());
КонецПопытки;
Проанализируем этот подход. Он отлично подходит для простых задач, однако стоит учитывать, что в современных конфигурациях при интерактивном изменении типа лица на форме могут срабатывать дополнительные механизмы заполнения. При прямой записи через СоздатьЭлемент() эти механизмы (обработчики событий формы) не работают.
Более профессиональный и надежный способ, особенно для конфигураций на базе БСП (Библиотеки стандартных подсистем), — использование метода Заполнить(). Этот метод вызывает процедуру ОбработкаЗаполнения в модуле объекта справочника. Рассмотрим, как передать структуру данных для автоматического заполнения всех связанных полей.
Выясним, как это реализовать на практике:
// Подготовим структуру с данными
ДанныеЗаполнения = Новый Структура;
ДанныеЗаполнения.Вставить("ЮридическоеФизическоеЛицо", Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо);
ДанныеЗаполнения.Вставить("Наименование", "Петров Петр Петрович");
ДанныеЗаполнения.Вставить("ИНН", "987654321098");
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
// Вызываем стандартную логику заполнения конфигурации
НовыйКонтрагент.Заполнить(ДанныеЗаполнения);
// После вызова Заполнить можно дозаполнить специфические реквизиты
НовыйКонтрагент.Записать();
Важное преимущество: использование метода Заполнить() позволяет платформе автоматически установить значения по умолчанию, характерные именно для физического лица (например, счета учета или специфические признаки в учетной политике), которые прописаны разработчиками конфигурации в модуле объекта.
Проанализируем ситуацию с разделением сущностей в комплексных системах, таких как 1С:Управление торговлей 11 или 1С:ERP. В этих программах концепция контрагента тесно связана со справочником Партнеры.
ФизическиеЛица. Реквизит контрагента будет ссылаться на эту запись для хранения персональных данных.Если ваша задача состоит не в автоматической загрузке 300 контрагентов, а в том, чтобы помочь пользователю нажать кнопку во внешней обработке и увидеть готовую, предзаполненную форму создания физического лица, используйте параметры открытия формы. В этом случае "стучаться" в список выбора на форме не нужно — форма сама примет нужный вид при открытии.
Посмотрим на пример открытия формы объекта из внешней обработки:
ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("ЮридическоеФизическоеЛицо", Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ЗначенияЗаполнения", ПараметрыЗаполнения);
ОткрытьФорму("Справочник.Контрагенты.ФормаОбъекта", ПараметрыФормы);
При таком подходе пользователь увидит новую карточку контрагента, где тип "Физическое лицо" уже выбран, а соответствующие поля (например, ФИО вместо краткого наименования) уже отображены на экране.
Разберем по шагам алгоритм безопасной загрузки данных из внешнего файла:
НачатьТранзакцию() / ЗафиксироватьТранзакцию()), чтобы избежать частичного появления некорректных данных в базе при возникновении ошибки в середине файла.Таким образом, для программного выбора вида контрагента достаточно использовать возможности объектной модели 1С, игнорируя визуальные элементы управления формой. Это делает код более стабильным и независимым от изменений интерфейса конфигурации.