• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

1с 8.2 вернуть тз с сервера на клиент и перебрать

  • Автор темы RZX
  • Дата начала
R

RZX

Всё, сдаюсь...
Прошу помощи по решению следующего вопроса.

Я работал в основном с 1С 8.1 на обычных формах. Тут столкнулся с тем, что человеку нужен простенький отчетик в 1С 8.2 на управляемых формах.
Запрос набросал минут за 10, он еще будет правится - не в нем суть. Как вернуть результат в клиентскую часть - сижу уже несколько дней.

Есть обработка, на которой мы устанавливаем ДатаС, ДатаПо, Контрагент.

Таб - реквизит формы типа ТаблицаЗначений.

И есть модуль формы (серверная часть не очень интересует, она небольшая, поэтому я ее полностью привел):

Код:
&НаСервере
Функция ВыборкаДанных(ДатаС, ДатаПо, Контрагент)
 
ТаблЗнач = Новый ТаблицаЗначений;
ТаблЗнач.Колонки.Добавить("Номенклатура");
 
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОтчетОРозничныхПродажахТовары.Номенклатура КАК Номенклатура,
| СУММА(ОтчетОРозничныхПродажахТовары.Количество) КАК Количество,
| Штрихкоды.Штрихкод,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Закупочная,
| ЦеныНоменклатурыСрезПоследних1.Цена КАК Розничная,
| СУММА(ОтчетОРозничныхПродажахТовары.Количество) * (ЦеныНоменклатурыСрезПоследних1.Цена - ЦеныНоменклатурыСрезПоследних.Цена) КАК КомиссионноеВознаграждение
|ИЗ
| Документ.ОтчетОРозничныхПродажах.Товары КАК ОтчетОРозничныхПродажахТовары,
| РегистрСведений.Штрихкоды КАК Штрихкоды,
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаПо, ) КАК ЦеныНоменклатурыСрезПоследних,
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаПо, ) КАК ЦеныНоменклатурыСрезПоследних1,
| РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
|ГДЕ
| ОтчетОРозничныхПродажахТовары.Ссылка.Дата >= &ДатаС
| И ОтчетОРозничныхПродажахТовары.Ссылка.Дата <= &ДатаПо
| И ОтчетОРозничныхПродажахТовары.Номенклатура = Штрихкоды.Владелец
| И ЦеныНоменклатурыСрезПоследних.ВидЦены.Ссылка = &ВидЦеныЗакупочная
| И ОтчетОРозничныхПродажахТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
| И ОтчетОРозничныхПродажахТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних1.Номенклатура
| И ЦеныНоменклатурыСрезПоследних1.ВидЦены.Ссылка = &ВидЦеныРозничная
| И НоменклатураКонтрагентов.Контрагент = &Контрагент
| И НоменклатураКонтрагентов.Номенклатура = ОтчетОРозничныхПродажахТовары.Номенклатура
|
|СГРУППИРОВАТЬ ПО
| ОтчетОРозничныхПродажахТовары.Номенклатура,
| Штрихкоды.Штрихкод,
| ЦеныНоменклатурыСрезПоследних.Цена,
| ЦеныНоменклатурыСрезПоследних1.Цена";
 
 
Запрос.УстановитьПараметр("ДатаС", ДатаС);
Запрос.УстановитьПараметр("ДатаПо", ДатаПо);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("ВидЦеныЗакупочная", Справочники.ВидыЦен.НайтиПоНаименованию("закупочная"));
Запрос.УстановитьПараметр("ВидЦеныРозничная", Справочники.ВидыЦен.НайтиПоНаименованию("розница"));
 
ТаблЗнач = Новый ТаблицаЗначений;
ТаблЗнач = Запрос.Выполнить().Выгрузить();
ЗначениеВРеквизитФормы(ТаблЗнач,"Отчет.Таб"); // это вот так нужно передавать?
// или можно как-то по другому?
  
КонецФункции

Код:
&НаКлиенте
Процедура Сформировать(Команда)
//
ВыборкаДанных(Отчет.ДатаС, Отчет.ДатаПо, Отчет.Контрагент);
 
Для каждого Эл из Отчет.Таб Цикл
 
Сообщить(Эл);
КонецЦикла;
 
КонецПроцедуры

[offtop]
Смотреть курсы по СКД и УФ на 100500 часов нет времени (обязательно как-нибудь это сделаю). Просто человеку нужно очень срочно, а я сижу уже несколько дней и без результата.
[/offtop]

Получается что:
1. На тонком клиенте недоступна таблица значений (то есть ее нельзя вернуть по Возврат)
2. На тонком клиенте недоступна ЗначениеФормыВРеквизит
3. На тонком клиенте недоступна ЗначениеИзСтрокиВнутр
4. На тонком клиенте недоступна табличная часть формы (то есть ее нельзя заполнить на сервере)

То, как приведено в коде выше, единственный способ, который я нашел и который что-то возвращает.

А возвращается в Отчет.Таб какая-то хрень, которая называется ДанныеФормыКоллекция. Что это и как с этим работать из СП непонятно. Я сомневаюсь, что это то, что мне нужно для вывода данных.

Кто сталкивался с такой штукой? Подскажите, как все-таки вернуть данные из запроса и отобразить из на клиенте в управляемой форме.
Спасибо!
 
T

tanat

Сделайте табличную часть с нужным перечнем колонок (естественно, с соответствующими типами значений, с аналогичными запросу именами колонок) и можно просто Отчет.<ИмяТабличнойЧасти> = Запрос.Выполнить().Выгрузить(); внутри серверной процедуры ВыборкаДАнных().

Но, по хорошему, лучше бы запилить это отчетом, на СКД. Делается это за 10 минут.
 
Ч

ЧИА

Если еще актуально...
Для того, чтобы работать с таблицей значений на клиенте (а также и на сервере), можно в управляемой форме в разделе "Реквизиты" добавить реквизит, например, тзНашаТаблица с типом значения "ТаблицаЗначений". Тут же добавить и описать все колонки этой таблицы.
тзНашаТаблица готова к эксплуатации.
 
P

puh14

Клиент серверное разделение - бессердечная ты сука!(с)

Варианта 2 - первый таки СКД, благо там всего пара хитростей есть.
Второй - бацайте табличный документ на сервере и возвращайте на клиент, а там выводить. Но это через жопу автогеном.
 
S

SeverBap

Всё, сдаюсь...
Прошу помощи по решению следующего вопроса.

Я работал в основном с 1С 8.1 на обычных формах. Тут столкнулся с тем, что человеку нужен простенький отчетик в 1С 8.2 на управляемых формах.
Запрос набросал минут за 10, он еще будет правится - не в нем суть. Как вернуть результат в клиентскую часть - сижу уже несколько дней.

Есть обработка, на которой мы устанавливаем ДатаС, ДатаПо, Контрагент.

Таб - реквизит формы типа ТаблицаЗначений.

И есть модуль формы (серверная часть не очень интересует, она небольшая, поэтому я ее полностью привел):

Код:
&НаСервере
Функция ВыборкаДанных(ДатаС, ДатаПо, Контрагент)
 
