При разработке в среде 1С:Предприятие 8.3 программисты нередко сталкиваются с ситуацией, когда стандартные и интуитивно понятные механизмы начинают вести себя непредсказуемо. Одной из таких проблем является поведение обработчика ОбработкаВыбора на форме-владельце. Вместо ожидаемой ссылки на элемент справочника или документ (тип ДокументСсылка или СправочникСсылка) в параметр ВыбранноеЗначение возвращается обычное число (например, 2, 10 или другой целочисленный идентификатор).
Особенно часто эта проблема проявляется при использовании расширений конфигурации: на чистой базе без расширений код работает корректно, а после подключения расширения логика выбора ломается. В этой статье мы подробно разберем, почему платформа возвращает числовой идентификатор строки вместо ссылки, как это связано с механизмами динамических списков и расширений, и как быстро устранить эту ошибку.
Для того чтобы понять природу этой ошибки, нам необходимо заглянуть во внутреннее устройство управляемых форм 1С, а именно — проанализировать поведение элемента управления Таблица, связанного с реквизитом типа ДинамическийСписок.
Когда мы открываем форму выбора (например, список документов реализации), данные отображаются с помощью динамического списка. У этого объекта в свойствах есть ключевой параметр — Основная таблица (например, Документ.РеализацияТоваровУслуг). Поведение платформы при интерактивном выборе строки зависит исключительно от этого свойства:
Ссылка текущей строки и передает его в форму-владелец. В обработчик ОбработкаВыбора прилетает полноценная ссылка.Ссылка присутствует в запросе). В результате при выборе строки платформа возвращает не ссылку на объект базы данных, а внутренний идентификатор строки таблицы на клиенте, который имеет тип Число.В реальной практике разработчики сталкиваются с тем, что в основной конфигурации у динамического списка формы выбора свойство «Основная таблица» заполнено корректно, но при заимствовании формы в расширение это свойство сбрасывается. Проанализируем, почему это происходит:
Список могут унаследоваться некорректно. Свойство «Основная таблица» в расширении часто «слетает» и становится пустым.Рассмотрим подробнее три практических способа решения этой проблемы в зависимости от ваших задач.
Очень часто разработчики заимствуют формы в расширение случайно — например, при попытке добавить обработчик какого-то события или просто кликнув правой кнопкой мыши по форме в дереве метаданных. Если вам не нужно вносить изменения в саму форму выбора (менять ее интерфейс, добавлять новые кнопки или реквизиты), то держать ее в расширении нет никакого смысла.
Для исправления ошибки выполните следующие шаги:
Документы.РеализацияТоваровУслуг.Формы.ФормаВыбора).После удаления формы из расширения платформа вернется к использованию стандартной формы выбора из основной конфигурации, где свойство «Основная таблица» настроено правильно. Проблема исчезнет.
Если заимствованная форма выбора действительно необходима вам в расширении для кастомизации интерфейса или логики работы, удалять её нельзя. В этом случае нам нужно вручную восстановить сбившиеся настройки реквизита формы.
Разберем этот процесс по шагам:
Список и имеет тип ДинамическийСписок.Документ.РеализацияТоваровУслуг).Ссылка.Теперь динамический список в расширении будет корректно сопоставлять строки с физическими записями в базе данных и возвращать ссылку на объект.
Иногда возникают ситуации, когда разработчик вынужден намеренно очистить свойство «Основная таблица» у динамического списка. Например, это требуется, если в тексте произвольного запроса списка используется оператор объединения нескольких таблиц (ОБЪЕДИНИТЬ или UNION). При использовании объединений платформа на уровне стандартов разработки запрещает указывать основную таблицу для динамического списка.
В таком сценарии, чтобы вернуть ссылку вместо системного числа, нам придется программно перехватить событие выбора на клиенте и передать ссылку владельцу формы принудительно. Разберем, как это реализовать:
Таблица (обычно это элемент с именем Список на форме).
&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
// Отменяем стандартную обработку выбора платформы, чтобы избежать возврата числа
СтандартнаяОбработка = Ложь;
// Получаем данные текущей строки по ее числовому идентификатору
ДанныеСтроки = Элементы.Список.ДанныеСтроки(ВыбраннаяСтрока);
Если ДанныеСтроки <> Неопределено Тогда
// Проверяем наличие поля "Ссылка" в данных строки
Если СтруктураСвойства(ДанныеСтроки, "Ссылка") Тогда
// Оповещаем форму-владельца о выборе конкретной ссылки на документ/справочник
ОповеститьОВыборе(ДанныеСтроки.Ссылка);
Иначе
ВызватьИсключение "В запросе динамического списка отсутствует обязательное поле 'Ссылка'!";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция СтруктураСвойства(Объект, ИмяСвойства)
Возврат Объект.Свойство(ИмяСвойства);
КонецФункции
Этот способ гарантирует стабильную работу формы выбора даже в самых сложных случаях конфигурации динамических списков, когда стандартные механизмы платформы по умолчанию возвращают только числовой идентификатор строки.
Мы проанализировали неочевидную ошибку работы динамических списков в расширениях 1С и выяснили, что возврат числа вместо ссылки — это штатное поведение платформы в тех случаях, когда у динамического списка не заполнено свойство ОсновнаяТаблица. Использование предложенных нами методов позволит вам быстро диагностировать проблему и восстановить корректную работу обработчиков выбора в любых конфигурациях на платформе 1С:Предприятие 8.3.