1с получить представление документа
Например, чтобы с "т.з. учета в ЗУП" получить правильные данные о плановых начислениях, надо сделать выборку не только из РС.ПлановыеНачисления, но также из РС.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников и РС.ПлановыйФОТ. А чтобы получить кадровые данные сотрудников, механизмом извлекаются данные из более чем дюжины регистров.
Для иллюстрации работы "механизма" рассмотрим срез последних из периодического регистра сведений, этому посвящены несколько общих модулей ЗарплатаКадрыПериодическиеРегистры. Наверно, вы знаете, что виртуальную таблицу периодического регистра сведений СрезПоследнихплатформа заменяет на запрос вида
Этот запрос точно не будет эффективным при наличии в регистре 1 млн записей. Быстрее выполнится запрос с выделением максимальных периодов во временную таблицу
И механизм сформирует примерно такой же запрос. Еще раз обращаю внимание: платформа генерирует заведомо неэффективный запрос, программисты 1С используют обходной манёвр (хех, на тему обходных маневров можете поискать как собираются базы начислений и удержаний). Для получения запроса понадобится временная таблица-фильтр по физическим лицам. Она должна обязательно содержать два поля: ФизическоеЛицо и Период. Причем поле Период может быть заполнено разными значениями. Для примера сделаем фильтр из таблицы значений
В менеджере временных таблиц мы получим искомый срез в ВТВоинскийУчет. Если поковыряться в параметрах процедур, то вы обнаружите, что, например, поля ФизическоеЛицо и Период можно переобозначить (описывая эти и другие подробности, я никогда не закончу писать статью).
Но опять о преимуществах механизма. 1С придумали т.н. "интервальные" регистры сведений. Это своего рода программно реализуемая "виртуальная таблица", в которую помещаются периоды действия регистрируемых событий. Получение среза последних при наличии такого регистра сводится к одному соединению фильтра с таблицей регистра, то есть выполняется заведомо быстрее. Для РС.ГрафикРаботыСотрудников, у которого уже есть интервальный регистр, результат вызова ЗапросВТИмяРегистраСрез вернет следующий запрос
То есть вызывая процедуру получения запроса для среза последних и т.п. мы получим функционально правильный и эффективный (будем надеяться) запрос.
Можно вместо запроса получить сразу ВТ. Соответственно, в параметре-менеджере временных таблиц уже должна быть готова ВТСотрудники
Приведу еще один полезный пример для регистра, у которого два измерения, причем одно из них все еще называется ФизЛицо вместо принятого ныне ФизическоеЛицо, а в ВТ-фильтре поле называется как раз ФизическоеЛицо. Также в этом примере описывается дополнительный отбор, накладываемый на второе измерение
Также можно получить записи регистра. Это делается при помощи функций в общем модуле ЗарплатаКадрыПериодическиеРегистры: ЗапросВТИмяРегистра, СоздатьВТИмяРегистра.
Помимо срезов регистров сведений существует целый перечень готовых запросов/временных таблиц. С этим перечнем можно ознакомиться в функциях:
Каждое из представлений, описанных в этих функциях, пожалуй, заслуживает отдельной темы. В этих функциях можно почерпнуть сведения о том, как получить соответствующие запросы и ВТ. Также можно глобальным поиском найти места, где это делают сами разработчики 1С.
Приведу ещё примеры использования некоторых из них. Например, данные учета времени и состояний сотрудников - таким образом вы получите ВТ с видом рабочего времени сотрудников на каждый день периода. Здесь при в сборе данных помимо регистров сведений участвуют и регистры накопления. Опять же, идейный смысл такого получения данных в том, что будут учтены отклонения, табели, индивидуальные графики и т.п.
Пример "двухступенчатой" выборки данных: сначала получаем кадровые данные, затем на их основании данные штатного расписания (ВТСотрудники должны быть подготовлены в МенеджерВременныхТаблиц). При этом, например, вам не надо думать, используется ли история изменения штатного расписания или нет. (Пример исправлен для 3.1.6.54)
Ну а причем здесь представления? Начнем с того, что представления запросов используются в СКД. Вы указываете в запросе, что надо выбрать из таблицы-представления, в событие ПриКомпоновкеДанных вставляете процедуру ЗарплатаКадрыОбщиеНаборыДанных.ЗаполнитьОбщиеИсточникиДанныхОтчета(ЭтотОбъект) и, вуаля, вместо представления запроса появляются несколько ВТ, помещенные в ваш запрос, правильно собирающие данные из базы. Пример для среза последних - получение графика работы на дату для штатных сотрудников
Пример для "предопределенного" представления я бы привел для специфической таблицы Периоды
Не забудьте прописать процедуру в ПриКомпоновкеДанных, установить тип Дата в параметрах, добавить в структуру ДетальныеЗаписи, а в выбранные поля добавить Период. И получите таблицу дат с начала по конец периода.
Об использовании представлений в СКД больше расскажет конфигурация. Так что смотрите в ПолучитьЗапросПоПредставлению и пользуйтесь глобальным поиском, не забывая ставить флажок в Макеты. Стоит также отметить, что Представления охватывают лишь небольшую часть функций .СоздатьВТ.
Обработчики событий ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления
Область применения: управляемое приложение, мобильное приложение.
1. С помощью данных обработчиков модуля менеджера объекта можно переопределить представление объекта информационной базы, которое выводится в полях форм и в списках.
Пример реализации:
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
Поля.Добавить("Наименование");
Поля.Добавить("Дата");
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
Наименование = ?(ПустаяСтрока(Данные.Наименование), НСтр("ru = 'Без описания'"), Данные.Наименование);
Дата = Формат(Данные.Дата, ?(ПолучитьФункциональнуюОпцию("ИспользоватьДатуИВремяВСрокахЗадач"), "ДЛФ=DT", "ДЛФ=D"));
Представление = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 от %2'"), Наименование, Дата);
СтандартнаяОбработка = Ложь;
КонецПроцедуры
2. Обработчики вызываются при любой необходимости получения представления какого-либо объекта информационной базы. Поэтому избыточные данные или неправильный выбор данных для формирования представления могут привести к существенному замедлению работы системы.
Также не следует выполнять в этих обработчиках запросы или получение объектов информационной базы (в том числе, запрещены обращения к реквизитам объектов ссылочных типов через точку, что приводит к чтению всего объекта целиком из базы данных). Также нежелательно использовать получение представления и реквизитов ссылок.
3. Обработчики могут быть также вызваны, в том числе, при записи и удалении объекта в режиме обмена данными. Представление объекта при этом запрашивается для формирования записи в журнал регистрации. Поэтому к ним предъявляются те же требования, что и к логике регистрации объектов - см. п. 1.2 Разработка планов обмена с отборами.
Эти требования также справедливы при разработке планов обмена для синхронизации с другими программами (не РИБ, по правилам конвертации) с помощью подсистемы «Обмен данными» Библиотеки стандартных подсистем.
Например, недопустимо обращаться к предопределенным элементам, которые еще могли быть не загружены в базу или, наоборот, уже удалены в ходе обмена данными:
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Если Данные.ВидОбразования = Справочники.ВидыОбразованияФизическихЛиц.ПослевузовскоеОбразование Тогда
Представление = НСтр("ru = 'Послевузовское образование'");
Иначе
.
4. При реализации обработчиков следует также учитывать требования о поддержке толстого клиента, управляемое приложение, клиент-сервер.
Особенности работы с полем Представление и функцией Представление() языка запросов
Для вывода ссылочных полей в отчет необходимо получать представление ссылочного поля в запросе, и при выводе использовать именно его, а не саму ссылку. В данном разделе описываются некоторые особенности поля "Представление" и функции для получения представлений - Представление() . Подробнее о выводе ссылочных полей можно прочитать в разделе "Вывод ссылочных полей".
Поле Представление
Каждая объектная таблица в информационной базе имеет виртуальное поле - "Представление". Это поле содержит текстовое представление объекта. В запросе возможно получать данное поле точно также как и другие поля таблиц, однако никакие операции с данным полем выполнять нельзя. Данная особенность связана с тем, что это поле является виртуальным, и, на самом деле, при получении данного поля из базы данных, запрос получает несколько полей, а при получении значения поля из результата запроса преобразовывает полученные значения в строку. Таким образом, единственное, что можно сделать с полем "Представление", это получить его в результат запроса.
Как следствие, результат запроса не рекомендуется упорядочивать по полю "Представление", т.к. это не приведет к желаемому результату - результат запроса будет упорядочен в порядке возрастания ссылок объектов. Подробнее об этом можно прочитать в разделе "Особенности упорядочивания по ссылочным полям".
Функция Представление()
Функция представление предназначена для получения текстового представления любого значения, которое может быть получено при помощи языка запросов. Функция Представление() работает как для ссылочных, так и для примитивных типов. Для ссылочных типов результат функции полностью аналогичен получению поля "Представление" от ссылки, переданной в качестве параметра функции. Для примитивных типов, результатом работы функции является строка, в которую было преобразовано значение, переданное в качестве параметра. Особенностью данной функции является то, что ее результат не может быть использован в выражении. Такая особенность связана с тем фактом, что преобразование значений в строку осуществляется уже при получении данных из результата запроса, т.к. преобразование произвольного значения в строку при исполнении запроса на сервере, не осуществляется, в силу того, что при преобразовании значений в строку необходимо учитывать локальные настройки.
Использование функции Представление() имеет ряд преимуществ по сравнению с использованием поля "Представление". Например, в случае если поле, от которого получается представление, может содержать как ссылочные, так и примитивные типы, получение поля "Представление" через точку от такого поля приведет к тому, что представления для значений примитивного типа не будут получены. Если же, для такого поля применить функцию Представление() , то строковое представление будет получено вне зависимости от типа значения, содержащегося в поле. Кроме того, в случае если функция Представление() применяется к полю, которое является ссылкой более чем на три таблицы, язык запросов получает из базы данных только ссылочные значения, а значения представлений получает одним или несколькими дополнительными запросами. Такое поведение позволяет более эффективно получать представления для полей, которые ссылаются на большое количество таблиц (например, на любой справочник), за счет того, что в исполняемый запрос не будет помещаться большое количество соединений, которые необходимы для получения полей из которых состоит представление.
Применение функции Представление() также может быть полезным при получении представления поля - перечисления, в случае исполнения запроса через COM-соединение.
В обычном приложении у элемента формы 1С 8.3 было свойство "Значение", доступное как для чтения, так и для записи. Какой аналог в управляемом приложении?
Элементы формы 1С 8.3 могут содержать реквизиты двух видов: реквизиты объекта 1С и реквизиты формы.
Красным помечен реквизит объекта 1С Контрагент, а зеленым – реквизит формы в 1С.
Интерактивно выберем эти элементы в пользовательском режиме 1С и попробуем прочитать их «программно» кнопкой «Прочитать».
Если читать значения реквизитов в клиентской процедуре, то код для 1С Предприятия будет следующий:
Все бы хорошо: мы получили на клиенте значения реквизитов объекта 1С и формы, но – не значения элементов формы 1С. На клиенте значение элементов формы 1С получить нельзя.
2. Как получить значения из элементов формы 1С
Чтобы получить значения из элементов формы 1С, нам потребуется серверный вызов:
Именно на сервере у элемента формы 1С 8.3 становится доступно свойство ПутьКДанным, по которому его можно извлечь либо из Объекта, который имеет тип ДанныеФормыСтруктура:
…либо из Формы, которая имеет тип ФормаКлиентскогоПриложения:
Форма и ее элементы не видны на сервере без контекста. То есть код для 1С:Предприятия выдаст множество ошибок.
Также Форму нельзя передать как параметр в процедуру и функцию на сервер или в общий модуль.
Еще хочется разобрать момент, когда нам возможно увидеть состояние различающихся значений в элементе форме 1С и в объекте. Это возможно в событии элемента ОбработкаВыбора.
Например, при значении поля Контрагент - Ассоль, мы выбрали контрагента Бакалея:
Читайте также: