Почему GUID не отображается в табличной части управляемой формы и как это исправить?

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

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

Причины поведения платформы 1С

Проанализируем, почему возникает данная проблема:

  1. Особенности визуальных элементов управляемой формы: Тип данных УникальныйИдентификатор является системным типом платформы. В управляемом интерфейсе для стандартного элемента ПолеВвода не предусмотрено интерактивное отображение и редактирование значений с типом УникальныйИдентификатор. В результате в таблице управляемой формы данные фактически присутствуют в структуре, но элемент отображения не может корректно представить их пользователю, оставляя поле пустым.
  2. Ограничения языка запросов: В языке запросов 1С конструкция ВЫРАЗИТЬ(Поле КАК Строка(36)) не применима к полям типа УникальныйИдентификатор. Платформа выдаст синтаксическую ошибку при попытке прямого приведения типов внутри текста запроса на уровне СУБД.

Решение 1. Изменение типа реквизита табличной части на строку (рекомендуемое)

Самым простым и эффективным решением является замена типа реквизита в табличной части обработки или в реквизитах формы с УникальныйИдентификатор на тип Строка(36). Стандартный GUID состоит из 32 шестнадцатеричных цифр и 4 дефисов, поэтому фиксированной длины в 36 символов достаточно.

Рассмотрим, как работает данный подход. При вызове метода Загрузить() платформа 1С автоматически выполняет неявное приведение типа УникальныйИдентификатор из выборки запроса к строковому представлению ячейки-приемника.

Посмотрим на пример серверной процедуры заполнения:


&НаСервере
Процедура ЗаполнитьНаСервере(Организация, Дата)

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   РС.Номенклатура КАК Номенклатура,
        |   РС.Идентификатор КАК GUID
        |ИЗ
        |   РегистрСведений.СоответствиеНоменклатуры КАК РС
        |ГДЕ
        |   РС.Организация = &Организация";

    Запрос.УстановитьПараметр("Организация", Организация);

    ТаблицаРезультата = Запрос.Выполнить().Выгрузить();
    
    // В табличной части реквизит GUID имеет тип Строка(36)
    Объект.Материалы.Загрузить(ТаблицаРезультата);

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

Поскольку колонка GUID в табличной части Материалы объявлена как Строка(36), значение идентификатора будет корректно выведено в ячейке управляемой формы в виде привычной строки формата xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.

Решение 2. Программное преобразование через XMLСтрока

Если таблица на форме является динамической таблицей значений или требуется ручная обработка каждой строки перед передачей на клиент, используем функции явного преобразования. В стандартах разработки 1С для быстрого и надежного получения строкового вида GUID рекомендуется использовать функцию XMLСтрока().

Разберем пример ручного обхода и преобразования значений:


&НаСервере
Процедура ЗаполнитьТаблицуФормыНаСервере()

    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   РС.Элемент КАК Ссылка,
        |   РС.Идентификатор КАК GUID
        |ИЗ
        |   РегистрСведений.ВнешниеИдентификаторы КАК РС";

    Выборка = Запрос.Выполнить().Выбрать();

    Объект.ТаблицаДанных.Очистить();

    Пока Выборка.Следующий() Цикл
        НоваяСтрока = Объект.ТаблицаДанных.Добавить();
        НоваяСтрока.Ссылка = Выборка.Ссылка;
        // Преобразуем объект типа УникальныйИдентификатор в строку
        НоваяСтрока.GUIDСтрокой = XMLСтрока(Выборка.GUID);
    КонецЦикла;

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

Обратное преобразование строки в GUID и ссылку

Если в процессе работы пользователю необходимо по введенной или отредактированной строке получить исходный системный идентификатор или найти ссылку на объект базы данных, применим встроенный конструктор Новый УникальныйИдентификатор().

Рассмотрим пример обратного получения ссылки на справочник:


&НаСервере
Функция ПолучитьСсылкуПоСтрокеGUID(СтрокаGUID, ИмяСправочника)

    Если Не ЗначениеЗаполнено(СтрокаGUID) Тогда
        Возврат Неопределено;
    КонецЕсли;

    // Создаем системный объект идентификатора из строки
    УИД = Новый УникальныйИдентификатор(СтрокаGUID);

    // Получаем ссылку по уникальному идентификатору
    СсылкаНаОбъект = Справочники[ИмяСправочника].ПолучитьСсылку(УИД);

    Возврат СсылкаНаОбъект;

КонецФункции

Таким образом, для отображения системных идентификаторов в таблицах управляемых форм всегда следует использовать строковый тип данных с длиной не менее 36 символов, выполняя преобразование неявно при выгрузке или явно с помощью метода XMLСтрока().

← На главную