1С выгрузить результат запроса в табличную часть

1С выгрузить результат запроса в табличную часть

Правильно ли я понимаю, что вернуть выборку на тонкий клиент вообще шансов нет никаких?

Допустим, есть управляемая форма, вызываемая из обработки. Надо заполнить табличную часть на этой форме. Соответственно на сервере запускаем запрос, результат запроса нужно каким-то образом вернуть на форму. Я пытаюсь вернуть таблицу значений.

В итоге получается, что:

1. Обычный возврат не работает, выкидывает ошибку XDTO.

2. ЗначениеИзСтрокиВнутр – на тонком клиенте недоступно.

3. Табличная часть формы на сервере недоступна.

Маленький IT блог с характером 1С.

пятница, 9 октября 2015 г.

Передача таблицы значений с сервера на клиент

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

Вариант №1

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

&НаСервере
Функция ПолучитьТЗКакМассивСтруктур()

МояТаблицаЗначений = СоздатьТаблицуЗначений();

МассивСтруктур = Новый Массив;
Для Каждого СтрокаТЗ Из МояТаблицаЗначений Цикл
СтрокаСтруктура = Новый Структура;
Для Каждого КолонкаТЗ Из МояТаблицаЗначений.Колонки Цикл
СтрокаСтруктура.Вставить(КолонкаТЗ.Имя, СтрокаТЗ);
КонецЦикла;
МассивСтруктур.Добавить(СтрокаСтруктура);
КонецЦикла;

Возврат МассивСтруктур;

&НаКлиенте
Процедура ПолучитьДанные()

Минус данного решения – это отсутствие тех самых полезных методов таблицы значений.

Вариант №2

Этот вариант намного сложнее, но выполнив его, считайте что к одному из пунктов экзамена на знание платформы 1С 8.2 или 8.3 «Специалист» вы подготовились. Здесь используется динамическое создание реквизитов формы. Алгоритм, примерно, такой: создается реквизит формы с типом ТаблицаЗначений, для этого реквизита создаются подчиненные реквизиты (колонки таблицы) и производиться загрузка данных таблицы значений в новый реквизит формы.

Первым делом, необходимо у формы создать реквизит ИмяТаблицыЗначений с типом ТаблицаЗначений.

Здравствуйте. Недавно начал учиться работать в 1С. Просмотр чужих тем с похожими на мою проблемами мне не помог. Я создал кнопку для автоматического заполнения полей табличной части документа и создал необходимый запрос, но не могу полученные данные заполнить в табчасть. Табличная часть имеет реквизит с ссылкой на справочник СтатьиОтчета, в котором указаны заполняемые поля.
Запрос:
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА РАЗНОСТЬДАТ(&Сегодня, ФизическиеЛица.ДатаРождения, ГОД) < 35
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК До35,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА ФизическиеЛица.Занятость = &Работающий
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК Работающих,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА РАЗНОСТЬДАТ(&Сегодня, МестоПрофУчетаСрезПоследних.Период, ГОД) <= 1
| И МестоПрофУчетаСрезПоследних.Действие = &ПринятНаУчет
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК ЗаОтчетныйГод,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА ФизическиеЛица.Пол = &Женский
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК Женщин,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ФизическиеЛица.Ссылка) КАК Всего,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА ФизическиеЛица.Занятость = &Учащийся
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК ВсегоУчащихся,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА ФизическиеЛица.Занятость = &Пенсионер
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК ВсегоПенсионеров,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА ФизическиеЛица.Занятость = &Работающий
| ИЛИ ФизическиеЛица.Занятость = &Учащийся
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК РаботающиеИУчащиесяЧленыПрофсоюза,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА ФизическиеЛица.Занятость = &Учащийся
| И МестоПрофУчетаСрезПоследних.Действие = &ПринятНаУчет
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК УчащиесяЧленыПрофсоюза,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА ФизическиеЛица.Занятость = &Аутсорсинг
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК Аутсорсинг,
| КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВЫБОР
| КОГДА ФизическиеЛица.Пол = &Женский
| И МестоПрофУчетаСрезПоследних.Действие = &ПринятНаУчет
| ТОГДА ФизическиеЛица.Ссылка
| КОНЕЦ) КАК ЖенщиныЧленыПрофсоюза
|ИЗ
| Справочник.ФизическиеЛица КАК ФизическиеЛица
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.МестоПрофУчета.СрезПоследних КАК МестоПрофУчетаСрезПоследних
| ПО (МестоПрофУчетаСрезПоследних.ЧленПрофсоюза = ФизическиеЛица.Ссылка)
|ГДЕ
| ФизическиеЛица.Владелец = &ППО»;
Запрос.УстановитьПараметр(«Аутсорсинг», Перечисления.Занятость.Аутсорсинг);
Запрос.УстановитьПараметр(«Женский», Перечисления.ПолФизическогоЛица.Ж);
Запрос.УстановитьПараметр(«ППО», Справочники.ТипОрганизации.ППО);
Запрос.УстановитьПараметр(«ПринятНаУчет», Перечисления.ПринятСнят.Принят);
Запрос.УстановитьПараметр(«Работающий», Перечисления.Занятость.Работающий);
Запрос.УстановитьПараметр(«Сегодня», Объект.Дата);
Запрос.УстановитьПараметр(«Пенсионер», Перечисления.Занятость.Пенсионер);
Запрос.УстановитьПараметр(«Учащийся», Перечисления.Занятость.Учащийся);
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КонецЦикла;

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

