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