Имя: Пароль:
1C
1С v8
Как вывести расчетное значение в поле ТаблицеФормы (аналогично ПриВыводеСтроки)?
0 Электроник2
 
22.12.22
13:07
Здравствуйте. Есть управляемая форма документа с табличной частью (ТаблицаФормы). В таб. части есть два реквизита Сумма1 и Сумма2, на форме размещен только Сумма1. Как в таблице в ячейках колонки Сумма1 вывести, например, сумму "Сумма1+Сумма2"? Т.е. не статичный текст, а расчетный показатель, которого нет в таб. части документа.
1 denk
 
22.12.22
16:36
1. В реквизитах формы добавляем реквизит: Объект.ТабЧасть.РасчетноеПоле. 2. Выводим добавленный реквизит на  форму. 3. В модуль формы добавляем серверную процедуру заполнения добавленного реквизита. 4. Добавляем вызов процедуры заполнения в обработчики модуля формы: ПриЧтенииНаСервере(), ПослеЗаписиНаСервере(), ПриОткрытии().
2 Электроник2
 
23.12.22
15:50
(1) Пробовал так делать. Но при вызове серверных контекстных процедур это поле, естественно, очищается (при вызове ЗначениеВРеквизитФормы()). И ладно бы оно очищалось при событиях только ТаблицыФормы. Но еще и при событиях реквизитов шапки документа, например, при изменении Организации, при котором напрямую не меняется табличная часть.
3 ass1c
 
23.12.22
16:54
(2) не понятно почему "процедур это поле, естественно, очищается". Покажи процедуру заполнения этого реквизита и + к примеру код изменения организации
4 unenu
 
23.12.22
17:01
(3) в ЗУПЕ форма списка ШтатноеРасписание

&НаСервереБезКонтекста
Процедура СписокПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    
    Если Строки.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    УстановитьПривилегированныйРежим(Истина);
    
    ДанныеСтроки = Строки[Строки.ПолучитьКлючи()[0]].Данные;
    Если Не (ДанныеСтроки.Свойство("СтавокЗанято") Или ДанныеСтроки.Свойство("СтавокСвободно")) Тогда
        Возврат;
    КонецЕсли;
    
    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр("ПозицииКОбновлению", ОбщегоНазначения.ВыгрузитьКолонку(Строки.ПолучитьКлючи(), "Ссылка"));
    Запрос.УстановитьПараметр("ДатаОстатков", Настройки.ПараметрыДанных.Элементы.Найти("ДатаОстатков").Значение);
    
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗанятостьПозицийШтатногоРасписанияИнтервальный.ПозицияШтатногоРасписания КАК ПозицияШтатногоРасписания,
        |    СУММА(ЗанятостьПозицийШтатногоРасписанияИнтервальный.КоличествоСтавок) КАК КоличествоСтавок
        |ИЗ
        |    РегистрСведений.ЗанятостьПозицийШтатногоРасписанияИнтервальный КАК ЗанятостьПозицийШтатногоРасписанияИнтервальный
        |ГДЕ
        |    ЗанятостьПозицийШтатногоРасписанияИнтервальный.ПозицияШтатногоРасписания В(&ПозицииКОбновлению)
        |    И НЕ ЗанятостьПозицийШтатногоРасписанияИнтервальный.ВидЗанятостиПозиции В (ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиПозицийШтатногоРасписания.ПустаяСсылка), ЗНАЧЕНИЕ(Перечисление.ВидыЗанятостиПозицийШтатногоРасписания.Свободна))
        |    И &ДатаОстатков МЕЖДУ ЗанятостьПозицийШтатногоРасписанияИнтервальный.ДатаНачала И ЗанятостьПозицийШтатногоРасписанияИнтервальный.ДатаОкончания
        |
        |СГРУППИРОВАТЬ ПО
        |    ЗанятостьПозицийШтатногоРасписанияИнтервальный.ПозицияШтатногоРасписания";
    
    Данные = Запрос.Выполнить().Выгрузить();
    Данные.Индексы.Добавить("ПозицияШтатногоРасписания");
    
    Для Каждого КлючЗначение Из Строки Цикл
        
        СтавокЗанято = 0;
        ДанныеПозиции = Данные.Найти(КлючЗначение.Ключ.Ссылка, "ПозицияШтатногоРасписания");
        Если ДанныеПозиции <> Неопределено Тогда
            СтавокЗанято = ДанныеПозиции.КоличествоСтавок;
        КонецЕсли;
        
        Если ДанныеСтроки.Свойство("СтавокЗанято") Тогда
            КлючЗначение.Значение.Данные["СтавокЗанято"] = СтавокЗанято;
        КонецЕсли;
        
        Если ДанныеСтроки.Свойство("СтавокСвободно") Тогда
            КлючЗначение.Значение.Данные["СтавокСвободно"] = КлючЗначение.Значение.Данные["КоличествоСтавок"] - СтавокЗанято;
        КонецЕсли;
        
    КонецЦикла;
    
    УстановитьПривилегированныйРежим(Ложь);
    
КонецПроцедуры
5 Электроник2
 
26.12.22
10:31
(3) Пример. Есть форма документа "Реализация товаров и услуг", на ней поле Организация и табличная часть Товары. В ТЧ товары я добавил реквизит ОбщаяСумма и заполнил его при открытии/создании формы. При изменении организации выполняется код:


&НаКлиенте
Процедура ОрганизацияПриИзменении(Элемент)
    
    ОрганизацияПриИзмененииСервер();
    
КонецПроцедуры

&НаСервере
Процедура ОрганизацияПриИзмененииСервер()

    ТекОбъект = РеквизитФормыВЗначение("Объект");
    // В ТекОбъект, естественно, нет моего добавленного реквизита.
    
    ЗаполнениеДокументов.ПриИзмененииЗначенияОрганизации(ТекОбъект, мСтруктураПараметровДляПолученияДоговора);
    
    ЗначениеВРеквизитФормы(ТекОбъект, "Объект");  // Мой реквизит пустой.
    
КонецПроцедуры


И на форме таких реквизитов много, которые передают управление на сервер для манипуляций с объектом.
6 Электроник2
 
26.12.22
10:32
(4) События ПриПолученииДанныхНаСервере нет у Таблицы упр. формы.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn