В процессе разработки на платформе «1С:Предприятие 8.3» в режиме управляемого приложения разработчики периодически сталкиваются с ситуацией, когда при вызове серверного метода из клиентского контекста точка останова отладчика не срабатывает, а сама функция возвращает значение Неопределено вместо ожидаемого результата. Разберем причинно-следственные связи этой проблемы и рассмотрим проверенные способы её устранения.
Рассмотрим сценарий, когда из внешней обработки или другой формы программно получается форма документа и затем вызывается экспортная клиентская процедура этой формы:
ПараметрыФормы = Новый Структура("Ключ", СсылкаДок);
Форма = ПолучитьФорму("Документ.УстановкаЦенНоменклатуры.Форма.ФормаДокумента", ПараметрыФормы);
Внутри этой формы находится клиентская процедура, которая выполняет вызов серверной функции для выполнения расчетов:
ДанныеДляРасчетаВычисляемыхЦенНаКлиенте = РассчитатьЦеныНаСервере(ПараметрыРасчета);
При выполнении этого кода возникают следующие признаки проблемы:
РассчитатьЦеныНаСервере, точка останова внутри неё не срабатывает.Неопределено, хотя логика функции предполагает возврат заполненной структуры.Проанализируем основные факторы, приводящие к подобному behavior платформы 1С:
rphost) может рассинхронизироваться с текущей конфигурацией базы данных. В результате клиентский сеанс вызывает одну версию метода, а сервер исполняет устаревший контекст или теряет точку входа.ПолучитьФорму() создает экземпляр формы в памяти, но не выполняет её полноценный жизненный цикл, который происходит при интерактивном вызове через ОткрытьФорму(). Если серверная функция обращается к реквизитам или контексту, который не был инициализирован, функция может аварийно завершаться или возвращать незаполненное значение.Разберем по шагам действия, которые помогают устранить данную проблему.
Как показывает практика, в большинстве случаев при сбоях кэша после динамического обновления помогает restart службы сервера «1С:Предприятие». Это сбрасывает устаревший серверный кэш метаданных во всех рабочих процессах rphost. Дополнительно рекомендуется очистить локальный кэш пользователя на клиентском компьютере.
Если код выполняется, но точка останова пролезает, необходимо убедиться, что служба сервера запущена с ключом отладки. Для Windows в реестре в параметрах службы 1C:Enterprise 8.3 Server Agent должен присутствовать ключ -debug или /debug. В конфигураторе следует проверить настройки через меню Отладка → Подключение... → Автоматическое подключение и убедиться, что флажок «Сервер» установлен.
Чтобы убедиться, что функция действительно вызывается, но падает из-за внутренней ошибки, обернем вызов в обработку ошибок:
Попытка
ДанныеДляРасчетаВычисляемыхЦенНаКлиенте = РассчитатьЦеныНаСервере(ПараметрыРасчета);
Исключение
ВызватьИсключение "Ошибка при вызове серверного расчета: " + ОписаниеОшибки();
КонецПопытки;
Вызывать экспортные процедуры и функции формы из других модулей через ПолучитьФорму() не является рекомендуемой практикой. Серверную бизнес-логику (например, расчет цен) следует выносить в модуль менеджера объекта или в специализированный общий модуль с установленным флагом Вызов сервера. Если функции не требуется контекст всей формы, её нужно объявлять с директивой &НаСервереБезКонтекста.