1с отображать итоги в подвале
Многие задаются вопросами расчета итогов динамических списков в управляемых формах. Здесь мы не будем претендовать на академичность, оставим споры, что мол это не нужно, что это все равно что считать бородатых мужиков на движущемся эскалаторе, что это дополнительная нагрузка. Все это понимают, Кто не понимает - поймет на практике. Поэтому основываемся на. "снегопад, снегопад, если женщина просит. " или "..а мня плевать - мне очень хочется.." Я попытался решить практические проблемы при расчете и выводе итогов. В приложении примеры расчета итогов в иерархическом справочнике и журнале документов.
Рассмотрим на примере неких колонок Поступило и Списано в динамическом списке
1. Размещаем реквизиты итогов
На форму добавляем числовые реквизиты ИтогиПоступилоПодвал и ИтогиСписноПодвал и назначаем их в подвал таблицы к полям Поступило и Списано в качестве ПутьКДаннымПодвала
2. Отлавливаем изменения на клиенте
Т.к. не существует событий, связанных с изменение отбора и с поиском в динамическом списке, попробуем реализовать свою систему слежения. Для отслеживания изменений в отборе периодически нужно контролировать пользовательские настройки компоновщика списка, период списка (для журналов и документов), а так же использовать событие ПриСменеТекущегоРодителя ддля иерархического справочника.
Пока нерешенной проблемой остается изменение поиска. Стоит заметить, что если поиск выполняется средствами СУБД (не через индекс полнотекстового поиска), то настройки компоновки содержат отбор, соответствующий поиску. Поэтому, если использоватья явный вызов расчета на сервере, то итоги будут рассчитаны с учетом поиска. Но вот отследить на клиенте когда нужно вызвать сервер при поиске пока у меня не получилось.
Добавляем на форме строковый реквизит НастройкаСписка, который и будет нашим флагом. Запускаем обработчик ожидания и следим за изменениями. Если что-то поменялось - обращаемся на сервер за расчетом итогов
3. Расчитываем реквизиты итогов на сервере
Тут нужно сказать спасибо разработчикам за предоставленные фунуции для динамических списков ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных(). Изначально эти функции предназначены для вывода списков в отчет, но, немного подправив полученую схему компоновки и настройки, получем в результате таблицу значений с одной строкой, содержащей итоги по нужным нам полям.
Вот пример для журнала банковских выписок:
Для иерархичеких списков выявилась одна особенность: СКД не содержит отбора по текущему родителю (ну может я его не нашел). Поэтому в случае со справочником можно доработать настройки типа так:
2)Итоговый расчет;
С Табличным полем-Типом значения СправочникСписок.РасчетНаГород
В этом табличном соответсвенно появляются колонки Код,Наименование и ВсегоЗаГород.
Вопрос: Как мне Вывести итог в колонке ВсегоЗаГород в табличном поле?!
Дело в том что такая команда как ТЗ.Итог("ВсегоЗаГород") вообще не распознается,а в настройках "ОтображатьИтогиВПодвале" вообще нет.
(5) deniseek77, Все дело в том что я использую табличное поле взятое из списка Расчет на город,в связи с этим "Просто поставьте галку"-Невозможна.
(7) Kami4, Можно добавить еще 1 реквизит , при полученииданных() вычислять значение этого реквизита, а в подвале указать, что значение подвала- это этот реквизит
Это обычное приложение, судя по ветке 8.0/8.1. В форме для табличной части есть процедура ПриВыводеСтроки - там напишите алгоритм заполнения колонки в таблице итоговый расчет. Алгоритм будет выполняться для каждой выводимой на экран строки.
(12) Kami4, ОТвет зависит тот того, правильно ли вообще понял вопрос. Если речь идет о том в в экранной форме в табличную часть в колонку строки надо выводить какие то итоговые данные из другой таблицы, связанной с той, что выводим по какому то полю, то в процедуре ПриВыводеСтроки можно написать например запрос к нужной таблице и записать в нужную колонку результат.
Как то так, данные можно и не запросом получать, а приведенный код - просто как это примерно можно сделать.
Хотя возможно я не пправильно понял задачу - исходных данных как-то маловато:-)
(13) Alex_E, (8) deniseek77, (4) БольшойЧайник, Попробую еще раз объяснить.
В Форму Справочника Итоговый расчет , я вставил СправочникСписок.РасчетПоГороду.
В этом табличном поле есть колонка ВсегоЗаГород ,которая не отображается в подвале ИТОГ по колонке ВсегоЗаГород. Как эту процедуру выполнить?
С Уважением, Артур
(14) Kami4, В строках отображает, надо что бы отображалось в подвале? Тогда в (2) всё сказали. Надо встать на табличное поле, в палитре свойств поставить галку "Подвал", встать на нужную колонку и поставить галку - "ОтображатьИтогиВПодвале".
(15) Alex_E, Может показаться странным,но этого пункта у меня нет.Еще раз повторюсь,что табличное поле я взял из СправочникСписок.РасчетПоГороду. Именно из-за этого я не могу поставить голочку ОтображатьИтогиВПодвале. Попробуйте сделать то же самое что и я. Что посоветуете?!
(16) Kami4, Ничего не посоветую, т.к. эта галка в свойствах колонки таблицы обычной формы есть всегда, вне зависимости от источника этой таблицы. Для управляемой формы ситуация несколько иная - там ещё необходимо указать какие итоги надо выводить, да состав свойств другой. Мысль одна - Вы ищете галку не в тех свойтвах
ОтображатьВПодвале - прям на картинке - просто это 8.1, писать на которой сейчас вообще моветон - её уже сто лет с поддержки сняли, и любую конфигурацию под 8.1 можно просто конвертнуть и использовать на 8.2
(24) Kami4, Открыл программу и вообще ничего не понял. Почему разработка на 8.1? Справочник ИтоговыйРасчет вообще не имеет ни одного реквизита кроме стендартных, табличное поле выведенное на форму элемента получается ни к чему не привязанным и это таблица, куда выведен справочник ВсегоЗаГород. Как это должно работать? Если нужно вывести список ВсегоЗаГород - тогда вроде как можно просто вывести форму списка, если надо вывести только для одной строки - то как минимум это должен быть подчиненный справочник.
Итог не отображается т.к. реквизит таблицы имеет тип не число, а ссылку на реквизит другого справочника ( в (27) про это написано). Непонятно как должна работать такая структура.
(30) Kami4, В данном НЕРАБОЧЕМ примере итог в подвале ТЧ получить нельзя - т.к. итог выводится только по числовым полям, а стоимость тут имеет тип ссылка. Итог можно вывести в новый реквизит формы ниже таблицы, сосчитав его тем же запросом.
(35) Alex_E, Спасибо заработала. Огромное спасибо Вам!
----------------------------------
С Уважением,Артур
Просто если у данной колонки тип не количество, то отображать итог в подвале невозможен. В таком случае необходимо изменить данную колонку неа тип количество, а значение из правочника заполнять как количественное. и все будет очень даже норм.
В управляемой форме вместо галочки итог по колонке необходимо выбрать Объект.ТЧ.ИтогКолонка в Поле ПутьКДаннымПодвала
myoker; freeek; mailrum2004; s0u1; Henistaromin; brunhilda; adhocprog; NerichSB; KirillM1987; Gang031; bad_wag; Sintson; bow; A1ex_2; + 14 – Ответить
Типовой алгоритм добавляет программно колонки для ТЧ документа.
Если для добавляемого поля на форме сделать:
, то вываливается ошибка установки значения.
- работает в типовом коде.
Каким образом можно вывести итог по такой колонке в подвал?
(11) Да даже если бы были, таблица формы вроде бы авто итог умеет считать только реквизитам метаданных.
(11) Ага) Итого в подвале считаются только по реквизитам ТЧ. Реквизиты данных форм автоматом не рассчитываются, над руками
Для сч = 1 По 12 Цикл
Элементы["НачисленияЗначение" + сч].ТекстПодвала = Объект.Начисления.Итог("Значение" + сч);
Напиши процедуру обновления итогов подвала и вперед)
(15)
Изменение любой добавленной колонки - ПриИзмненении
Изменение самой таблицы. потому что могут удалить строку - ПриИзмненении
При программном заполнении/Очистке самой ТЧ - по коде над пройтись
(15) ПриИзменении таблицы покрывает все прочие обработчики, но не покроет программный подбор или заполнение. Учитывайте также, что прямое изменение текста подвала на клиенте будет делать неявный серверный вызов, поэтому лучше использовать обновление значений итогов через реквизиты формы.
В общем, в моем случае решилось вот таким образом.
Что делать в случае заполнения ТЧ дополнительной обработкой - остается вопросом.
При этом ПутьКДанным = "Объект.Начисления", НомерПоказателя = от 1 до 12
(4)Т.е. нужно создать еще один реквизит формы, в него каким-то образом присваивать значение итога и сделать
А это когда происходит?
(7) Странно. Я внешку выше приложил. В ней 1 элемент руками создан, и 2 программно. У всех итоги рассчитываются
(10)По всей видимости это не работает, потому что в ТЧ изначально нет колонок Значение1. ЗначениеN, они добавляются так же программно.
(11) Да даже если бы были, таблица формы вроде бы авто итог умеет считать только реквизитам метаданных.
(11) Ага) Итого в подвале считаются только по реквизитам ТЧ. Реквизиты данных форм автоматом не рассчитываются, над руками
Для сч = 1 По 12 Цикл
Элементы["НачисленияЗначение" + сч].ТекстПодвала = Объект.Начисления.Итог("Значение" + сч);
Напиши процедуру обновления итогов подвала и вперед)
(14)Ага, спасибо. Еще надо бы придумать, в какой момент ее вызывать.
По всей видимости, при обновлении отображения, ну или в каждом обработчике "ПриИзмненении" для Элементы.НачисленияЗначениеN
(15)
Изменение любой добавленной колонки - ПриИзмненении
Изменение самой таблицы. потому что могут удалить строку - ПриИзмненении
При программном заполнении/Очистке самой ТЧ - по коде над пройтись
(15) ПриИзменении таблицы покрывает все прочие обработчики, но не покроет программный подбор или заполнение. Учитывайте также, что прямое изменение текста подвала на клиенте будет делать неявный серверный вызов, поэтому лучше использовать обновление значений итогов через реквизиты формы.
В общем, в моем случае решилось вот таким образом.
Что делать в случае заполнения ТЧ дополнительной обработкой - остается вопросом.
Продолжаем изучать программирование в системе 1С Предприятие. Сегодня поговорим о том, как подсчитать итоги по колонке в табличной части. Нам нужно чтобы итог подсчитывался автоматически.
В предыдущих статья я рассказывал, как создать новый документ потом мы с вами написали пару процедур для автоматического подсчета суммы в табличной части. Теперь сделаем итог для этой колонки. Сегодня в примере я буду использовать тот же документ, который мы создали ранее. Поэтому советую вам ознакомиться с предыдущими статья, Создание документа, Подсчет итогов в строке табличной части.
Автоподсчёт итогов по колонке в табличной части 1С
И так преступим, запускаем 1С в режиме конфигуратора. Далее переходим в созданный ранее документ. Открываем его и переходим на вкладку формы и открываем её.
В окне формы нужно кликнуть два раза на табличную часть справа должно появиться окно свойств таблицы. В нем ищем пункт Подвал и ставим галочку.
После чего на форме в табличной части снизу должен появиться подвал.
Теперь на нужно чтобы в колонке Сумма подсчитывался итого. Для этого на вкладке Элементы ищем пункт с Название МатериалыСумма и кликаем на нем два раза. Справа появиться свойства поля в них ищем пункт
ТекстПодвала и вписываем Итого. А в пункте ПутьКДаннымПОдвала кликаем на три точечки.
В открывшемся окне нужно выбрать ИтогоСумма.
Теперь запускаем отладку и проверяем считается ли итог по колонке в табличной части документа.
Вот мы и сделали автоматический подсчет итогов по колонке. Таким образом можно подсчитать итого во всех колонках и в любых документах.
Скриншоты, опубликованные в данной статье, являются цитатами и иллюстрациями программного продукта «1C:Предприятие», авторское право на который принадлежит ЗАО 1С.
Отображение ИТОГа в Подвале таблицы
Похожие FAQ
Еще в этой же категории
Как на управляемой форме разместить список регистра сведений с отбором? 15
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом " ДинамическийСписок" В поле " Основная табли Поле выбора
Заполнение списка значений в элементе поле выбора на форме 10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип – Произвольный, Использование – Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Как установить параметр динамического списка? 9
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента Для вывода используется исп Как обновить динамический список или реквизит на форме клиента? 7
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Форма
Программное создание таблицы значений с условным оформлением 6
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Посмотреть все в категории Работа с Формой (Диалог) и её элементами
В управляемых формах существует возможность вывода итоговой суммы по колонке табличной части, без программирования. Путем настроек свойств колонки табличной части в конфигураторе. Порядок действий следующий:
- Открыть конфигуратор;
- Открыть форму документа, где присутствует табличная часть, по которой будем выводить итоги;
- Открыть свойства колонки, по которой необходимо вывести итого (нажать правой кнопкой мыши -> свойства);
- Заполнить свойства в соответствии в соответствии со скриншотом;
При этом как видно из скриншота есть возможность выбрать сумму по колонке, либо количество строк в документе.
После этого обновляем программу (f5), переходим из конфигуратора в пользовательский режим, внизу таблицы появятся рассчитанные итоги.
Данная публикация навеяна ностальгией по отборам в конфигурациях на обычных формах (ЗУП2.5, УПП3.1 и т.п.), где в контекстном меню можно было отобраться по выделенному значению и получить итоги в подвале с учетом этого отбора.
В управляемых формах также есть отборы (Найти, найти в найденном), но к сожалению, итоги не зависят от отборов. Данная публикация - некий костыль, позволяющий создать подобный механизм.
Сразу оговорюсь, решение не оптимальное, комфортно работать можно только с табличными частями, где количество строк не более 1-2 тыс. (при отмене отбора загружается первоначальная таблица с приблизительной оценкой по 1 секунде на каждую тысячу строк)
Зато реализация достаточно простая, ниже код для документа Отражение зарплаты в бухучете из ЗУП 3.1:
В форме документа должен быть реквизит АдресХранилища (строка) и контекстные кнопки ОтборПоЗначениюТекущейКолонки и ОтключитьОтбор
&НаСервере
Процедура ОтборПоЗначениюВТекущейКолонкеНаСервере ( Ключ , Значение )
ОригиналТЗ = Объект . НачисленнаяЗарплатаИВзносы . Выгрузить ();
Структура = Новый Структура ( Ключ , Значение );
ТЗ = Объект . НачисленнаяЗарплатаИВзносы . Выгрузить ( Структура );
Объект . НачисленнаяЗарплатаИВзносы . Загрузить ( ТЗ );
Если АдресХранилища = "" Тогда
АдресХранилища = ПоместитьВоВременноеХранилище ( ОригиналТЗ , ЭтаФорма . УникальныйИдентификатор );
ИначеЕсли ТипЗнч ( ПолучитьИзВременногоХранилища ( АдресХранилища )) = Тип ( "Структура" )
Или ПолучитьИзВременногоХранилища ( АдресХранилища )= Неопределено Тогда
АдресХранилища = ПоместитьВоВременноеХранилище ( ОригиналТЗ , ЭтаФорма . УникальныйИдентификатор );
КонецЕсли;
&НаКлиенте
Процедура ОтборПоЗначениюВТекущейКолонке ( Команда )
ПолеОтбора = Прав ( Элементы . НачисленнаяЗарплатаИВзносы . ТекущийЭлемент . Имя , СтрДлина ( Элементы . НачисленнаяЗарплатаИВзносы . ТекущийЭлемент . Имя ) - СтрДлина ( ЭтаФорма . ТекущийЭлемент . Имя ));
ПолеОтбора = ?( ПолеОтбора = "Сотрудник" , "ФизическоеЛицо" , ПолеОтбора ); //В ЗУП3.1 док ОтражениеЗарплатыВБухучете Поле ввода НачисленнаяЗарплатаИВзносыСотрудник, хотя данные - физлицо
ОтборПоЗначениюВТекущейКолонкеНаСервере ( ПолеОтбора , Элементы . НачисленнаяЗарплатаИВзносы . ТекущиеДанные [ ПолеОтбора ]);
//Проверка на изменение ТЧ при отборе (призаписи и проведении)
&НаСервере
Процедура ПроверитьТаблицу ()
Оригинал = ПолучитьИзВременногоХранилища ( АдресХранилища );
Если ТипЗнч ( Оригинал ) = Тип ( "ТаблицаЗначений" ) И
Оригинал . Количество () <> Объект . НачисленнаяЗарплатаИВзносы . Количество () Тогда
Объект . НачисленнаяЗарплатаИВзносы . Загрузить ( Оригинал );
КонецЕсли;
КонецПроцедуры
//. стандартный код процедуры
КонецПроцедуры
//. стандартный код процедуры
КонецПроцедуры
//. стандартный код процедуры
КонецПроцедуры
Во вложении этот код в виде расширения для ЗУП3.1. Тестировалось на платформе 1С:Предприятие 8.3 (8.3.15.1778), Зарплата и управление персоналом КОРП, редакция 3.1 (3.1.10.309), тонкий клиент.
Читайте также: