Столкнулся с интересной особенностью 1С: если на форме списка присутствуют пользовательские фильтры, и пользователь «включил/выключил» этот фильтр, то нет никакого способа это событие отловить
Единственное решение какое я придумал, это подключение обработчика ожидания при событии на открытие формы вида:
&НаКлиенте
Функция ПосчитатьИтогиНаКлиенте()
ПосчитатьИтогиНаСервере();
КонецФункции
Функция ПосчитатьИтогиНаСервере()
ВсеЭлементы=СписокВКоллекциюЗначений();
ЗадолженостьПоУведомлению=0;ОстатокЗадолженности=0;ТекущаяЗадолженость=0;
для каждого стр из ВсеЭлементы цикл
ЗадолженостьПоУведомлению=ЗадолженостьПоУведомлению+стр.ЗадолженостьПоУведомлению;
ОстатокЗадолженности=ОстатокЗадолженности+стр.ОстатокЗадолженности;
ТекущаяЗадолженость=ТекущаяЗадолженость+стр.ТекущаяЗадолженость;
КонецЦикла;
элементы.Список.ПодчиненныеЭлементы.ЗадолженостьПоУведомлению.ТекстПодвала=ЗадолженостьПоУведомлению;
элементы.Список.ПодчиненныеЭлементы.ОстатокЗадолженности.ТекстПодвала=ОстатокЗадолженности;
элементы.Список.ПодчиненныеЭлементы.ТекущаяЗадолженость.ТекстПодвала=ТекущаяЗадолженость;
КонецФункции
Задача: обеспечить раскраску строк по условию на форме списка
Решение: может быть разным, в зависимости от сложности условий и способа вывода данных на форму.
Вариант 1: данные формируются запросом СКД, динамически:
В этом случае заходим во вкладку «Условное оформление» и настраиваем собственно условия:
Вариант 2: данные формируются «как обычно».
В этом случае в свойствах формы ищем реквизит «Условное оформление» и настраиваем по тому-же принципу как и в Варианте 1
Вариант 3: подходит для «сложных» вариантов оформления, когда при помощи первого и второго варианта, нужного эффекта добиться не удалось. В свойстве «ПриОткрытии» размещаем код вида:
&НаКлиенте
Процедура УстановитьУсловноеОформлениеДляПоляДатаДоговора()
// Создание элемента условного оформления
ЭлементыОформления = СписокПартийДС.УсловноеОформление.Элементы.Добавить();
ЭлементыОформления.Использование = Истина;
// Настройка оформляемого поля
Поля = ЭлементыОформления.Поля.Элементы.Добавить();
Поля.Использование = Истина;
Поля.Поле = Новый ПолеКомпоновкиДанных("ДатаДог");
Поля = ЭлементыОформления.Поля.Элементы.Добавить();
Поля.Использование = Истина;
// Создание условия для элемента оформления
Отбор = ЭлементыОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.Использование = Истина;
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше;
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ДатаДог");
Отбор.ПравоеЗначение = ТекущаяДата() + 31557600;
// Установка цвета оформления
Оформление = ЭлементыОформления.Оформление;
Оформление.УстановитьЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветФона"), WebЦвета.ЛососьСветлый);
КонецПроцедуры
Если в таблице значений на форме, это штатный функционал, то на форме списка, там где по сути табличный документы, возможно лишь вывести пустую строку подвала. А итоги считать нужно самостоятельно. Описанный способ не претендует на идеальную правильность. Скорее это всего лишь самый простой способ. Есть более красивые способы — при помощи правки СКД динамического списка и т.д. Но я СКД недолюбливаю, потому у меня так.
1. Ставим галочку подвал в свойствах списка
2. На событие «ПриАктивацииСтроки» у списка вешаем следующий код:
&НаСервере
Функция СписокВКоллекциюЗначений()
//Получаем схема компановки данных (здесь хранится текст запроса)
Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
//Получаем настройки пользователя (отборы, сортировки и т.п.)
Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
//Выводим динамический список в таблицу значений
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, , ,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);
//Возвращаем полученную таблицу значений
Возврат Результат;
КонецФункции
&НаСервере
Функция ПосчитатьИтогиНаСервере()
ВсеЭлементы=СписокВКоллекциюЗначений();
ЗадолженостьПоУведомлению=0;ОстатокЗадолженности=0;ТекущаяЗадолженость=0;
для каждого стр из ВсеЭлементы цикл
ЗадолженостьПоУведомлению=ЗадолженостьПоУведомлению+стр.ЗадолженостьПоУведомлению;
ОстатокЗадолженности=ОстатокЗадолженности+стр.ОстатокЗадолженности;
ТекущаяЗадолженость=ТекущаяЗадолженость+стр.ТекущаяЗадолженость;
КонецЦикла;
элементы.Список.ПодчиненныеЭлементы.ЗадолженостьПоУведомлению.ТекстПодвала=ЗадолженостьПоУведомлению;
элементы.Список.ПодчиненныеЭлементы.ОстатокЗадолженности.ТекстПодвала=ОстатокЗадолженности;
элементы.Список.ПодчиненныеЭлементы.ТекущаяЗадолженость.ТекстПодвала=ТекущаяЗадолженость;
КонецФункции
&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
ПосчитатьИтогиНаСервере();
КонецПроцедуры
Проблема: при разборе файла формата xlsx часть дат в ячейках сдвигается ровнехонько на 4 года назад. Т.е. открываем файл экселем — видим 2026 год. Открываем файл при помощий табличного документа 1С — видим 2022.
Долго думал.. Хорошо рядом человек оказался, который с этой проблемой уже сталкивался. Оказывается некоторые файлы xlsx сохраняются в формате в котором «эпоха» начинается с 1900г, а часть с 1904. И определить средствами 1С, в каком формате сохранен именно этот файл, нет никакой возможности — только самому делать поправку даты: