|   |   | 
| 
 | УТ 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 14.07.25✎ 10:40 | 
        (19) Спасибо, добрый человек. Я несколько дней по инету лазил, везде написано, что из запроса ТЗ сформировать и потом передавать на форму. И не получалось. Теперь все работает!     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |