Имя: Пароль:
1C
1С v8
УТ 11 Передача данных с сервера на форму
0 Pashabr
 
10.07.25
19:35
Приветствую! пытаюсь решить задачку.
Есть справочник Номенклатура, у него форма списка.
При нажатии на элемент списка внизу должна появляться табличка с колонками ДокументПрихода, ДатаПрихода, Контрагент(кто поставил товар), Количество(имеется в виду остаток на текущий момент на складах), Склад(если складов несколько, то по ним разные строки).
Вся информация для таблички находится запросом с регистров в серверной процедуре.
Вот вопрос: как лучше собранную запросом информацию вывести обратно на форму? Я выбрал вариант через Таблицу значений, но может есть более правильный способ? Реквизит на форме и Таблицу на самой форме надо создавать или лучше програмно?
Подскажите, плиз. Буду благодарен. Крайне желательно, для примера, какой-то условный код, чтобы от него оттолкнуться.
1 Волшебник
 
10.07.25
19:35
А ничего, что приходов может быть много, а склад один? И как Вы это планируете показать в одной табличке? Делайте две таблички
2 Волшебник
 
10.07.25
19:36
Вы упёрлись в интерфейс, разделение контекста на клиент/сервер, и забыли про бизнес-логику!
3 Волшебник
 
10.07.25
19:37
Текущие остатки по складам можно показать, это даже приветствуется, но вот выводить все приходы будет напряжно. Для этого есть отчёты.
4 Pashabr
 
10.07.25
19:42
Если приходов было несколько, то и документов несколько. Будет несколько строк. Обычно контрагент один или два. Документов до 5, пока остатки со склада не уходят. Складов несколько, но обычно одни и те же контрагенты на одни и те же склады отгружаются. Строк 10 не больше обычно в табличке. Эта штука работает в УТ 10, другой делал, надо такую же в 11 сделать.
5 Pashabr
 
10.07.25
19:47
(2) Я уперся в интерфейс. Логика мне понятна. Не могу нормально данные запроса на форму передать. Совет бы)
6 Волшебник
 
10.07.25
19:47
(4) Пошёл и сделал!
7 Волшебник
 
10.07.25
19:47
(5) Погуглите
8 timurhv
 
10.07.25
19:51
(0) Какое событие у списка? ПриАктивизацииСтроки и вызываете серверную процедуру\функцию?
Если так, то при открытии большого списка 45 раз будет серверный вызов)

Чтобы такого не было либо заполнение делаете по команде, либо в модуле "ПриАктивизацииСтроки" подключаете обработчик ожидания, пример:
https://ironskills.by/tpost/zi7ytn6co1-kak-izbavitsya-ot-kontekstnogo-vizova-v

Из справки:
ФормаКлиентскогоПриложения (ClientApplicationForm)
ПодключитьОбработчикОжидания (AttachIdleHandler)
Синтаксис:
ПодключитьОбработчикОжидания(<ИмяПроцедуры>, <Интервал>, <Однократно>)
Описание:
Подключает указанную процедуру в качестве обработчика ожидания. Процедура будет вызываться в период ожидания системы каждый раз по истечению указанного интервала времени.

Вызов будет осуществляться только в "состоянии покоя", то есть в тот момент, когда программа не выполняет никаких действий.
9 Mort
 
11.07.25
00:19
По моему опыту оптимальнее будет внизу динамический список с заданным запросом с параметром. При активации строки устанавливать параметры списка или отбор - тут можно поиграть что быстрее, смотря как запрос спика составлен. Вообще по-разному можно поиграться, если база огромная может и не стоить применять такое насилие и выводить эту информацию по запросу пользователя в отдельной кнопке - минус в интерактивности, плюс в оптимизации.
10 Fish
 
гуру
11.07.25
09:12
(0) Показывай код. И опиши, что не получилось.
11 AAA
 
11.07.25
11:43
Мертвая и ненужная задача. Со списком просто нереально будет работать. Получать документы и другую детализацию надо только по кнопкам. И без этого не так чтобы все летает
12 Fish
 
гуру
11.07.25
12:06
(11) Ну почему же. Если подготовить данные в отдельном регистре, то вполне себе можно минимизировать тормоза.
13 AAA
 
11.07.25
13:53
(12)Зачем? Прибыль повысится ?
14 Fish
 
гуру
11.07.25
15:10
(13) Не всё в этом мире определяется прибылью. Не надо быть таким меркантильным :)
15 Pashabr
 
12.07.25
21:27
(8) Да, ПриАктивизацииСтроки. Попробую с ожиданием, спасибо.
16 Pashabr
 
12.07.25
21:30
(11) Задача очень нужная, т.к. уже 5 лет комерсы так работают. Очень просят в новой базе так сделать.
17 Pashabr
 
12.07.25
21:32
(6) Ок, разберусь сам.
18 Pashabr
 
13.07.25
14:20
Голова сломалась сегодня. Не получается передать на форму ТЗ.
Пишу такой код, ТЗ получается правильная. Дальше затык.

