Разработка и Конфигурация · 12 мин
Как программно создать контрагента в 1С
Как программно создать контрагента в 1С 8.3: заполнение реквизитов, запись через СправочникОбъект, проверка дублей, работа с БСП и типичные ошибки разработчиков.
Программное создание контрагента — типовая задача при обмене данными, загрузке прайсов, интеграции с сайтом или CRM. Вместо ручного ввода карточки разработчик создаёт объект справочника «Контрагенты» встроенным языком 1С, заполняет реквизиты и записывает его в информационную базу. Такой подход исключает ошибки оператора и позволяет обрабатывать сотни записей за секунды.
Конкретный код зависит от конфигурации. В «Управлении торговлей», «Комплексной автоматизации» и ERP справочник называется «Контрагенты», а реквизиты ИНН, КПП и наименование присутствуют почти всегда. В «Бухгалтерии предприятия» структура похожа, но часть данных (банковские счета, договоры) хранится в подчинённых справочниках. Ниже разобраны универсальные приёмы, которые работают в любой типовой конфигурации на платформе 8.3, и особенности библиотеки стандартных подсистем (БСП).
Прежде чем писать код, убедитесь, что у вас есть копия базы для экспериментов. Запись объектов обходом стандартных проверок способна создать дубли контрагентов или «битые» ссылки, которые потом придётся разбирать вручную. Все примеры из статьи сначала выполняйте на тестовой копии.
Базовый код создания контрагента
Минимальный сценарий состоит из трёх шагов: получить объект-заготовку, заполнить реквизиты, записать. Метод СоздатьЭлемент() возвращает объект типа СправочникОбъект, который ещё не существует в базе — у него нет ссылки до первой записи.
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = "ООО «Ромашка»";
НовыйКонтрагент.НаименованиеПолное = "Общество с ограниченной ответственностью «Ромашка»";
НовыйКонтрагент.ИНН = "7707083893";
НовыйКонтрагент.КПП = "770701001";
НовыйКонтрагент.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
НовыйКонтрагент.Записать();
Сообщить("Создан контрагент: " + НовыйКонтрагент.Ссылка);
Обратите внимание на три момента. Во-первых, имена реквизитов в вашей конфигурации могут отличаться — откройте справочник «Контрагенты» в конфигураторе и сверьте состав полей. Во-вторых, реквизиты перечислений заполняются через менеджер перечисления, а не строкой. В-третьих, после Записать() объект получает ссылку, которую можно использовать в документах и других справочниках.
Если контрагент должен попасть в конкретную папку, заполните реквизит Родитель ссылкой на группу. Группу можно найти по наименованию или создать аналогично через СоздатьГруппу().
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = "ООО «Ромашка»";
НовыйКонтрагент.ИНН = "7707083893";
НовыйКонтрагент.Записать();Проверка дублей перед созданием
Самая частая проблема при программной загрузке — дубли контрагентов. Один и тот же поставщик появляется в базе дважды, документы «расползаются» по разным карточкам, и сверка взаиморасчётов превращается в ручную работу. Поэтому перед созданием элемента всегда ищите существующего контрагента по ИНН (и КПП для юридических лиц).
Функция НайтиКонтрагентаПоИНН(ИНН, КПП = "")
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Контрагенты.Ссылка КАК Ссылка
|ИЗ
| Справочник.Контрагенты КАК Контрагенты
|ГДЕ
| Контрагенты.ИНН = &ИНН
| И Контрагенты.КПП = &КПП
| И НЕ Контрагенты.ПометкаУдаления";
Запрос.УстановитьПараметр("ИНН", ИНН);
Запрос.УстановитьПараметр("КПП", КПП);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат Неопределено;
КонецЕсли;
Возврат Результат.Выгрузить()[0].Ссылка;
КонецФункции
Если функция вернула ссылку — обновите существующую карточку (получив объект через Ссылка.ПолучитьОбъект()) или пропустите запись, в зависимости от логики загрузки. Создавать новый элемент стоит только когда поиск ничего не нашёл.
Учтите ограничение: поиск по ИНН не сработает, если в базе ИНН заполнен с пробелами, лишними символами или вовсе пуст. Для загрузок из внешних источников нормализуйте ИНН (уберите пробелы, проверьте длину — 10 цифр для юрлиц, 12 для ИП) до выполнения запроса.
Особенности конфигураций с БСП
В типовых решениях на библиотеке стандартных подсистем (БСП) часть логики вынесена в общие модули. Например, контактная информация (адреса, телефоны, email) хранится не в реквизитах справочника, а в табличной части «КонтактнаяИнформация» со служебными полями. Заполнять её напрямую строковыми значениями нельзя — используется программный интерфейс модуля УправлениеКонтактнойИнформацией.
// Добавление юридического адреса (пример для БСП)
СтрокаКИ = НовыйКонтрагент.КонтактнаяИнформация.Добавить();
СтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
СтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
СтрокаКИ.Представление = "115035, г. Москва, ул. Пятницкая, д. 1";
Точные имена предопределённых видов контактной информации зависят от версии конфигурации — проверьте их в справочнике «Виды контактной информации». В свежих версиях БСП поле «Значение» хранит адрес в формате JSON, и корректнее формировать его через методы модуля работы с адресами, а не вручную.
Также в типовых конфигурациях срабатывают подписки на события при записи: проверка ИНН по контрольной сумме, автозаполнение наименования, регистрация в планах обмена. Это работает «в плюс» — данные проходят стандартные проверки, — но замедляет массовую загрузку. При больших объёмах отключайте бизнес-логику обдуманно и только на время загрузки.
Создание связанных данных: договоры и банковские счета
Карточка контрагента без договора и счёта часто бесполезна: документы реализации и оплаты требуют эти данные. Договоры и банковские счета в типовых конфигурациях — подчинённые справочники, владельцем которых выступает контрагент.
// Банковский счёт
НовыйСчет = Справочники.БанковскиеСчета.СоздатьЭлемент();
НовыйСчет.Владелец = НовыйКонтрагент.Ссылка;
НовыйСчет.Наименование = "Основной счёт";
НовыйСчет.НомерСчета = "40702810100000000001";
НовыйСчет.Банк = БанкСсылка; // ссылка на элемент справочника «Банки»
НовыйСчет.Записать();
// Договор (имя справочника зависит от конфигурации)
НовыйДоговор = Справочники.ДоговорыКонтрагентов.СоздатьЭлемент();
НовыйДоговор.Владелец = НовыйКонтрагент.Ссылка;
НовыйДоговор.Наименование = "Основной договор";
НовыйДоговор.Записать();
Порядок записи принципиален: сначала записывается контрагент и получает ссылку, только после этого можно создавать подчинённые объекты. Если записать договор до контрагента, реквизит «Владелец» окажется пустым, и счёт «повиснет» без привязки.
В «Бухгалтерии 3.0» договор требует указания вида договора (с поставщиком, с покупателем) и организации. Без этих реквизитов объект запишется, но документы откажутся его подставлять. Сверяйте обязательные поля в конфигураторе: реквизиты с признаком «Проверка заполнения: Выдавать ошибку» должны быть заполнены до записи.
- 1Сделайте копию базы или откройте тестовую среду
- 2Проверьте дубль по ИНН и КПП запросом к справочнику
- 3Создайте элемент через СоздатьЭлемент() и заполните реквизиты
- 4При наличии БСП заполните контактную информацию штатным способом
- 5Выполните Записать() и убедитесь, что получена ссылка
- 6Создайте договор и банковский счёт с заполненным владельцем
- 7Откройте карточку в пользовательском режиме и проверьте заполнение
Транзакции и обработка ошибок при записи
При создании связанного комплекта (контрагент + договор + счёт) используйте транзакцию. Если на середине возникнет ошибка — например, не заполнен обязательный реквизит договора, — вся пачка откатится, и в базе не останется «осиротевшего» контрагента без обязательных данных.
НачатьТранзакцию();
Попытка
НовыйКонтрагент.Записать();
НовыйСчет.Записать();
НовыйДоговор.Записать();
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ЗаписьЖурналаРегистрации("Загрузка контрагентов",
УровеньЖурналаРегистрации.Ошибка, , ,
ОписаниеОшибки());
ВызватьИсключение;
КонецПопытки;
Ошибки записи обязательно фиксируйте в журнале регистрации или в собственном протоколе загрузки. Сообщение «пользователю» через Сообщить() при фоновой загрузке никто не увидит, и причина сбоя потеряется.
Отдельный случай — обмен данными. Если база участвует в синхронизации, программно созданный контрагент зарегистрируется к выгрузке автоматически. При загрузке из обмена, наоборот, установите Объект.ОбменДанными.Загрузка = Истина, чтобы не запускать проверки и подписки. Но помните: режим «Загрузка» отключает контроль заполнения, поэтому ответственность за целостность данных ложится на ваш код.
Проверка результата
После выполнения кода убедитесь, что контрагент действительно создан корректно. Быстрый способ — открыть список контрагентов в пользовательском режиме и найти карточку отбором по ИНН. Программная проверка надёжнее: запросом выберите элемент и проверьте ключевые реквизиты.
Обязательно откройте карточку интерактивно: подписки на события и обработчики формы иногда показывают проблемы, которые не видны при программной записи. Например, незаполненная контактная информация или неустановленный признак «Покупатель/Поставщик» влияют на доступность контрагента в документах.
Финальный тест — создать вручную тестовый документ (поступление или реализацию) с новым контрагентом и провести его. Если документ проводится, договор и счёт подставляются автоматически, а отчёты по взаиморасчётам видят задолженность — загрузка выполнена правильно.
Как проверить результат
Ссылка не пустая, элемент находится запросом по ИНН
Исключение при записи или пустая ссылка
Все реквизиты заполнены, адрес и телефон отображаются
Пустые поля, предупреждения о незаполненных данных
Документ проводится, договор подставляется автоматически
Документ не видит контрагента или требует заполнить договор вручную
По ИНН находится ровно один активный элемент
Два и более контрагента с одинаковым ИНН
FAQ
Можно ли создать контрагента через COM-соединение из другой базы 1С?
Да. Подключитесь через V83.COMConnector, получите менеджер справочника из внешнего соединения и используйте те же методы СоздатьЭлемент() и Записать(). Учтите, что перечисления и ссылки нужно получать через объект соединения, а не из текущей базы.
Как создать контрагента через HTTP-сервис или из внешней системы?
Публикуйте HTTP-сервис или используйте стандартный OData-интерфейс: POST-запрос к сущности Catalog_Контрагенты создаёт элемент без написания серверного кода. Для сложной логики (проверка дублей, создание договора) надёжнее собственный HTTP-сервис с описанным выше алгоритмом.
Почему Записать() выдаёт ошибку «Ошибка при вызове метода контекста»?
Чаще всего не заполнен обязательный реквизит или нарушен тип данных — например, строка присвоена реквизиту ссылочного типа. Текст подробной причины смотрите в описании ошибки внутри блока Попытка/Исключение и в журнале регистрации.
Нужно ли заполнять код контрагента вручную?
Нет, при записи код присваивается автоматически, если у справочника включена автонумерация. Вмешиваться в нумерацию не стоит: ручная установка кодов может нарушить последовательность и вызвать ошибки уникальности при обмене.
Как загрузить тысячу контрагентов из файла Excel или CSV?
Читайте файл построчно (через ТабличныйДокумент для Excel или текстовый разбор для CSV), для каждой строки выполняйте проверку дублей и создание элемента внутри общей транзакции или пачками по несколько сотен записей. Для разовой загрузки подойдёт типовая обработка «Загрузка данных из табличного документа», входящая во многие конфигурации.
Чем отличается создание контрагента в режиме «Загрузка = Истина»?
Режим ОбменДанными.Загрузка отключает проверки заполнения, бизнес-логику и подписки на события — запись выполняется быстрее, но без контроля корректности. Применяйте его только при загрузке проверенных данных из обмена, где целостность гарантирует источник.
Что важно запомнить
Контрагент создаётся через СоздатьЭлемент(), заполнение реквизитов и Записать(). Перед созданием проверяйте дубли по ИНН, в УТ 11 и ERP сначала создавайте партнёра, связанные договоры и счета записывайте после контрагента в одной транзакции. Весь код отлаживайте на копии базы, а результат проверяйте проведением тестового документа.