ТаблЗнач = Новый ТаблицаЗначений;
ТаблЗнач.Колонки.Добавить("Номенклатура");
 
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОтчетОРозничныхПродажахТовары.Номенклатура КАК Номенклатура,
| СУММА(ОтчетОРозничныхПродажахТовары.Количество) КАК Количество,
| Штрихкоды.Штрихкод,
| ЦеныНоменклатурыСрезПоследних.Цена КАК Закупочная,
| ЦеныНоменклатурыСрезПоследних1.Цена КАК Розничная,
| СУММА(ОтчетОРозничныхПродажахТовары.Количество) * (ЦеныНоменклатурыСрезПоследних1.Цена - ЦеныНоменклатурыСрезПоследних.Цена) КАК КомиссионноеВознаграждение
|ИЗ
| Документ.ОтчетОРозничныхПродажах.Товары КАК ОтчетОРозничныхПродажахТовары,
| РегистрСведений.Штрихкоды КАК Штрихкоды,
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаПо, ) КАК ЦеныНоменклатурыСрезПоследних,
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаПо, ) КАК ЦеныНоменклатурыСрезПоследних1,
| РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
|ГДЕ
| ОтчетОРозничныхПродажахТовары.Ссылка.Дата >= &ДатаС
| И ОтчетОРозничныхПродажахТовары.Ссылка.Дата <= &ДатаПо
| И ОтчетОРозничныхПродажахТовары.Номенклатура = Штрихкоды.Владелец
| И ЦеныНоменклатурыСрезПоследних.ВидЦены.Ссылка = &ВидЦеныЗакупочная
| И ОтчетОРозничныхПродажахТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура
| И ОтчетОРозничныхПродажахТовары.Номенклатура = ЦеныНоменклатурыСрезПоследних1.Номенклатура
| И ЦеныНоменклатурыСрезПоследних1.ВидЦены.Ссылка = &ВидЦеныРозничная
| И НоменклатураКонтрагентов.Контрагент = &Контрагент
| И НоменклатураКонтрагентов.Номенклатура = ОтчетОРозничныхПродажахТовары.Номенклатура
|
|СГРУППИРОВАТЬ ПО
| ОтчетОРозничныхПродажахТовары.Номенклатура,
| Штрихкоды.Штрихкод,
| ЦеныНоменклатурыСрезПоследних.Цена,
| ЦеныНоменклатурыСрезПоследних1.Цена";
 
 
Запрос.УстановитьПараметр("ДатаС", ДатаС);
Запрос.УстановитьПараметр("ДатаПо", ДатаПо);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("ВидЦеныЗакупочная", Справочники.ВидыЦен.НайтиПоНаименованию("закупочная"));
Запрос.УстановитьПараметр("ВидЦеныРозничная", Справочники.ВидыЦен.НайтиПоНаименованию("розница"));
 
ТаблЗнач = Новый ТаблицаЗначений;
ТаблЗнач = Запрос.Выполнить().Выгрузить();
ЗначениеВРеквизитФормы(ТаблЗнач,"Отчет.Таб"); // это вот так нужно передавать?
// или можно как-то по другому?
 
КонецФункции

Код:
&НаКлиенте
Процедура Сформировать(Команда)
//
ВыборкаДанных(Отчет.ДатаС, Отчет.ДатаПо, Отчет.Контрагент);
 
Для каждого Эл из Отчет.Таб Цикл
 
Сообщить(Эл);
КонецЦикла;
 
КонецПроцедуры

[offtop]
Смотреть курсы по СКД и УФ на 100500 часов нет времени (обязательно как-нибудь это сделаю). Просто человеку нужно очень срочно, а я сижу уже несколько дней и без результата.
[/offtop]

Получается что:
1. На тонком клиенте недоступна таблица значений (то есть ее нельзя вернуть по Возврат)
2. На тонком клиенте недоступна ЗначениеФормыВРеквизит
3. На тонком клиенте недоступна ЗначениеИзСтрокиВнутр
4. На тонком клиенте недоступна табличная часть формы (то есть ее нельзя заполнить на сервере)

То, как приведено в коде выше, единственный способ, который я нашел и который что-то возвращает.

А возвращается в Отчет.Таб какая-то хрень, которая называется ДанныеФормыКоллекция. Что это и как с этим работать из СП непонятно. Я сомневаюсь, что это то, что мне нужно для вывода данных.

