Где определяются параметры выбора при добавлении сотрудника в документ и как исправить ошибку?

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

В процессе разработки на платформе 1С:Предприятие 8.3 (управляемые формы) часто возникает ситуация, когда при попытке выбора элемента справочника (например, Сотрудники) открывается форма выбора, но сразу после открытия система выдает ошибку. Чаще всего проблема локализуется в процедуре ПриСозданииНаСервере формы справочника, куда передаются некорректные параметры. Разберемся детально, где именно могут определяться эти параметры и как их найти.

Анализ свойств реквизита в метаданных

Прежде чем приступать к написанию кода, проанализируем настройки самого объекта в конфигураторе. Платформа 1С предоставляет мощные инструменты для автоматического формирования параметров выбора без использования программного кода. Выясним, не заданы ли ограничения именно там.

  1. Связи параметров выбора (ChoiceParameterLinks): Это первое место, которое стоит проверить. Откроем документ, в котором возникает ошибка, найдем нужный реквизит и перейдем в его свойства. В строке Связи параметров выбора часто настраивается зависимость, например, сотрудника от организации. Если в документе не заполнено поле Организация, платформа может передать пустое значение или значение неверного типа в форму выбора сотрудника. В процедуре ПриСозданииНаСервере формы справочника код может пытаться обработать эту связь и вызвать исключение, если данные некорректны.
  2. Параметры выбора (ChoiceParameters): Здесь могут быть заданы статические фильтры. Например, Отбор.ВАрхиве(Ложь). Если форма справочника ожидает определенную структуру отбора, а в свойствах реквизита документа задано противоречивое условие, это приведет к ошибке при инициализации формы.

Программное формирование параметров в модуле формы документа

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

Найдем элемент формы, соответствующий нашему реквизиту, и проверим наличие обработчика события НачалоВыбора. В этом обработчике разработчики часто создают структуру ПараметрыВыбора и передают её в функцию ОткрытьФорму. Проанализируем типичный пример кода:


&НаКлиенте
Процедура СотрудникНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь; // Отключаем стандартное открытие
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("Отбор", Новый Структура("ГоловнаяОрганизация", Объект.Организация));
    ПараметрыФормы.Вставить("ПоказыватьДоговорников", Истина);
    
    ОткрытьФорму("Справочник.Сотрудники.ФормаВыбора", ПараметрыФормы, Элемент);
    
КонецПроцедуры

Выясним причину ошибки в таком коде: если Объект.Организация имеет тип, отличный от того, который ожидает справочник (например, массив вместо ссылки), процедура ПриСозданииНаСервере в справочнике Сотрудники выдаст ошибку при попытке применить этот отбор к динамическому списку.

Исследование процедуры ПриСозданииНаСервере в форме справочника

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

В процедуре ПриСозданииНаСервере всегда доступен объект Параметры. Это фиксированная структура, содержащая все данные, переданные при открытии. Посмотрим, как обычно выглядит обработка параметров в сложных конфигурациях (например, ЗУП 3.1 или ERP):


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем наличие конкретного параметра
    Если Параметры.Свойство("КлючНазначенияИспользования") Тогда
        // Логика настройки формы в зависимости от ключа
    КонецЕсли;
    
    // Если параметр передан с неправильным типом, следующая строка может вызвать ошибку:
    Если Параметры.Отбор.Свойство("Организация") Тогда
        // Действия по фильтрации
    КонецЕсли;

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

Важный момент: если ошибка звучит как «Поле объекта не обнаружено (Отбор)», значит, в коде идет обращение к Параметры.Отбор, но структура отбора не была передана вовсе. Проанализируем это с помощью отладчика, установив точку останова в самой первой строке процедуры.

Использование механизмов БСП (Библиотеки стандартных подсистем)

В современных типовых конфигурациях выбор сотрудников редко ограничивается простым открытием формы. Часто используются общие модули БСП. Если вы не нашли явного кода в НачалоВыбора, проверьте, не вызываются ли там функции глобальных модулей, таких как СотрудникиФормы.ПриНачалеВыбора или ПодборСотрудников.СформироватьПараметры.

В этом случае параметры могут динамически дополняться в зависимости от:

Методика поиска ошибки через отладчик

Рассмотрим пошагово, как эффективно найти «виновника» некорректных параметров:

  1. Включаем отладку: Запускаем сеанс в режиме отладки.
  2. Точка останова в документе: Ставим точку в процедуре НачалоВыбора (если она есть). Если её нет, переходим к следующему шагу.
  3. Стек вызовов: Когда ошибка возникла, не нажимайте сразу «Завершить работу». Откройте Стек вызовов. Несмотря на то что автор темы утверждает, что там только справочник, внимательно изучите нижние уровни стека. Если форма открывается программно, там обязательно будет зафиксирован момент вызова ОткрытьФорму.
  4. Замер производительности: Если стек не помогает, включите Замер производительности перед моментом нажатия на кнопку выбора. После возникновения ошибки остановите замер. В списке выполненных строк кода вы увидите все процедуры, которые выполнялись перед открытием формы справочника. Это позволит найти скрытые вызовы в общих модулях.

Особенности справочника «Сотрудники»

Проанализируем ситуацию, специфичную для сложных кадровых систем. Форма выбора сотрудников часто является «умной». Она может ожидать параметр КлючНазначенияИспользования. Если этот ключ передан, форма меняет свой состав колонок или логику отбора «на лету». Ошибка в ПриСозданииНаСервере часто случается, когда код формы пытается обратиться к реквизитам, которые доступны только для определенного ключа, но сам ключ был передан неверно или отсутствует.

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

Таким образом, для решения проблемы необходимо последовательно проверить свойства метаданных (связи параметров), программный код события выбора в документе и механизмы БСП, используя отладчик для мониторинга содержимого структуры Параметры.

← На главную