Разберем типичную ситуацию, с которой сталкиваются многие разработчики при переносе или копировании рабочей базы «1С:Предприятие 8» на локальный компьютер. Сценарий следующий: вы копируете информационную базу, запускаете её под тем же пользователем, открываете форму, и внезапно система выдает ошибки компиляции или выполнения, утверждая, что базовые глобальные переменные, такие как РегистрыСведений или ПараметрыСеанса, не определены. При этом на «живой» базе всё функционирует без нареканий. Проанализируем, почему это происходит и как правильно исправить ситуацию.
Для начала рассмотрим фрагмент кода, который вызывает сбой. Ошибка возникает в процедуре с директивой компиляции &НаКлиенте:
&НаКлиенте
Процедура СписокВыполненияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// ...
Рег = РегистрыСведений.ВыполенияЗаданий.Получить(Новый Структура("Клиент,Задание,КоммерческоеПредложение",ВыбраннаяСтрока.Клиент,ВыбраннаяСтрока.Задание,ВыбраннаяСтрока.КоммерческоеПредложение));
// ...
Если ПараметрыСеанса.ТекущийПользователь.ИспользоватьКомплекснуюФормуКлиента3в1 = Истина Тогда
// ...
КонецЕсли;
КонецПроцедуры
Текст ошибки четко указывает на проблему: {...}: Переменная не определена (РегистрыСведений) и {...}: Переменная не определена (ПараметрыСеанса). С точки зрения платформы 1С это означает, что в текущем контексте выполнения данных объектов просто не существует.
Основная причина кроется в архитектуре управляемого приложения. В системе «1С:Предприятие 8» существует несколько типов клиентских приложений, и доступ к программным объектам в них существенно различается:
РегистрыСведений, Справочники, Документы) и к ПараметрыСеанса. Попытка обратиться к ним напрямую в процедуре &НаКлиенте вызовет ошибку.Проанализируем ситуацию: на рабочей базе пользователи, скорее всего, работают в режиме Толстого клиента. Это может быть настроено в свойствах информационной базы в окне запуска или в настройках самого пользователя. Когда вы скопировали базу к себе, настройки запуска по умолчанию могли сброситься на «Выбирать автоматически», и платформа запустила Тонкий клиент, который «не знает» о существовании РегистрыСведений в клиентском контексте.
Если вам нужно срочно запустить базу и вы не планируете сейчас переписывать код, выполните следующие шаги:
Хотя первый способ решает проблему «здесь и сейчас», использование Толстого клиента в управляемых формах считается плохой практикой (антипаттерном). Правильный подход — это разделение логики на клиентскую и серверную. Рассмотрим, как переписать проблемный участок кода, чтобы он работал в Тонком клиенте.
Для получения данных из регистра нам необходимо создать отдельную функцию на сервере. Проанализируем пример трансформации кода:
&НаКлиенте
Процедура СписокВыполненияВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Вызов серверной функции для получения данных
ДанныеРегистра = ПолучитьДанныеВыполненияНаСервере(ВыбраннаяСтрока);
Если ДанныеРегистра.Выполнено Или ДанныеРегистра.Завершено Тогда
// ... логика с вопросом пользователю ...
КонецЕсли;
// Получение настройки пользователя через сервер
ИспользоватьКомплекснуюФорму = ПолучитьНастройкуПользователяНаСервере();
Если ИспользоватьКомплекснуюФорму Тогда
// ... открытие формы ...
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьДанныеВыполненияНаСервере(КлючЗаписи)
// На сервере нам доступны РегистрыСведений
СтруктураПоиска = Новый Структура("Клиент, Задание, КоммерческоеПредложение",
КлючЗаписи.Клиент, КлючЗаписи.Задание, КлючЗаписи.КоммерческоеПредложение);
Возврат РегистрыСведений.ВыполенияЗаданий.Получить(СтруктураПоиска);
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьНастройкуПользователяНаСервере()
// На сервере нам доступны ПараметрыСеанса
Возврат ПараметрыСеанса.ТекущийПользователь.ИспользоватьКомплекснуюФормуКлиента3в1;
КонецФункции
В данном примере мы использовали директиву &НаСервереБезКонтекста. Это наиболее эффективный способ, так как он не передает данные всей формы на сервер, что ускоряет работу программы.
Рассмотрим несколько причин, по которым стоит потратить время на рефакторинг:
Ситуация, когда код работает на одной базе и не работает на другой, почти всегда связана с разницей в типах клиентского приложения. Проверьте настройки запуска в окне выбора баз. Если там стоит «Тонкий клиент», то использование РегистрыСведений и ПараметрыСеанса в процедурах &НаКлиенте запрещено. Перенесите логику получения данных в серверные функции, и ваше приложение станет стабильным, быстрым и готовым к работе в любых условиях.