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