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