В типовых конфигурациях 1С:Предприятие, таких как 1С:ERP Управление предприятием, разработчики часто реализуют расширенные и кастомизированные механизмы для взаимодействия с пользователем, особенно при выборе справочных данных. Одним из таких примеров является механизм выбора единиц измерения или упаковок. Нередко возникает вопрос, как система управляет открытием определённой формы выбора, если она отличается от стандартной для справочника, и как затем происходит возврат выбранного значения в документ, если в нём не прописан явный обработчик.
Рассмотрим подробно этот процесс, разбирая логику вызова формы, механизм возврата выбранного значения и особенности отладки серверного кода.
ОбработкаПолученияФормыНаш вопрос начинается с того, что для справочника УпаковкиЕдиницыИзмерения в конфигураторе указана основная форма выбора ФормаВыбораУпаковки, но при выборе в документе, например, Заказ поставщику, открывается другая форма — ФормаВыбораИзДокументов. При этом у реквизита "Упаковка" в документе поле "Форма выбора" пустое, что означает использование стандартного механизма.
Ключевым моментом здесь является событие ОбработкаПолученияФормы, которое реализовано в модуле менеджера справочника. Это стандартная процедура платформы 1С:Предприятие, которая вызывается всякий раз, когда система пытается получить форму для объекта, будь то форма элемента, форма списка или форма выбора. Она предоставляет разработчику возможность переопределить стандартное поведение системы и указать, какую именно форму нужно открыть.
Давайте проанализируем, как это работает:
СправочникСсылка.УпаковкиЕдиницыИзмерения), платформа 1С перед тем, как открыть стандартную форму выбора, обращается к модулю менеджера соответствующего справочника.УпаковкиЕдиницыИзмерения существует процедура ОбработкаПолученияФормы, то система вызывает её. В эту процедуру передаются параметры, которые позволяют определить, какой вид формы запрашивается и какая форма будет выбрана.В нашем случае, в конфигурации 1С:ERP это выглядит следующим образом:
В модуле менеджера справочника УпаковкиЕдиницыИзмерения присутствует процедура:
Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
НоменклатураВызовСервера.УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка);
КонецПроцедуры
Мы видим, что эта процедура делегирует вызов в общий модуль НоменклатураВызовСервера, в процедуру УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы. Это распространённая практика в больших конфигурациях для централизации кода и обеспечения модульности.
В общем модуле НоменклатураВызовСервера, в процедуре УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы, вероятнее всего, содержится логика, которая анализирует входящие параметры (например, контекст вызова, если он передан) и принимает решение о том, какую форму открыть. Вот как это могло бы выглядеть внутри этой процедуры (точный код может отличаться, но принцип такой):
Процедура УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
// Если требуется открыть форму выбора
Если ВидФормы = "Выбора" Тогда
// Здесь может быть дополнительная логика по анализу Параметров,
// например, если форма вызывается из документа, то открыть одну форму,
// если из отчета – другую.
// В нашем случае, система, вероятно, всегда переопределяет форму выбора
// для упаковок, если она вызывается в контексте подбора в документ.
ВыбраннаяФорма = "Справочник.УпаковкиЕдиницыИзмерения.Форма.ФормаВыбораИзДокументов";
// Отменяем стандартную обработку, чтобы открылась наша форма
СтандартнаяОбработка = Ложь;
КонецЕсли;
// ... возможно, обработка других ВидФормы
КонецПроцедуры
Что это означает?
ВидФормы: Этот параметр указывает, какой вид формы запрашивается (например, "Элемента", "Списка", "Выбора"). В нашем случае, при интерактивном выборе из поля документа, это будет "Выбора".Параметры: Сюда могут быть переданы дополнительные параметры из контекста вызова. Например, если форма выбора вызывается из конкретного документа или для конкретной номенклатуры, эти данные могут быть переданы в параметрах и использованы для фильтрации или выбора нужной формы.ВыбраннаяФорма: Это ключевой параметр. Именно здесь мы программно указываем платформе, какую форму нужно открыть вместо стандартной. В нашем примере это Справочник.УпаковкиЕдиницыИзмерения.Форма.ФормаВыбораИзДокументов.СтандартнаяОбработка: Установка этого параметра в Ложь сообщает платформе, что мы сами позаботились о выборе формы, и ей не нужно открывать стандартную.Таким образом, даже если в свойствах реквизита "Упаковка" в документе форма выбора указана как "По умолчанию", а у самого справочника УпаковкиЕдиницыИзмерения основная форма выбора - ФормаВыбораУпаковки, срабатывание процедуры ОбработкаПолученияФормы в модуле менеджера позволяет переопределить это поведение и открыть ФормаВыбораИзДокументов.
ОповеститьОВыборе без явной ОбработкаВыбораВторой важный вопрос, который возникает: как выбранное значение возвращается в документ, если в его коде не прописана процедура ОбработкаВыбора? Это действительно может показаться "магическим" методом, но на самом деле это стандартное поведение платформы 1С:Предприятие для управляемых форм.
Рассмотрим по шагам, как это работает:
ОповеститьОВыборе в форме выбора: На форме Справочник.УпаковкиЕдиницыИзмерения.Форма.ФормаВыбораИзДокументов есть кнопка "Выбрать". При нажатии на эту кнопку выполняется код, который определяет выбранную строку и вызывает процедуру ОповеститьОВыборе().Вот пример кода из темы, который демонстрирует этот вызов:
&НаКлиенте
Процедура Выбрать(Команда)
..................
ВыбраннаяСтрокаДерева = УпаковкиЕдиницыИзмерения.НайтиПоИдентификатору(Элементы.УпаковкиЕдиницыИзмерения.ТекущаяСтрока);
..................
ОповеститьОВыборе(ВыбраннаяСтрокаДерева.Ссылка);
......................
КонецПроцедуры
Процедура ОповеститьОВыборе(Значение) предназначена для того, чтобы уведомить форму-владельца (ту, из которой была открыта текущая форма выбора) о том, что выбор был сделан, и передать ей выбранное значение.
ОбработкаВыбора, платформа 1С:Предприятие автоматически обрабатывает полученное оповещение и подставляет выбранное значение в это поле.Мы должны понимать, что для стандартных полей ввода, которые связаны с реквизитами ссылочных типов (справочниками, документами, перечислениями), платформа имеет встроенный механизм, который:
ОбработкаПолученияФормы.ОповеститьОВыборе и нет явного обработчика ОбработкаВыбора на форме-владельце.То есть, отсутствие явного кода вида:
&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
// Вставить содержимое обработчика.
Если ТипЗнч(ИсточникВыбора) = Тип("УправляемаяФорма") И ИсточникВыбора.ИмяФормы = "Справочник.УпаковкиЕдиницыИзмерения.Форма.ФормаВыбораДляДокументов" И ВыбранноеЗначение <> Неопределено Тогда
// ... ваш код обработки ...
КонецЕсли;
КонецПроцедуры
в модуле формы документа "Заказ поставщику" не является проблемой. Наоборот, это свидетельствует о том, что разработчики используют стандартный, встроенный в платформу механизм, который автоматически присваивает выбранное значение соответствующему реквизиту формы. Это упрощает разработку и снижает количество ручного кода.
Когда нужна процедура ОбработкаВыбора?
Процедура ОбработкаВыбора необходима только в тех случаях, когда после выбора значения нужно выполнить какие-либо дополнительные, нестандартные действия. Например:
В большинстве же случаев, когда требуется просто подставить выбранное значение в поле, платформа 1С делает это за нас автоматически, без необходимости писать собственный обработчик ОбработкаВыбора.
Автор темы столкнулся с проблемой, когда точки останова в процедурах ОбработкаПолученияФормы модуля менеджера и УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы общего модуля не срабатывали, а иногда и вовсе исчезали. Это распространённая ситуация при работе с серверными базами 1С:Предприятие, особенно в крупных конфигурациях типа ERP.
Рассмотрим основные причины и способы устранения проблем с отладкой серверного кода:
НаСервере или ВызовСервера) выполняется на сервере 1С:Предприятия. Отладка такого кода требует специальной настройки.%APPDATA%\1C\1CE\...\).Для успешной отладки серверного кода всегда следуйте следующим рекомендациям:
Понимание этих механизмов и особенностей отладки в 1С:Предприятии 8 помогает не только решить конкретную проблему с вызовом формы выбора единиц измерения, но и глубже разобраться в принципах работы типовых конфигураций и разрабатывать более эффективные и поддерживаемые собственные решения.