1C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 &НаСервере Функция ПолучитьДеньВыдачи(Отдел, СсылкаЗадание) Экспорт Запрос=Новый Запрос; Запрос.Текст=»ВЫБРАТЬ | ЗаданияШаблон.ДеньВыдачи |ИЗ | Справочник.ЗаданияШаблон КАК ЗаданияШаблон |ГДЕ | ЗаданияШаблон.ВыдающийОтдел = &Отдел | И ЗаданияШаблон.Ссылка = &Задание»; Запрос.УстановитьПараметр(«Отдел»,Отдел); Запрос.УстановитьПараметр(«Задание»,СсылкаЗадание); РезультатЗапроса = Запрос.Выполнить(); Возврат РезультатЗапроса.Выгрузить(); КонецФункции &НаКлиенте Процедура ЗаданияЗаданиеПриИзменении(Элемент) ТекущаяСтрока=Элементы.Задания.ТекущиеДанные; ТекущаяСтрока.ДеньВыдачи=ПолучитьДеньВыдачи(ТекущаяСтрока.ВыдающийОтдел,ТекущаяСтрока.Задание); КонецПроцедуры

В режиме предприятия я при изменении задания вылетает ошибка:
{Документ.ОбъектныйГрафик.Форма.ФормаДокумента.Форма(140)}: Ошибка при вызове метода контекста (ПолучитьДеньВыдачи)
ТекущаяСтрока.ДеньВыдачи=ПолучитьДеньВыдачи(ТекущаяСтрока.Вы дающийОтдел,ТекущаяСтрока.Задание);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: ret Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа ‘{http://v8.1c.ru/8.1/data/core}ValueTable’
Что делаю не так? помогите пожалуйста.

1С:Предприятие 8.2 /
Разработчикам /
Создание и изменение объектов метаданных

См. также

Область применения: управляемое приложение, мобильное приложение.

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

Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка) Поля.Добавить(» Наименование «); Поля.Добавить(«Дата»); СтандартнаяОбработка = Ложь; КонецПроцедуры Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) Наименование = ?(ПустаяСтрока(Данные.Наименование), НСтр(«ru = ‘Без описания'»), Данные.Наименование); Дата = Формат(Данные.Дата, ?(ПолучитьФункциональнуюОпцию(«ИспользоватьДатуИВремяВСрокахЗадач»), «ДЛФ=DT», «ДЛФ=D»)); Представление = СтрШаблон(НСтр(«ru = ‘%1 от %2′»), Наименование, Дата); СтандартнаяОбработка = Ложь; КонецПроцедуры

2. Обработчики вызываются при любой необходимости получения представления какого-либо объекта информационной базы. Поэтому избыточные данные или неправильный выбор данных для формирования представления могут привести к существенному замедлению работы системы.

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

3. Обработчики могут быть также вызваны, в том числе, при записи и удалении объекта в режиме обмена данными . Представление объекта при этом запрашивается для формирования записи в журнал регистрации. Поэтому к ним предъявляются те же требования, что и к логике регистрации объектов — см. п. 1.2 Разработка планов обмена с отборами .

Эти требования также справедливы при разработке планов обмена для синхронизации с другими программами (не РИБ, по правилам конвертации) с помощью подсистемы «Обмен данными» Библиотеки стандартных подсистем.
Например, недопустимо обращаться к предопределенным элементам, которые еще могли быть не загружены в базу или, наоборот, уже удалены в ходе обмена данными:

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Если Данные.ВидОбразования = Справочники.ВидыОбразованияФизическихЛиц.ПослевузовскоеОбразование Тогда Представление = НСтр(«ru = ‘Послевузовское образование'»); Иначе …

4. При реализации обработчиков следует также учитывать требования о поддержке толстого клиента, управляемое приложение, клиент-сервер.

См. также

  • Получение представлений для ссылочных значений в табличном документе
  • Пользовательские представления объектов

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *