Как в 1С:ERP вызывается специфичная форма выбора единиц измерения и обрабатывается выбранное значение?

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

В типовых конфигурациях 1С:Предприятие, таких как 1С:ERP Управление предприятием, разработчики часто реализуют расширенные и кастомизированные механизмы для взаимодействия с пользователем, особенно при выборе справочных данных. Одним из таких примеров является механизм выбора единиц измерения или упаковок. Нередко возникает вопрос, как система управляет открытием определённой формы выбора, если она отличается от стандартной для справочника, и как затем происходит возврат выбранного значения в документ, если в нём не прописан явный обработчик.

Рассмотрим подробно этот процесс, разбирая логику вызова формы, механизм возврата выбранного значения и особенности отладки серверного кода.

1. Переопределение формы выбора через событие ОбработкаПолученияФормы

Наш вопрос начинается с того, что для справочника УпаковкиЕдиницыИзмерения в конфигураторе указана основная форма выбора ФормаВыбораУпаковки, но при выборе в документе, например, Заказ поставщику, открывается другая форма — ФормаВыбораИзДокументов. При этом у реквизита "Упаковка" в документе поле "Форма выбора" пустое, что означает использование стандартного механизма.

Ключевым моментом здесь является событие ОбработкаПолученияФормы, которое реализовано в модуле менеджера справочника. Это стандартная процедура платформы 1С:Предприятие, которая вызывается всякий раз, когда система пытается получить форму для объекта, будь то форма элемента, форма списка или форма выбора. Она предоставляет разработчику возможность переопределить стандартное поведение системы и указать, какую именно форму нужно открыть.

Давайте проанализируем, как это работает:

  1. Когда пользователь нажимает кнопку выбора или инициирует выбор значения для реквизита ссылочного типа (в нашем случае, реквизита типа СправочникСсылка.УпаковкиЕдиницыИзмерения), платформа 1С перед тем, как открыть стандартную форму выбора, обращается к модулю менеджера соответствующего справочника.
  2. Если в модуле менеджера справочника УпаковкиЕдиницыИзмерения существует процедура ОбработкаПолученияФормы, то система вызывает её. В эту процедуру передаются параметры, которые позволяют определить, какой вид формы запрашивается и какая форма будет выбрана.

В нашем случае, в конфигурации 1С:ERP это выглядит следующим образом:

В модуле менеджера справочника УпаковкиЕдиницыИзмерения присутствует процедура:


Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка)
    НоменклатураВызовСервера.УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка);
КонецПроцедуры

Мы видим, что эта процедура делегирует вызов в общий модуль НоменклатураВызовСервера, в процедуру УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы. Это распространённая практика в больших конфигурациях для централизации кода и обеспечения модульности.

В общем модуле НоменклатураВызовСервера, в процедуре УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы, вероятнее всего, содержится логика, которая анализирует входящие параметры (например, контекст вызова, если он передан) и принимает решение о том, какую форму открыть. Вот как это могло бы выглядеть внутри этой процедуры (точный код может отличаться, но принцип такой):


Процедура УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
    // Если требуется открыть форму выбора
    Если ВидФормы = "Выбора" Тогда
        // Здесь может быть дополнительная логика по анализу Параметров,
        // например, если форма вызывается из документа, то открыть одну форму,
        // если из отчета – другую.
        
        // В нашем случае, система, вероятно, всегда переопределяет форму выбора
        // для упаковок, если она вызывается в контексте подбора в документ.
        ВыбраннаяФорма = "Справочник.УпаковкиЕдиницыИзмерения.Форма.ФормаВыбораИзДокументов";
        
        // Отменяем стандартную обработку, чтобы открылась наша форма
        СтандартнаяОбработка = Ложь; 
    КонецЕсли;
    // ... возможно, обработка других ВидФормы
КонецПроцедуры

Что это означает?

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

Таким образом, даже если в свойствах реквизита "Упаковка" в документе форма выбора указана как "По умолчанию", а у самого справочника УпаковкиЕдиницыИзмерения основная форма выбора - ФормаВыбораУпаковки, срабатывание процедуры ОбработкаПолученияФормы в модуле менеджера позволяет переопределить это поведение и открыть ФормаВыбораИзДокументов.

2. Механизм возврата выбранного значения: ОповеститьОВыборе без явной ОбработкаВыбора

Второй важный вопрос, который возникает: как выбранное значение возвращается в документ, если в его коде не прописана процедура ОбработкаВыбора? Это действительно может показаться "магическим" методом, но на самом деле это стандартное поведение платформы 1С:Предприятие для управляемых форм.

Рассмотрим по шагам, как это работает:

  1. Вызов ОповеститьОВыборе в форме выбора: На форме Справочник.УпаковкиЕдиницыИзмерения.Форма.ФормаВыбораИзДокументов есть кнопка "Выбрать". При нажатии на эту кнопку выполняется код, который определяет выбранную строку и вызывает процедуру ОповеститьОВыборе().

Вот пример кода из темы, который демонстрирует этот вызов:


&НаКлиенте
Процедура Выбрать(Команда)
    ..................
    ВыбраннаяСтрокаДерева = УпаковкиЕдиницыИзмерения.НайтиПоИдентификатору(Элементы.УпаковкиЕдиницыИзмерения.ТекущаяСтрока);
    ..................
    ОповеститьОВыборе(ВыбраннаяСтрокаДерева.Ссылка);
    ......................
КонецПроцедуры

Процедура ОповеститьОВыборе(Значение) предназначена для того, чтобы уведомить форму-владельца (ту, из которой была открыта текущая форма выбора) о том, что выбор был сделан, и передать ей выбранное значение.

  1. Стандартная обработка оповещения платформой: Здесь кроется ключевая особенность. Если форма-владелец (в нашем случае, форма документа "Заказ поставщику") содержит поле ввода, из которого был инициирован выбор, и для этого поля ввода нет явного обработчика события ОбработкаВыбора, платформа 1С:Предприятие автоматически обрабатывает полученное оповещение и подставляет выбранное значение в это поле.

Мы должны понимать, что для стандартных полей ввода, которые связаны с реквизитами ссылочных типов (справочниками, документами, перечислениями), платформа имеет встроенный механизм, который:

То есть, отсутствие явного кода вида:


&НаКлиенте
Процедура ОбработкаВыбора(ВыбранноеЗначение, ИсточникВыбора)
    // Вставить содержимое обработчика.
    Если ТипЗнч(ИсточникВыбора) = Тип("УправляемаяФорма") И ИсточникВыбора.ИмяФормы = "Справочник.УпаковкиЕдиницыИзмерения.Форма.ФормаВыбораДляДокументов" И ВыбранноеЗначение <> Неопределено Тогда
        // ... ваш код обработки ...
    КонецЕсли;
КонецПроцедуры

в модуле формы документа "Заказ поставщику" не является проблемой. Наоборот, это свидетельствует о том, что разработчики используют стандартный, встроенный в платформу механизм, который автоматически присваивает выбранное значение соответствующему реквизиту формы. Это упрощает разработку и снижает количество ручного кода.

Когда нужна процедура ОбработкаВыбора?

Процедура ОбработкаВыбора необходима только в тех случаях, когда после выбора значения нужно выполнить какие-либо дополнительные, нестандартные действия. Например:

  1. Заполнить другие связанные поля формы на основе выбранного значения.
  2. Пересчитать какие-либо показатели после выбора.
  3. Выполнить дополнительную проверку или валидацию выбранного значения.
  4. Отменить стандартное присвоение значения (например, если значение должно быть обработано каким-то сложным образом перед присвоением).

В большинстве же случаев, когда требуется просто подставить выбранное значение в поле, платформа 1С делает это за нас автоматически, без необходимости писать собственный обработчик ОбработкаВыбора.

3. Особенности отладки серверного кода в 1С:ERP

Автор темы столкнулся с проблемой, когда точки останова в процедурах ОбработкаПолученияФормы модуля менеджера и УпаковкиЕдиницыИзмеренияОбработкаПолученияФормы общего модуля не срабатывали, а иногда и вовсе исчезали. Это распространённая ситуация при работе с серверными базами 1С:Предприятие, особенно в крупных конфигурациях типа ERP.

Рассмотрим основные причины и способы устранения проблем с отладкой серверного кода:

  1. Серверная база данных и клиент-серверное взаимодействие: ERP-системы, как правило, работают в клиент-серверном варианте. Это означает, что большая часть бизнес-логики (включая процедуры в модулях менеджеров и общих модулях с директивой НаСервере или ВызовСервера) выполняется на сервере 1С:Предприятия. Отладка такого кода требует специальной настройки.
  2. Подключение отладчика к серверному сеансу: Для отладки серверного кода необходимо, чтобы клиентское приложение было запущено в режиме отладки (обычно через F5 в конфигураторе), а отладчик был корректно подключен к соответствующему сеансу на сервере 1С:Предприятия.
    • Убедитесь, что в настройках отладки конфигуратора (Меню "Отладка" -> "Подключение") установлен флажок "Разрешить отладку на сервере" и выбраны нужные параметры подключения к кластеру серверов.
    • При запуске приложения через F5, платформа пытается подключить отладчик к серверным процессам. Иногда, если сеансов много или есть проблемы с доступом, подключение может не произойти или быть некорректным.
  3. Проблема с кэшем и версиями кода: Одна из наиболее частых причин несрабатывания точек останова – это несоответствие версий кода. Такое может произойти, если вы изменили код, но не обновили конфигурацию базы данных (или не выполнили обновление полностью), либо если существует кэш форм или модулей на клиенте/сервере, который не был очищен.
    • Обновите конфигурацию базы данных: После любых изменений кода в конфигураторе, обязательно обновляйте конфигурацию базы данных (F7).
    • Очистите кэш клиента: Иногда помогает очистка кэша клиентского приложения. Это можно сделать, удалив папку кэша для информационной базы (обычно находится в %APPDATA%\1C\1CE\...\).
    • Перезапустите рабочий процесс сервера 1С:Предприятия: В особо "упорных" случаях, когда кэш на сервере мешает, может потребоваться перезапуск рабочего процесса или даже всего сервера 1С:Предприятия (при наличии прав и согласовании с администратором).
  4. Точки останова "исчезают": Если точки останова, которые вы ставите, исчезают после закрытия и повторного открытия конфигуратора, это может указывать на то, что платформа не может найти соответствующий код при инициализации. Это также часто связано с проблемами кэша или с тем, что код находится в модуле, который не компилируется или не загружается при старте.

Для успешной отладки серверного кода всегда следуйте следующим рекомендациям:

  1. Запускайте клиентское приложение из конфигуратора через F5.
  2. Убедитесь, что отладчик подключился к серверному процессу. В окне "Подключение" (Меню "Отладка") должны отображаться активные сеансы, включая серверные.
  3. Ставьте точки останова в актуальной версии кода, после обновления конфигурации базы данных.
  4. Если отладка всё ещё не работает, попробуйте очистить кэш клиента и, если возможно, перезапустить серверный процесс 1С.

Понимание этих механизмов и особенностей отладки в 1С:Предприятии 8 помогает не только решить конкретную проблему с вызовом формы выбора единиц измерения, но и глубже разобраться в принципах работы типовых конфигураций и разрабатывать более эффективные и поддерживаемые собственные решения.

← На главную