Как правильно настроить работу общего модуля для тонкого и толстого клиента при работе с формами

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

При разработке в среде 1С:Предприятие 8.3, особенно в крупных типовых решениях вроде УТ 11, ERP или КА, программисты часто сталкиваются с ситуацией, когда код, идеально работающий в Тонком клиенте, внезапно выдает ошибку «Переменная не определена» при запуске в Толстом клиенте. Это часто происходит при использовании вспомогательных инструментов, таких как «Инструменты разработчика», или при отладке специфических механизмов. Разберем детально, почему это происходит и как сделать ваш код универсальным.

Анализ проблемы: почему модуль «исчезает»

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

Общий модуль в 1С — это не просто хранилище процедур, это объект, который компилируется (собирается) системой только для тех сред, которые отмечены в его свойствах. Если у модуля стоит галочка только Клиент (управляемое приложение), то для Толстого клиента, запущенного в режиме Обычного приложения, этого модуля просто не существует. Система не видит его в глобальном контексте, отсюда и ошибка «Переменная не определена».

Шаг 1. Настройка свойств общего модуля

Первое, что мы должны сделать — это правильно расставить флаги компиляции в свойствах общего модуля. Посмотрим на основные варианты:

  1. Клиент (управляемое приложение) — модуль будет доступен в Тонком клиенте и в Толстом клиенте, если конфигурация запущена в управляемом режиме.
  2. Клиент (обычное приложение) — модуль станет доступен в Толстом клиенте, запущенном в режиме обычного приложения. Это именно тот флаг, которого часто не хватает при использовании внешних инструментов отладки.
  3. Толстый клиент (управляемое приложение) — специфический флаг, позволяющий коду работать только в толстом клиенте в режиме управляемого приложения.
  4. Сервер — модуль доступен на стороне сервера.

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

Шаг 2. Работа с контекстом управляемой формы

Рассмотрим программный код, который используется для передачи формы в общий модуль. Выясним, как правильно передавать контекст. На стороне формы код выглядит следующим образом:


&НаКлиенте
Процедура аситВыбранаСложнаяШирина(Элемент) 
    // Передаем контекст формы (ЭтаФорма) в общий модуль
    РаботыСФормамиКлиент.УстановитьЗначениеРеквизитаЕстьУточнение(ЭтаФорма);
КонецПроцедуры

В общем модуле РаботыСФормамиКлиент (у которого теперь стоят обе клиентские галочки) мы принимаем этот объект:


Процедура УстановитьЗначениеРеквизитаЕстьУточнение(ЭтаФорма) Экспорт
    // Устанавливаем значение реквизита формы
    ЭтаФорма.ЕстьУточнение = Истина;
КонецПроцедуры

Важно понимать: когда мы передаем ЭтаФорма из управляемого приложения, тип этого объекта — УправляемаяФорма. В Толстом клиенте (обычное приложение) управляемая форма «оборачивается» платформой таким образом, что доступ к её реквизитам через точку сохраняется. Однако, если мы начнем обращаться к специфическим элементам интерфейса, поведение может отличаться.

Шаг 3. Использование директив препроцессора

Иногда простого включения галочек недостаточно. Если внутри процедуры общего модуля должен выполняться код, специфичный только для одного из типов клиентов, нам необходимо использовать инструкции препроцессора. Проанализируем ситуацию, когда нам нужно выполнить разные действия в зависимости от среды:


Процедура УстановитьЗначениеРеквизитаЕстьУточнение(ЭтаФорма) Экспорт
    
    #Если ТонкийКлиент Тогда
        // Код, который исполнится только в тонком клиенте
        ЭтаФорма.ЕстьУточнение = Истина;
    #ИначеЕсли ТолстыйКлиентОбычноеПриложение Тогда
        // Код для толстого клиента в режиме обычного приложения
        // Например, если нужно вызвать специфическое окно или метод
        ЭтаФорма.ЕстьУточнение = Истина;
        Сообщить("Установка реквизита в обычном приложении");
    #КонецЕсли

КонецПроцедуры

Такой подход гарантирует, что модуль успешно скомпилируется в любой среде, даже если в одной из секций используется метод, физически отсутствующий в другом клиенте.

Шаг 4. Настройка режима запуска в Конфигураторе

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

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

  1. Откроем свойства конфигурации (правой кнопкой на корне дерева метаданных).
  2. Найдем свойство Основные режимы запуска.
  3. Убедимся, что установлены флаги, разрешающие использование управляемых форм в обычном приложении.

Также обратим внимание на радиокнопку в настройках отладки конфигуратора. Рассмотрим подробнее: если вы установите Основной режим запуска — Обычное приложение, то при нажатии F5 система всегда будет открываться в режиме толстого клиента. Для повседневной работы в УТ 11 лучше оставить Управляемое приложение, а для тестов в толстом клиенте использовать либо параметры запуска, либо настройки в меню «Сервис — Параметры».

Рекомендации по архитектуре

Согласно стандартам разработки 1С, рекомендуется разделять общие модули по их назначению. Посмотрим на правильную структуру именования:

Важный момент: если вы работаете с Инструментами разработчика (ИР), они часто форсируют запуск именно в режиме толстого клиента (обычное приложение). Это делается для получения прямого доступа к низкоуровневым объектам системы. Поэтому для всех ваших «клиентских» общих модулей, которые вы планируете вызывать во время отладки этими инструментами, включение флага Клиент (обычное приложение) является обязательным требованием.

Подведем итог: для корректной работы кода во всех режимах нам нужно обеспечить доступность контекста модуля через свойства (флаги компиляции) и, при необходимости, разделять специфичный код внутри процедур с помощью директив #Если. Это исключит ошибку «Переменная не определена» и сделает вашу разработку профессиональной и отказоустойчивой.

← На главную