&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    
    Номенкл = Элементы.Список.ТекущиеДанные;
    ТипНоменклатуры = Номенкл.ТипНоменклатуры;
    Номенклатура = Элементы.Список.ТекущаяСтрока;
    ТипТовар = ПредопределенноеЗначение("Перечисление.ТипыНоменклатуры.Товар");
    
    Если ТипНоменклатуры = ТипТовар Тогда
        ПоказатьОповещениеПользователя("Окно сообщения", 50, "Это товар");
        ПолучениеДанныхНоменклатуры(Номенклатура);
    КонецЕсли;
    
КонецПроцедуры

&НаСервере
Процедура ПолучениеДанныхНоменклатуры(Номенклатура) Экспорт
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |    ТоварыНаСкладахОстатки.Склад КАК Склад,
    |    СУММА(ТоварыНаСкладахОстатки.КоличествоОстаток) КАК Количество,
    |    СУММА(ТоварыНаСкладахОстатки.СуммаОстаток) КАК Сумма,
    |    ПоступлениеТоваровИУслуг.Контрагент КАК Контрагент,
    |    ПоступлениеТоваровИУслуг.Дата КАК ДатаПрихода,
    |    ПоступлениеТоваровИУслуг.Ссылка КАК ДокументПрихода,
    |    ЦеныНоменклатуры.Цена КАК Цена
    |ИЗ
    |    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
    |        ПОЛНОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваровИУслуг КАК ПоступлениеТоваровИУслуг
    |        ПО ТоварыНаСкладахОстатки.Номенклатура = ПоступлениеТоваровИУслуг.Товары.Номенклатура
    |            И ТоварыНаСкладахОстатки.Склад = ПоступлениеТоваровИУслуг.Склад
    |        ПОЛНОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
    |        ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатуры.Номенклатура
    |ГДЕ
    |    ТоварыНаСкладахОстатки.Номенклатура = &Номенклатура
    |
    |СГРУППИРОВАТЬ ПО
    |    ТоварыНаСкладахОстатки.Номенклатура,
    |    ТоварыНаСкладахОстатки.Склад,
    |    ПоступлениеТоваровИУслуг.Контрагент,
    |    ПоступлениеТоваровИУслуг.Ссылка,
    |    ПоступлениеТоваровИУслуг.Дата,
    |    ЦеныНоменклатуры.Цена";
    
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();
    
    ТаблицаДанных = Новый ТаблицаЗначений;
    ТаблицаДанных.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("Строка"));
    ТаблицаДанных.Колонки.Добавить("Склад", Новый ОписаниеТипов("Строка"));
    ТаблицаДанных.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    ТаблицаДанных.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    ТаблицаДанных.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    ТаблицаДанных.Колонки.Добавить("ДокументПрихода", Новый ОписаниеТипов("Строка"));
    ТаблицаДанных.Колонки.Добавить("ДатаПрихода", Новый ОписаниеТипов("Дата"));
    
    Пока Выборка.Следующий() Цикл
        СтрокаТаблицы = ТаблицаДанных.Добавить();
        СтрокаТаблицы.Контрагент = Выборка.Контрагент;
        СтрокаТаблицы.Склад = Выборка.Склад;
        СтрокаТаблицы.Количество = Выборка.Количество;
        СтрокаТаблицы.Сумма = Выборка.Сумма;
        СтрокаТаблицы.Цена = Выборка.Цена;
        СтрокаТаблицы.ДокументПрихода = Выборка.ДокументПрихода;
        СтрокаТаблицы.ДатаПрихода = Выборка.ДатаПрихода;
    КонецЦикла;
    
    //Даллее идет код, кторый передает ТЗ на форму для отображения на интерфейсе
    
    
КонецПроцедуры
19 timurhv
 
13.07.25
15:00
(18) Добавьте на форму реквизит с типом таблицы и именем "ТаблицаДанных" с такими же колонками. Далее на сервере заполняйте ее без "ТаблицаДанных = Новый таблицаЗначений;" и описания колонок
20 Pashabr
 
13.07.25
15:09
(19) Не создавать ТЗ в процедуре? Сразу из выборки заполнять реквизит "ТаблицаДанных" на форме? Строки ниже убрать из процедуры совсем?


ТаблицаДанных = Новый ТаблицаЗначений;
    ТаблицаДанных.Колонки.Добавить("Контрагент", Новый ОписаниеТипов("Строка"));
    ТаблицаДанных.Колонки.Добавить("Склад", Новый ОписаниеТипов("Строка"));
    ТаблицаДанных.Колонки.Добавить("Количество", Новый ОписаниеТипов("Число"));
    ТаблицаДанных.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
    ТаблицаДанных.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
    ТаблицаДанных.Колонки.Добавить("ДокументПрихода", Новый ОписаниеТипов("Строка"));
    ТаблицаДанных.Колонки.Добавить("ДатаПрихода", Новый ОписаниеТипов("Дата"));
21 timurhv
 
13.07.25
15:16
(20) Да, очищайте только перед заполнением
22 Pashabr
 
13.07.25
15:16
(19) Спасибо, добрый человек. Я несколько дней по инету лазил, везде написано, что из запроса ТЗ сформировать и потом передавать на форму. Ине получалось. Теперь все работает!
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.