Почему программно заполненный контрагент в Заказе клиента не отображается на форме в 1С:УТ 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Рассмотрим весьма распространенную ситуацию при разработке интеграций с внешними CRM-системами на базе 1С:Предприятие 8.3 (на примере конфигурации «Управление торговлей 11.4»). Мы собираем данные из CRM, находим или создаем контрагента по ИНН и программно подставляем его в существующий заказ. В отладчике мы четко видим, что реквизит заполнен, объект документа успешно записывается. Но как только мы открываем этот заказ в интерактивном режиме (пользовательском интерфейсе), мы видим, что поле «Контрагент» пустое. Проанализируем, почему так происходит и в какую сторону копать для успешного решения проблемы.

Анализ исходного кода и явных ошибок

Давайте посмотрим на исходный код функции, которая осуществляет поиск и привязку контрагента:


Процедура СоздатьЗаказ(ТаблицаСделок, Настройки,WinHttp)
    Для Каждого Сделка Из ТаблицаСделок Цикл
        // ... инициализация ...
        Контрагент = СоздатьИлиНайтиКонтрагентаПартнера(ДанныеКомпании);
        Если Сделка.СтатусЗаказа = "На согласовании" Тогда
            Заказ = Документы.ЗаказКлиента.НайтиПоРеквизиту("ЭС_ИдАМО",Сделка.ИдСделки);
            Если ЗначениеЗаполнено(Заказ) Тогда
                Заказ = Заказ.Ссылка.ПолучитьОбъект();
                Заказ.Контрагент = Контрагент;
                Заказ.Партнер = Контрагент.Партнер;
                Заказ.Договор = НайтиСоздатьДоговорКонтрагента(Контрагент,Настройки.Организация);
                Заказ.Записать();
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Функция СоздатьИлиНайтиКонтрагентаПартнера (ДанныеКомпании)
    Для Каждого Данные Из ДанныеКомпании Цикл
        Для Каждого Компания Из Данные.ДанныеКомпании Цикл
            Контрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",Компания.ИНН);
            Если ЗначениеЗаполнено(Контрагент) Тогда
                Контрагент = Контрагент.Ссылка.ПолучитьОбъект();
                Контрагент.ЭС_ИдАМО = Компания.ИдКомпании;
                Контрагент.Записать();
                Контрагент = Контрагент.Ссылка;
                Возврат Контрагент;
            Иначе
                Партнер    = Справочники.Партнеры.СоздатьЭлемент();
                Партнер.БизнесРегион = Компания. // <-- Синтаксическая ошибка и обрыв
                Контрагент     = Справочники.Контрагенты.СоздатьЭлемент();
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
КонецФункции

Разберем по шагам, какие проблемы скрываются в этом коде, из-за которых данные могут теряться.

1. Незавершенная ветка создания объектов

В функции СоздатьИлиНайтиКонтрагентаПартнера мы видим блок Иначе, который должен отрабатывать, если контрагент не найден. В этом блоке элементы справочников инициализируются через Справочники.Партнеры.СоздатьЭлемент(), но далее код обрывается на незавершенной строке (Партнер.БизнесРегион = Компания.).

Более того, в этой ветке отсутствуют вызовы метода Записать() для созданных объектов и отсутствует оператор Возврат. Это означает, что если контрагент новый, функция отработает некорректно и вернет Неопределено. В результате в документе реквизитам будет присвоено пустое значение.

2. Присвоение ссылок и объектов

Обратим внимание на работу с типами данных. В реквизиты документа (такие как Заказ.Контрагент) необходимо передавать ссылку на элемент справочника, а не сам объект. В исправленном варианте кода автор делает Контрагент = Контрагент.Ссылка; Возврат Контрагент;. Всегда проверяйте, что функции поиска и создания возвращают именно тип СправочникСсылка, иначе при записи документа возникнет ошибка несоответствия типов, или поле запишется некорректно.

3. Специфика УТ 11: Связка Партнер — Контрагент

В конфигурации 1С:УТ 11 используется раздельный учет: управленческий (справочник Партнеры) и регламентированный (справочник Контрагенты). Это накладывает строгие ограничения на логику заполнения документов.

В строке Заказ.Партнер = Контрагент.Партнер; кроется большая опасность. Если в вашей базе включена независимая связь партнеров и контрагентов, реквизит Партнер в самой карточке контрагента может быть попросту не заполнен. Если Контрагент.Партнер пуст, то и Заказ.Партнер обнуляется. При открытии формы заказа, где первичным клиентом выступает именно Партнер, пустой партнер приведет к тому, что форма скроет или очистит поле "Контрагент".

4. Скрытая очистка данных в модуле формы документа

Даже если программно документ записан идеально, УТ 11 имеет сложную внутреннюю логику. Когда пользователь интерактивно открывает Заказ клиента, срабатывают стандартные обработчики, в частности ПриЧтенииНаСервере и ПриСозданииНаСервере. В них платформа прогоняет загруженные данные через механизмы проверки консистентности.

Выясним причину очистки: в УТ 11 огромную роль играет реквизит Соглашение. Связка реквизитов должна быть строго выверена: Организация — Соглашение — Партнер — Контрагент — Договор.

  1. Если текущее Соглашение в заказе настроено на конкретного партнера, а вы программно подставили другого контрагента/партнера, форма обнаружит противоречие.
  2. Алгоритмы УТ 11 попытаются привести данные в порядок. Как правило, форма считает Соглашение (или Организацию) "базовыми" реквизитами, и если новый контрагент не подходит под их условия, поле Контрагент принудительно очищается прямо при открытии документа.
  3. Также проверяйте соответствие валют и организаций в подставляемом Договоре.

Итоговый чек-лист для исправления

Чтобы избежать подобных проблем с "исчезающими" реквизитами, проанализируем ситуацию и выполним следующие шаги:

  1. Проверьте логику создания: Убедитесь, что ветка Иначе полностью дописана, новые партнер и контрагент заполняются обязательными реквизитами, успешно сохраняются через Записать() и функция гарантированно возвращает ссылку (Возврат Контрагент.Ссылка;).
  2. Контролируйте заполнение Партнера: Перед тем как писать Заказ.Партнер = Контрагент.Партнер;, добавьте проверку ЗначениеЗаполнено(Контрагент.Партнер). Если партнер пуст, его нужно либо найти по ИНН/наименованию отдельно, либо создать.
  3. Обеспечьте консистентность аналитики УТ 11: При программном изменении контрагента убедитесь, что подставляемый Партнер, Контрагент и Договор не вступают в конфликт с уже указанными в заказе Организацией и Соглашением. При необходимости, программно очищайте Соглашение или подбирайте новое, чтобы при открытии формы 1С не "забраковала" ваши изменения.

Соблюдение этих правил позволит корректно интегрировать данные CRM в 1С:УТ 11, избегая неожиданного поведения управляемых форм при чтении документов.

← На главную