Почему ВыбранноеЗначение возвращает число вместо ссылки в обработчике ОбработкаВыбора и как это исправить?

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

При разработке в среде 1С:Предприятие 8.3 программисты нередко сталкиваются с ситуацией, когда стандартные и интуитивно понятные механизмы начинают вести себя непредсказуемо. Одной из таких проблем является поведение обработчика ОбработкаВыбора на форме-владельце. Вместо ожидаемой ссылки на элемент справочника или документ (тип ДокументСсылка или СправочникСсылка) в параметр ВыбранноеЗначение возвращается обычное число (например, 2, 10 или другой целочисленный идентификатор).

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

Выясняем причину: почему платформа возвращает число?

Для того чтобы понять природу этой ошибки, нам необходимо заглянуть во внутреннее устройство управляемых форм 1С, а именно — проанализировать поведение элемента управления Таблица, связанного с реквизитом типа ДинамическийСписок.

Когда мы открываем форму выбора (например, список документов реализации), данные отображаются с помощью динамического списка. У этого объекта в свойствах есть ключевой параметр — Основная таблица (например, Документ.РеализацияТоваровУслуг). Поведение платформы при интерактивном выборе строки зависит исключительно от этого свойства:

  1. Основная таблица заполнена: Платформа четко понимает, к какому объекту метаданных относятся строки списка. В этом случае при двойном клике по строке или нажатии кнопки «Выбрать» платформа автоматически извлекает значение из поля Ссылка текущей строки и передает его в форму-владелец. В обработчик ОбработкаВыбора прилетает полноценная ссылка.
  2. Основная таблица НЕ заполнена (пустая): Если свойство «Основная таблица» не указано, динамический список превращается в обычную выборку данных. Платформа теряет информацию о том, какое именно поле является ключевым (даже если поле Ссылка присутствует в запросе). В результате при выборе строки платформа возвращает не ссылку на объект базы данных, а внутренний идентификатор строки таблицы на клиенте, который имеет тип Число.

Причем здесь расширения конфигурации?

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

Рассмотрим подробнее три практических способа решения этой проблемы в зависимости от ваших задач.

Решение 1. Удаление неиспользуемой формы из расширения (Самый быстрый способ)

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

Для исправления ошибки выполните следующие шаги:

  1. Откройте конфигуратор вашей информационной базы и перейдите в окно работы с расширениями (Конфигурация -> Расширения конфигурации).
  2. Найдите форму выбора, которая возвращает некорректное значение (например, Документы.РеализацияТоваровУслуг.Формы.ФормаВыбора).
  3. Проверьте, внесены ли в эту форму изменения. Если форма чистая (в ней нет программного кода в модуле и не изменен визуальный интерфейс), просто нажмите клавишу Del и удалите её из расширения.
  4. Обновите конфигурацию базы данных.

После удаления формы из расширения платформа вернется к использованию стандартной формы выбора из основной конфигурации, где свойство «Основная таблица» настроено правильно. Проблема исчезнет.

Решение 2. Восстановление свойств динамического списка в расширении

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

Разберем этот процесс по шагам:

  1. Откройте заимствованную форму выбора в конфигураторе расширения.
  2. Перейдите на вкладку Реквизиты (в правой части редактора формы).
  3. Найдите основной реквизит формы, который отвечает за вывод списка документов. Обычно он называется Список и имеет тип ДинамическийСписок.
  4. Откройте палитру свойств этого реквизита (нажав кнопку F4).
  5. Найдите строку Основная таблица. Скорее всего, вы увидите там пустое значение.
  6. Нажмите на кнопку выбора и укажите нужную таблицу метаданных (например, Документ.РеализацияТоваровУслуг).
  7. Убедитесь, что флаг Динамическое считывание данных установлен, а в запросе динамического списка (если используется произвольный запрос) обязательно присутствует выборка поля Ссылка.
  8. Сохраните изменения и обновите конфигурацию базы данных.

Теперь динамический список в расширении будет корректно сопоставлять строки с физическими записями в базе данных и возвращать ссылку на объект.

Решение 3. Программный обход в форме выбора

Иногда возникают ситуации, когда разработчик вынужден намеренно очистить свойство «Основная таблица» у динамического списка. Например, это требуется, если в тексте произвольного запроса списка используется оператор объединения нескольких таблиц (ОБЪЕДИНИТЬ или UNION). При использовании объединений платформа на уровне стандартов разработки запрещает указывать основную таблицу для динамического списка.

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

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

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

&НаКлиенте
Функция СтруктураСвойства(Объект, ИмяСвойства)
    Возврат Объект.Свойство(ИмяСвойства);
КонецФункции

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

Резюме

Мы проанализировали неочевидную ошибку работы динамических списков в расширениях 1С и выяснили, что возврат числа вместо ссылки — это штатное поведение платформы в тех случаях, когда у динамического списка не заполнено свойство ОсновнаяТаблица. Использование предложенных нами методов позволит вам быстро диагностировать проблему и восстановить корректную работу обработчиков выбора в любых конфигурациях на платформе 1С:Предприятие 8.3.

← На главную