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