При переходе с «1С:Управление производственным предприятием» на современные конфигурации, такие как «1С:Комплексная автоматизация 2» (КА 2) или «1С:ERP Управление предприятием», программисты часто сталкиваются с тем, что привычный код создания контрагента перестает работать должным образом. Контрагенты либо не создаются, либо создаются «пустыми» и не отображаются в списках. Разберем по шагам, почему это происходит и как правильно написать код для корректного занесения данных.
Проанализируем типичную ошибку в структуре кода. Часто программисты помещают метод Записать() внутрь условий, из-за чего для определенных типов лиц (например, юридических) запись просто не вызывается. Также важно понимать, что в КА 2 недостаточно просто присвоить значения полям ИНН и КПП.
Рассмотрим пример кода, который требует исправления:
Если результат.Пустой() Тогда
СоздаюНовогоКонтрагента = Справочники.Контрагенты.СоздатьЭлемент();
СоздаюНовогоКонтрагента.Наименование = ТекущийКонтрагент;
// ... заполнение реквизитов ...
КонецЕсли;
Если ЮФЛ = "Юридическое лицо" Тогда
СоздаюНовогоКонтрагента.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
Иначе
СоздаюНовогоКонтрагента.Записать(); // ОШИБКА: Запись происходит только для ФизЛиц!
КонецЕсли;
Решение: Метод Записать() должен всегда находиться вне условий заполнения реквизитов, чтобы объект сохранялся в базе данных независимо от того, является он юридическим или физическим лицом.
Это ключевая архитектурная особенность КА 2 и ERP. В этих системах разделены управленческий и регламентированный учет:
Выясним причину, почему контрагент кажется «пустым» или не виден. В большинстве форм списков в КА 2 отображение строится на основе справочника Партнеры. Если вы создали контрагента, но не создали и не привязали к нему Партнера, система может не выводить такую запись в подборах и списках. Даже если в настройках программы включено «Использовать партнеров и контрагентов совместно», технически это все равно два разных элемента разных справочников.
Перед созданием контрагента нам необходимо создать (или найти существующего) партнера. Рассмотрим пример кода:
НовыйПартнер = Справочники.Партнеры.СоздатьЭлемент();
НовыйПартнер.Наименование = "Название организации";
НовыйПартнер.НаименованиеПолное = "Полное наименование организации";
НовыйПартнер.Клиент = Истина; // Если это покупатель
НовыйПартнер.Поставщик = Истина; // Если это поставщик
НовыйПартнер.ЮрФизЛицо = Перечисления.ЮрФизЛицо.ЮрЛицо;
НовыйПартнер.Записать();
СсылкаНаПартнера = НовыйПартнер.Ссылка;
Теперь, когда у нас есть ссылка на партнера, мы можем создать контрагента. Обратите внимание на обязательный реквизит ГоловнойКонтрагент. Проанализируем ситуацию: если контрагент не является филиалом, он сам является для себя головной организацией. Но при создании нового объекта ссылки еще не существует.
Разберем алгоритм решения этой задачи:
ГоловнойКонтрагент = Объект.Ссылка.Пример правильной реализации:
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.Наименование = "ООО Ромашка";
НовыйКонтрагент.НаименованиеПолное = "Общество с ограниченной ответственностью Ромашка";
НовыйКонтрагент.Партнер = СсылкаНаПартнера; // Привязка к созданному ранее партнеру
НовыйКонтрагент.ИНН = "7700000000";
НовыйКонтрагент.КПП = "770001001";
НовыйКонтрагент.СтранаРегистрации = Справочники.СтраныМира.Россия;
НовыйКонтрагент.ЮридическоеФизическоеЛицо = Перечисления.ЮридическоеФизическоеЛицо.ЮридическоеЛицо;
// Первая запись для получения ссылки
НовыйКонтрагент.Записать();
// Установка головного контрагента (ссылка на самого себя)
НовыйКонтрагент.ГоловнойКонтрагент = НовыйКонтрагент.Ссылка;
НовыйКонтрагент.Записать();
Если вы выполняете массовый импорт данных из внешнего источника (например, из Excel), полезно использовать свойство ОбменДанными.Загрузка = Истина. Это отключит лишние проверки в модуле объекта и ускорит запись. Однако помните, что в этом случае вам придется заполнять абсолютно все обязательные реквизиты вручную, так как стандартные механизмы автозаполнения не сработают.
НовыйКонтрагент = Справочники.Контрагенты.СоздатьЭлемент();
НовыйКонтрагент.ОбменДанными.Загрузка = Истина;
// ... заполнение ...
НовыйКонтрагент.Записать();
В современных конфигурациях адреса и телефоны не являются простыми строковыми реквизитами. Они хранятся в табличной части КонтактнаяИнформация. Если вы хотите, чтобы в карточке контрагента отображался юридический адрес, необходимо добавить строку в эту табличную часть, указав правильный Тип и Вид контактной информации.
Посмотрим на пример добавления адреса:
НоваяСтрокаКИ = НовыйКонтрагент.КонтактнаяИнформация.Добавить();
НоваяСтрокаКИ.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
НоваяСтрокаКИ.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента;
НоваяСтрокаКИ.Представление = "г. Москва, ул. Ленина, д. 1";
Для минимизации ошибок рекомендуется использовать процедуры из общих модулей, которые уже написаны разработчиками фирмы «1С». Например, в модуле КонтрагентыСлужебный или ПартнерыИКонтрагенты существуют функции для корректного заполнения реквизитов. Это позволяет избежать проблем с заполнением дублирующих реквизитов (например, ЮрФизЛицо и ЮридическоеФизическоеЛицо), которые могут использоваться системой для разных целей (отчетность vs интерфейс).
Подведем итог: для успешного создания контрагента в КА 2/ERP обязательно обеспечьте наличие Партнера, корректно заполните Головного контрагента через повторную запись и не забывайте про привязку Контактной информации в табличную часть объекта.