Кто сталкивался с такой штукой? Подскажите, как все-таки вернуть данные из запроса и отобразить из на клиенте в управляемой форме.
Спасибо!
Это не код, а адовая реализация!!!!
Сначала надо причесать сам запрос - он будет Вам выдавать результат очень долго и скорее всего неправильно....
Вот немного подправил ваш запрос:
Код:
Запрос = Новый Запрос("ВЫБРАТЬ
                      |    ОтчетОРозничныхПродажахТовары.Номенклатура,
                      |    ОтчетОРозничныхПродажахТовары.Количество,
                      |    Штрихкоды.Штрихкод,
                      |    ЦеныНоменклатурыЗакупочная.Цена КАК Закупочная,
                      |    ЦеныНоменклатурыРозничная.Цена КАК Розничная,
                      |    СУММА(ОтчетОРозничныхПродажахТовары.Количество) * (ЦеныНоменклатурыРозничная.Цена - ЦеныНоменклатурыЗакупочная.Цена) КАК КомиссионноеВознаграждение
                      |ИЗ
                      |    РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
                      |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.ОтчетОРозничныхПродажах.Товары КАК ОтчетОРозничныхПродажахТовары
                      |        ПО НоменклатураКонтрагентов.Номенклатура = ОтчетОРозничныхПродажахТовары.Номенклатура
                      |            И НоменклатураКонтрагентов.ХарактеристикаНоменклатуры = ОтчетОРозничныхПродажахТовары.ХарактеристикаНоменклатуры
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.Штрихкоды КАК Штрихкоды
                      |        ПО НоменклатураКонтрагентов.Номенклатура = Штрихкоды.Владелец
                      |            И НоменклатураКонтрагентов.ХарактеристикаНоменклатуры = Штрихкоды.ХарактеристикаНоменклатуры
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаПо, ) КАК ЦеныНоменклатурыЗакупочная
                      |        ПО НоменклатураКонтрагентов.Номенклатура = ЦеныНоменклатурыЗакупочная.Номенклатура
                      |            И НоменклатураКонтрагентов.ХарактеристикаНоменклатуры = ЦеныНоменклатурыЗакупочная.ХарактеристикаНоменклатуры
                      |            И (ЦеныНоменклатурыЗакупочная.ТипЦен.Наименование = ""закупочная"")
                      |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыРозничная
                      |        ПО (ЦеныНоменклатурыРозничная.ТипЦен.Наименование = ""розница"")
                      |            И НоменклатураКонтрагентов.ХарактеристикаНоменклатуры = ЦеныНоменклатурыРозничная.ХарактеристикаНоменклатуры
                      |            И НоменклатураКонтрагентов.Номенклатура = ЦеныНоменклатурыРозничная.Номенклатура
                      |ГДЕ
                      |    ОтчетОРозничныхПродажахТовары.Ссылка.Дата МЕЖДУ &ДатаС И &ДатаПо
                      |    И НоменклатураКонтрагентов.Контрагент = &Контрагент
                      |
                      |СГРУППИРОВАТЬ ПО
                      |    ОтчетОРозничныхПродажахТовары.Номенклатура,
                      |    ОтчетОРозничныхПродажахТовары.Количество,
                      |    Штрихкоды.Штрихкод,
                      |    ЦеныНоменклатурыЗакупочная.Цена,
                      |    ЦеныНоменклатурыРозничная.Цена");
Запрос.УстановитьПараметр("ДатаС", ДатаС);
Запрос.УстановитьПараметр("ДатаПо", ДатаПо);
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Причем если Вам надо выводить в виде таблицы на форме, то лучше сделайте это через динамический список с произвольным запросом. Только правильно пропишите сначала параметры для динамического списка ПриСозданииНаСервере, например:
Код:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
   
    ТаблЗнач.Параметры.УстановитьЗначениеПараметра("ДатаС", ДатаС);
    ТаблЗнач.Параметры.УстановитьЗначениеПараметра("ДатаПо", ДатаПо);
    ТаблЗнач.Параметры.УстановитьЗначениеПараметра("Контрагент", Контрагент);
   
КонецПроцедуры
Если же нужно все равно реализовать через таблицузначений то тебе надо создать объект со всеми колонками, все необходимое создать на форме для отражения, а для заполнения достаточно сделать виде после выполнения запроса:
Код:
ЗначениеВРеквизитФормы(Запрос.Выполнить().Выгрузить(), "ТаблЗнач");
вообщем ничего сложного
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!