Как сделать подвал в 1с
Рейтинг: 70
Отображение итогов в подвале табличной части документа (управляемая форма) с учетом отбора. На примере документа Отражение зарплаты в бухучете из ЗУП 3.1 (расширение)
Данная публикация навеяна ностальгией по отборам в конфигурациях на обычных формах (ЗУП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), тонкий клиент.
ignsv --> ignsv
Пытаюсь выводить две строки итогов для ТЧ для колонки "Количество" по некоему условию. Например количество красных и количество синих шариков
Делаю так:
1.для ТабПоля флаг Подвал
2. Для колонки "Количество" флаг Выводить итоги в подвал + для предыдущей колонки тоже флаг (Для текста "Итого:1, Итого2)
3. В Обработчике ПриПолученииДанных:
При открытии документа итоги выводятся в две строки, а при изменении итоги уже сбиваются в одну строку и мой текст игнорируется ( хотя по отладчику он выполняется и все делится правильно)
Что подскажите?
logist --> logist
ignsv --> ignsv
при "ручном" выводе итогов, флаг ОтображатьИтогиВПодвале для колонки не нужно ставить (ибо подвал будет считается по сумме колонки)
kivals --> kivals
Есть глюк платформы с выводом текста в подвале с програмным использование "Символы.ПС". Натыкался в свое время на версии 8.2.13 или 8.2.14 - возможно этот тот случай (может и до сих пор не побороли).
Многие задаются вопросами расчета итогов динамических списков в управляемых формах. Здесь мы не будем претендовать на академичность, оставим споры, что мол это не нужно, что это все равно что считать бородатых мужиков на движущемся эскалаторе, что это дополнительная нагрузка. Все это понимают, Кто не понимает - поймет на практике. Поэтому основываемся на. "снегопад, снегопад, если женщина просит. " или "..а мня плевать - мне очень хочется.." Я попытался решить практические проблемы при расчете и выводе итогов. В приложении примеры расчета итогов в иерархическом справочнике и журнале документов.
Рассмотрим на примере неких колонок Поступило и Списано в динамическом списке
1. Размещаем реквизиты итогов
На форму добавляем числовые реквизиты ИтогиПоступилоПодвал и ИтогиСписноПодвал и назначаем их в подвал таблицы к полям Поступило и Списано в качестве ПутьКДаннымПодвала
2. Отлавливаем изменения на клиенте
Т.к. не существует событий, связанных с изменение отбора и с поиском в динамическом списке, попробуем реализовать свою систему слежения. Для отслеживания изменений в отборе периодически нужно контролировать пользовательские настройки компоновщика списка, период списка (для журналов и документов), а так же использовать событие ПриСменеТекущегоРодителя ддля иерархического справочника.
Пока нерешенной проблемой остается изменение поиска. Стоит заметить, что если поиск выполняется средствами СУБД (не через индекс полнотекстового поиска), то настройки компоновки содержат отбор, соответствующий поиску. Поэтому, если использоватья явный вызов расчета на сервере, то итоги будут рассчитаны с учетом поиска. Но вот отследить на клиенте когда нужно вызвать сервер при поиске пока у меня не получилось.
Добавляем на форме строковый реквизит НастройкаСписка, который и будет нашим флагом. Запускаем обработчик ожидания и следим за изменениями. Если что-то поменялось - обращаемся на сервер за расчетом итогов
3. Расчитываем реквизиты итогов на сервере
Тут нужно сказать спасибо разработчикам за предоставленные фунуции для динамических списков ПолучитьИсполняемуюСхемуКомпоновкиДанных() и ПолучитьИсполняемыеНастройкиКомпоновкиДанных(). Изначально эти функции предназначены для вывода списков в отчет, но, немного подправив полученую схему компоновки и настройки, получем в результате таблицу значений с одной строкой, содержащей итоги по нужным нам полям.
Вот пример для журнала банковских выписок:
Для иерархичеких списков выявилась одна особенность: СКД не содержит отбора по текущему родителю (ну может я его не нашел). Поэтому в случае со справочником можно доработать настройки типа так:
В этой статье мы разберем использование макетов в 1С СКД. При разработке отчетов иногда возникает необходимость в более сложной компоновке результата (в табличный документ) чем это позволяют типовые средства. Например, это может быть формирование печатной формы документа типа ТОРГ-12 – и такое тоже можно сделать средствами СКД, особенно если необходимы такие возможности как произвольные отборы. Или это могут быть какие-то особенные элементы отчета, которые нельзя сделать, используя стандартные возможности 1С – например, собственные итоги.
Сначала рассмотрим с вами стандартные возможности подсистемы СКД в 1С, которые позволяют получить отчет заданной формы.
Первое чем определяется форма (структура) отчета в СКД это настройка группировок
С помощью выбранных полей можно определить, какая информация будет выводиться в отчет. В выбранных полях имеется возможность компоновки выводимых полей с помощью групп:
В этом разделе мы рассмотрели основные типовые средства СКД, с помощью которых можно настроить структуру и оформление табличного документа без использования макета. Если вы использовали все эти возможности, но не получили желаемый результат – переходите к использованию макетов. О чем мы поговорим в следующем разделе.
Итак, вы поняли, что без использования макетов ваш отчет реализовать не получится и приняли решение о его (их) использовании. Должен вас сразу предупредить – применение макетов в отчете на СКД в 1С часто не дает возможность пользователю изменять структуру отчета. То есть макеты, настроенные для одного варианта отчета, могут неправильно работать в другом варианте отчета, если поменялся состав группировок. Если вас устраивает такое ограничение, то продолжим.
Основную сложность при настройке макетов вызывает (в том числе у меня) обилие видов макетов в сочетании с типом макета:
В этой статье я не буду расписывать какое сочетание в каком случае имеет смысл применять, потому что это не сильно интересно – это раз. Два – на этот счет есть документация от 1С и есть также хорошая шпаргалка в виде статьи на ИС.
Если мне нужно сделать отчет с использованием макетов, то я не запоминаю все варианты сочетаний, а руководствуюсь только следующими правилами:
При добавлении любого макета вы можете привязать его к группировке или по имени или по набору полей.
Связывание макета с данными производится через параметры и параметры расшифровки.
В поле выражение вы связываете параметр макета (или параметр расшифровки) с данными. Как видно здесь можно использовать выражения на языке выражений СКД и также имеется доступ через точку к реквизитам объектов.
Нужно также понимать, что добавленные макеты разных видов (группировки, заголовка группировки, ресурсов) в 1С обычно связаны между собой. То есть, например, шапка (макет заголовка) таблицы обычно по количеству полей соответствует строкам (макет группировки), а макет ресурса по количеству полей обычно соответствует макету группировки колонки.
Небольшой пример макета и небольшой лайфхак в этом же отчете. Добавим макеты для отчета, на котором мы тренировались:
Здесь мы добавили макет группировки для группировки первого уровня (настойки отчета на картинке ниже):
И добавили макет заголовка для этой же группировки. Получим результат:
Как видно в отчете выводится заголовок второй группировки, который нам не нужен. Добавим макет заголовка группировки для второго уровня:
И не будем задавать для него область
В этом случае заголовок не выводится как нам было нужно:
Теперь разберем несколько примеров, когда даже с помощью макетов в 1С не получится реализовать задачу.
В итоге получим
Как видно разрыв страницы не выводится. Видимо удаляется при формировании результата. Такое вот странное поведение системы. По крайней мере в релизе платформы 8.3.14.
Для нашего отчета мы поступим немного иначе – добавлять новую группировку не будем. Ее роль будет выполнять макет подвала, в которую мы выведем наш параметр разрыва.
Как видно разрыв страницы теперь выводится.
Шаг 1. Выводим наши наборы с помощью детальных записей вертикально
Аналогично задаются выбранные поля для расхода.
Шаг 2. Нам нужно разделить таблицы друг от друга. Для этого добавляем макеты заголовка группировки.
Шаг 3. Копируем модуль формирования отчета из статьи и дорабатываем его для своего отчета. Тезисно, что мы делаем в модуле:
Читайте также: