1с скд программно изменить табличный документ
Тема не нова - похожие решения были и на 8.0. К написанию статьи меня подтолкнул коллега, т.к. я это чудом не считаю. Несколько раз я видел тонны сложнейшего, и посему нерабочего кода, целью которого было сделать нечто похожее средствами, которые для этого не предназначены. В статье дан простейший пример, показывающий, как можно применять средства СКД для редактирования сложной структуры данных, например, табличных частей документов. В частности, рассмотрена работа с набором данных типа "Объект" и событием "Обработка расшифровки"
Описание проблемы и предпосылки
Периодически приходится решать задачи удобного ввода информации пользователем по образу Excel, например, самый простой "План продаж" по месяцам, в котором горизонтально по колонкам расположены месяцы, а вертикально - некая аналитика. Раньше в типовых конфигурациях 1С данная задача не была решена вообще никак. Пользователю предлагалось заполнить обычную табличную часть вручную, добавляя строки и заполняя их датами и необходимой аналитикой. Весь ужас такого ввода объяснять не нужно. Потом разработчики отраслевых решений в "доэскадэшную" эпоху догадались использовать всю мощь макета табличного документа и в "Подрядчик строительства" от "Импульс ИВЦ" уже можно было наблюдать весьма недурное решение в блоке Бюджетирование. Но код был неуниверсальный, сложный и крайне тяжело переносился на другие похожие задачи. В данной статье я постараюсь показать, как решить эту задачу быстро, красиво и с минимальными затратами по времени. Также код, который вы напишете, используя этот пример, вы сможете легко переносить на другие свои решения.
Реализация задачи
Описана для обычных форм, но обработка содержит и УФ без использования модальности.
Нам понадобится: сам объект редактирования (в данном случае табличная часть), макет СКД, компоновщик настроек компоновки данных, элемент управления "поле табличного документа", обработчик "Обработка расшифровки".
Макет СКД представляет собой соединение двух наборов данных, каждый из которых имеет тип "Набор данных - объект":
Настройки вывода просты и примитивны - это обычная таблица с итогами:
В форме необходимо разместить следующие реквизиты:
В обработчике расшифровки должен быть размещен отказ от стандартной обработки, а также описание набора действий, которые необходимо совершить, когда пользователь кликает по ячейке двойным кликом.
Данный код позволяет определить по какой именно ячейке кликнул пользователь. Далее, зная значение Номенклатуры и Периода можно найти соответствующую строку в табличной части и присвоить в ней реквизиту "Сумма" нужное значение, после можно программно нажать на кнопку "Обновить".
Производительность
Существует 2 способа непосредственного ввода значения при двойном клике по ячейки:
1) Через диалоговое окно методами ВвестиЗначение() или ВвестиЧисло()
- этот способ применен в данном примере.
Преимущества: не усложняет код, высокая производительность.
Недостатки: вылетает дополнительное окно ввода.
При таком способе ввода в каждой ячейке, как и при формировании обычного отчета на СКД, содержится лишь некий объект типа "ИдентификаторРасшифровкиКомпоновкиДанных", который по сути представляет собой число.
2) Непосредственно в ячейку, как в Excel.
Данный способ с применением СКД можно увидеть в ERP 2.0.
Преимущества: очень красиво, у неискушенных вызывает мгновенный вау-эффект, окон не вылетает.
Недостатки: низкая производительность, усложняет код. Нужно понимать, что при таком способе ввода в каждую ячейку придется помещать элемент управления "Поле ввода". Ячеек в поле табличного документа может быть несколько тысяч, т.е. несколько тысяч полей ввода. Вывод этого всего в поле табличного документа не будет быстрым даже в толстом клиенте.
Особенности работы в тонком клиенте без использования режима модальности.
Для работы в тонком клиенте необходимо помещать схему СКД и Данные расшифровки во временное хранилище. Хранить полученные адреса удобно в реквизитах формы.
Записываем адреса хранилищ в обработчике ПриСозданииНаСервере()
Обработчики событий Поля табличного документа и асинхронные вызовы
Обратите внимание, что во все конструкторы объектов СКД передаются сохраненные адреса АдресДанныеРасшифровки, АдреcМакетСКД. И почти все процедуры работают на клиенте. Но к сожалению не только лишь все могут работать на клиенте на клиенте реализованы не все объекты СКД. Иногда придется нырнуть на сервер, например для работы с объектом типа ДанныеРасшифровкиКомпоновкиДанных.
Обработчик ПолеТабличногоДокументаПредставлениеПриАктивизацииОбласти необходим для того, чтобы редактировать число(показатель) можно было непосредственно в ячейке, без использования дополнительных диалоговых окон.
Что еще?
UPD 07.07.2021 Добавлена реализация для тонкого клиента на управляемой форме без использования модальности.
1) Никто не запрещает размещать на форме стандартные настройки компоновщика настроек.
2) Можно добавлять в схему СКД любую другую информацию (с помощью других наборов данных), которая не содержится в табличной части редактируемого объекта, но которая необходима для принятия решения при вводе данных (например свойства номенклатуры).
3) Группировка данных в таблице также может быть сколь угодно сложной, в зависимости от решаемой задачи.
4) Можно и нужно использовать всю мощь СКД и возможностей условного оформления.
Сталкивался ли кто-нибудь с необходимостью программно отредактировать поля табличного поля, уже после вывода отчета (на СКД)? С какой стороны к этому можно подойти вообще?
Например, набор данных расшифровки я могу перебрать в цикле и получить программно значения всех полей отчета. Но вот для редактирования полей табличного поля нужна уже другая технология.
когда реализовывал подобное принял за правило:
- высота выводимых строк отчетов строк 1 строка ТабДок
- Первая ячейка строки содержит идентификатор строки Отчета
- кешировал соответствие имени области первой ячейки и соответствующим измерениям
(1) Расскажи подробнее, пожалуйста:
- в какой процедуре можно поймать ячейки табличного поля для их окольцовывания и кэширования (кстати - что это?)
делать расшифровку для каждой ячейки табличного документа, сохраняя соотвествие имяячейки - структура этих параметров (значения ресурсов получить нельзя, только если делать через внешнюю таблицу набор и применять фильтр), но это будет очень долго для всех ячеек
редактируется поле в табличном документе - по имение ячеек можно поменять это значение для массива строк таблицы внешнего источника
(6) И поле табличного документа, и табличное поле прекрасно редактируются, независимо от того, чем именно в них выведены данные.
(12) Игнор вопроса. Ну я так сразу и понял, что вы балабол.
(8) Никто не мешает, в принципе - но, с другой стороны, и помощников рядом не наблюдается.
(11) Три недели это жесть - на что же ушли такие временные ресурсы? Мне надо - потому что у меня трехмесячный проект по созданию адского отчета, от которого содрогнется мир. Так вот, август кончается, а отчет работает прекрасно за исключением одно колонки, которая почему-то считается неправильно. Так что мне очень надо пройтись по отчету после вывода, рассчитать этот показатель из остальных ресурсов и сдать уже проект.
(9) Так а в какой процедуре можно поймать табличное поле, да еще и с перебором по ячейкам?
(13)универсальный документ с вводом данных аля эксель, типа поддрежки вычислений по формулам в ячейках
Так а в какой процедуре можно поймать табличное поле, да еще и с перебором по ячейкам?
прикомпоновке результата, либо после вывода таличноо документа обходить весь диапазон R и С, либо в обработкарасшифровки табличного документа
Одна из задач автоматизации — ускорение работы пользователя, что во многом достигается путем сокращения повторяющихся рутинных действий. У многих пользователей есть постоянные отчеты, для открытия которых они находят команду в меню, вводят отборы и параметры в открывшейся форме, нажимают «сформировать». В таких случаях разработчик 1С может создать команды программного запуска отчета с открытием и настройкой, что позволит сразу получить готовый отчет, а механизм системы компоновки данных, называемый в сокращении СКД, представляет ему для этого обширный инструментарий. В этой статье мы познакомимся с несколькими методами программного запуска отчета с открытием и различной настройкой, из которых каждый сможет выбрать наиболее подходящий.
Сначала получаем форму.
Если отчет хранится в базе тогда выполняем на клиенте код:
Если нужен не «вариант по умолчанию»
Далее получаем настройки:
Через серверный вызов получаем настройки и если нужно заполняем параметры Компоновщика в отдельной процедуре.
Загружаем измененные настройки в компоновщик
Код выполняется на клиенте, сначала мы формируем структуру с необходимыми параметрами формы, а потом вызываем процедуру открытия. Часто используемые параметры в данном случае это:
- СформироватьПриОткрытии — нужен чтобы отчет открылся сразу сформированным.
- Отбор — Устанавливает отбор на результат СКД.
- КлючВарианта — Имя варианта настроек для отчетов с несколькими вариантами.
Сначала получаем схему компоновки данных. Схема может быть получена из разных источников: общий макет, макет прикладного объекта, такого как справочник или отчет, макет из внешней обработки.
Код выполняется на сервере.
Получение локального макета
Получение макета произвольного отчета
Получение макета во внешней обработке
Получение макета из внешней обработки или отчета
Далее мы получаем настройки. Настройки СКД могут быть взяты из разных источников. Мы можем их получить из самой СКД:
Мы можем создать новый компоновщик настроек на основе схемы и получить настройки из него.
Мы можем получить настройки с отдельного компоновщика настроек, добавленного на произвольную форму.
И когда будем формировать
Далее программно заполняем параметры Компоновщика. Об этом подробно в разделе 4 .
Объявляем создаем необходимые объекты:
Создаем макет компоновки с помощью компоновщика макета:
Если результат выполнения СКД нужно вывести в таблицу значений то соответствующий тип генератора нужно указать в параметрах:
Инициализируем процессор компоновки данных
Создаем процессор вывода:
Для вывода в таблицу значений используется другой процессор вывода:
Запускаем процесс вывода:
Теперь мы можем проводить нужные операции с полученными данными.
Если вывод в таблицу значений завершился ошибкой “Не поддерживается вывод таблиц и диаграмм в универсальную коллекцию значений” значит настройки СКД не подходят для такой выгрузки, и нужно их изменить, об этом ниже.
При программном формировании СКД как в пункте 2 у нас есть огромное количество возможностей по управлению отчетом. Опишем самые часто используемые из них.
После того, как присвоено значение переменной СхемаКомпоновкиДанных — через нее мы можем получить доступ к формирующим запросам схемы через свойство коллекцию НаборыДанных . Элемент набора данных имеет интересующее нас свойство Запрос . Это текстовый параметр, содержащий в себе запрос. С помощью функций редактирования текста, его можно изменить, например, добавить отбор по недоступному через КомпоновщикНастроек полю.
Или если с добавлением нового параметра
Также при получении настроек можно выбрать не «настройки по умолчанию», а один из вариантов настроек.
Переменная Настройки содержит в себе всю палитру настроек которая доступна в редакторе СКД в разделе “Настройки”. Наиболее часто из них программно редактируются отборы, параметры и структура, в случае когда отчет с табличной структурой надо вывести в таблицу значений. Рассмотрим их подробнее.
Параметры
Все параметры создаются при создании исходного отчета, исключение если параметр был добавлен при редактировании запроса. Значение существующего параметра устанавливается следующим образом:
Добавление параметра делается следующим образом
Отбор
У отборов нет специальных функций по установке значений. Поэтому нужно перебирать коллекцию циклом.
Этот код установит значение для отбора, а если такого отбора нет в настройках, то добавит. В случае если точно известно, есть или нет такой отбор — то код можно упростить.
Структура
Для адаптации отчета к выводу в таблицу значений нужно очистить структуру группировок отчета и создать поле группировки “Детальные записи”.
Программист может упростить работу пользователя по вводу параметров и отборов если есть некоторая закономерность в них, но они всё таки не фиксированы. К примеру, сравнительный отчет по продажам за этот месяц этого года и аналогичные месяца трех предыдущих годов.
Приведенные примеры кода были протестированы на платформе 1С:Предприятие 8.3 (8.3.13.1690).
В этой статье я расскажу, что такое постобработка в 1С СКД, какие методы постобработки существуют. Вы узнаете, как программно сформировать отчет в СКД, а также я приведу несколько практических примеров постобработки в СКД.
Итак, что же понимается под постобработкой в СКД. Обычно (если не всегда) такое словосочетание применяется для отчетов, построенных на СКД. В результате выполнения отчета пользователем мы имеем какой-то табличный документ. Не всегда с помощью функционала СКД удается получить необходимую форму табличного документа. Поэтому после (пост) выполнения отчета, с помощью методов объекта ТабличныйДокумент выполняется некоторая доработка результата до приемлемого вида (формы).
Чтобы вклиниться в процесс формирования отчета вам необходимо программно получить результат отчета. Поэтому постобработка ВСЕГДА связана с программным формированием отчета. Можно конечно на форме сделать специальную кнопку, чтобы пользователь нажимал ее после формирования отчета, но это будет выглядеть нелепо. Поэтому будем считать, что для постработки отчет на 1С СКД формируется программно всегда.
Есть два способа как можно программно выполнить отчет на СКД:
- Простой. Из формы отчета (нужно чтобы у отчета была форма) вызвать метод СкомпоноватьРезультат. Вы заменяете стандартную кнопку Сформировать собственной командой. В этой команде вызываете указанный выше метод, передав (в случае управляемой формы) режим компоновки – Непосредственно. Затем выполняете постобработку над полученным табличным документом (обычно это реквизит «Результат»). Метод неудобен тем, что нужно добавлять форму (если ее нет), нужно формировать отчет непосредственно, плюс довольно часто для доработки табличного документа нужно переходить на сервер (что не есть хорошо)
- Чуть сложнее. В модуле отчета в предопределенной процедуре «ПриКомпоновкеРезультата» программно формируете отчет. Стандартный шаблон (код) для этого приведен ниже. После получения табличного документа вы выполняете свой код постобработки. Для этого подхода существует еще один вариант реализации, когда обработка выполняется не после формирования табличного документа, а в процессе. Делается это с помощью поэлементного вывода в табличный документ с помощью методов процессора компоновки данных – НачатьВывод, Следующий, ВывестиЭлемент.
С помощью этого шаблона вы можете программно формировать отчет на СКД:
Теперь рассмотрим конкретные примеры, когда вам может понадобиться постобработка. В этих примерах я не всегда буду приводить полный код решения. Где-то будет достаточно идеи, а где-то ссылки на уже готовый отчет.
Вывод картинок
До недавнего времени только с помощью постобработки в отчетах на СКД можно было вывести картинки в отчете. Начиная с релиза платформы 8.3.14 в СКД 1С:Предприятие 8 появилась возможность вывода картинок без постобработки.
Вот такой кусок кода в ПриКомпоновкеРезультата выводить после программного формирования картинку в колонке прайса:
Отчет прайс лист мы разбирали в нашем курсе по СКД
Нумерация колонок отчета
Здесь мы рассмотрим вариант постобработки из формы отчета
Повторение шапки отчета и вывод колонтитулов
В этой статье на Инфостарте разбирается, как с помощью поэлементного вывода можно повторить шапку отчета на каждой странице и как вывести колонтитулы.
Повторение шапки реализуется кодом:
Вывод колонтитулов реализуется через свойство ВерхнийКолонтитул табличного документа:
«Красивые» заголовки для группировок колонок таблицы
Вот так заголовки выводятся совсем некрасиво:
Вот так чуть лучше:
Настройка для такого варианта (для второй и третей группировок колонок):
И только постобработкой (хотя может быть есть какой-то другой секретный способ) можно сделать так:
Вставить разрыв страницы для группировки
В этой статье на Инфостарте рассматривается способ как с помощью поэлементного вывода отчета можно добавить разрыв страницы для группировки в СКД
В этой статье мы разберем использование макетов в 1С СКД. При разработке отчетов иногда возникает необходимость в более сложной компоновке результата (в табличный документ) чем это позволяют типовые средства. Например, это может быть формирование печатной формы документа типа ТОРГ-12 – и такое тоже можно сделать средствами СКД, особенно если необходимы такие возможности как произвольные отборы. Или это могут быть какие-то особенные элементы отчета, которые нельзя сделать, используя стандартные возможности 1С – например, собственные итоги.
Сначала рассмотрим с вами стандартные возможности подсистемы СКД в 1С, которые позволяют получить отчет заданной формы.
Первое чем определяется форма (структура) отчета в СКД это настройка группировок
С помощью выбранных полей можно определить, какая информация будет выводиться в отчет. В выбранных полях имеется возможность компоновки выводимых полей с помощью групп:
На закладке «Другие настройки» есть также много параметров, отвечающих за компоновку отчетов – расположение полей в группировке, расположение ресурсов, вывод общих итогов, отборов, параметров. Про все эти настройки вы можете прочитать в нашей статье.
С помощью вкладки «Условное оформление» нельзя поменять структуру отчета, но можно сделать визуальное оформление ячеек табличного документа – установить цвет, шрифт, ширину или высоту ячейки и другие параметры.
В этом разделе мы рассмотрели основные типовые средства СКД, с помощью которых можно настроить структуру и оформление табличного документа без использования макета. Если вы использовали все эти возможности, но не получили желаемый результат – переходите к использованию макетов. О чем мы поговорим в следующем разделе.
Итак, вы поняли, что без использования макетов ваш отчет реализовать не получится и приняли решение о его (их) использовании. Должен вас сразу предупредить – применение макетов в отчете на СКД в 1С часто не дает возможность пользователю изменять структуру отчета. То есть макеты, настроенные для одного варианта отчета, могут неправильно работать в другом варианте отчета, если поменялся состав группировок. Если вас устраивает такое ограничение, то продолжим.
Настройка макетов производится на закладке «Макеты». Существуют несколько видов макеты, которые показаны на рисунке:
Основную сложность при настройке макетов вызывает (в том числе у меня) обилие видов макетов в сочетании с типом макета:
В этой статье я не буду расписывать какое сочетание в каком случае имеет смысл применять, потому что это не сильно интересно – это раз. Два – на этот счет есть документация от 1С и есть также хорошая шпаргалка в виде статьи на ИС.
Если мне нужно сделать отчет с использованием макетов, то я не запоминаю все варианты сочетаний, а руководствуюсь только следующими правилами:
- Макет поля. Практически никогда не нужен. Практически все можно сделать с помощью условного оформления. Разве что заполнить как-то хитро параметр расшифровки для этого поля.
- Макет группировки. Используется для строк (колонок), то есть для собственно вывода данных отчета. Используется в основном тип макета «заголовок»
- Макет заголовка группировки. Используется для вывода шапки (таблицы) отчета. Обычно использую этот макет только для первой группировки, чтобы «нарисовать» какую-то хитрую шапку для таблицы отчета (тип макета – заголовок). Если выбрать тип макета «подвал», то можно сделать подавал отчета – с подписями и т.п.
- Макет ресурсов. Используется для группировки заданной таблицей. Используется в основном тип макета «заголовок»
При добавлении любого макета вы можете привязать его к группировке или по имени или по набору полей.
Связывание макета с данными производится через параметры и параметры расшифровки.
В поле выражение вы связываете параметр макета (или параметр расшифровки) с данными. Как видно здесь можно использовать выражения на языке выражений СКД и также имеется доступ через точку к реквизитам объектов.
Нужно также понимать, что добавленные макеты разных видов (группировки, заголовка группировки, ресурсов) в 1С обычно связаны между собой. То есть, например, шапка (макет заголовка) таблицы обычно по количеству полей соответствует строкам (макет группировки), а макет ресурса по количеству полей обычно соответствует макету группировки колонки.
Небольшой пример макета и небольшой лайфхак в этом же отчете. Добавим макеты для отчета, на котором мы тренировались:
Здесь мы добавили макет группировки для группировки первого уровня (настойки отчета на картинке ниже):
И добавили макет заголовка для этой же группировки. Получим результат:
Как видно в отчете выводится заголовок второй группировки, который нам не нужен. Добавим макет заголовка группировки для второго уровня:
И не будем задавать для него область
В этом случае заголовок не выводится как нам было нужно:
Теперь разберем несколько примеров, когда даже с помощью макетов в 1С не получится реализовать задачу.
Первый пример. Казалось бы, простая задача – для отчета с двумя группировками выводить разрыва страницы для каждой строки первой группировки, чтобы новое значение выводилось с новой страницы. Вроде обычная задача для макета – тут по идее нам пригодится макет группировки и тип макета «подвал». Рассмотрим на примере нашего отчета
Мы добавили нужный нам макет. Добавили в область для этого макета разрыв страницы. Чтобы выводился подвал группировки, дополнительно нужно указать его вывод (не только в начале, но и в конце)
В итоге получим
Как видно разрыв страницы не выводится. Видимо удаляется при формировании результата. Такое вот странное поведение системы. По крайней мере в релизе платформы 8.3.14.
Существует вариант решения, основанный на программном формировании отчета и поэлементном выводе. Суть решения заключается в следующем – добавляем новый параметр «разрыв страницы», добавляем группировку, в которую включаем в выбранные поля только этот параметр, выводим программно отчет с помощью поэлементного вывода, при этом анализируем – если выводится строка, содержащая наш параметр, то ее пропускаем и вместо нее выводим разрыв страницы.
Для нашего отчета мы поступим немного иначе – добавлять новую группировку не будем. Ее роль будет выполнять макет подвала, в которую мы выведем наш параметр разрыва.
Текст модуля формирования возьмем из статьи. Учтем комментарий к статье, в котором указано, что мы можем просто пропустить строку с текстом «Разрыв», а не скрывать область, устанавливая ей высоту 1. И получим необходимый результат:
Как видно разрыв страницы теперь выводится.
Второй пример достаточно экзотичный, но также демонстрирует в некотором смысле «бессилие» типовых средств 1С СКД. Суть задачи заключается в том, что в отчет нужно вывести два несвязанных набора данных горизонтально. Типовые средства в СКД позволяют выводить такие наборы только вертикально. По этим двум ссылка приведено решение, которое мы с вами разберем.
Шаг 1. Выводим наши наборы с помощью детальных записей вертикально
Аналогично задаются выбранные поля для расхода.
Шаг 2. Нам нужно разделить таблицы друг от друга. Для этого добавляем макеты заголовка группировки.
Шаг 3. Копируем модуль формирования отчета из статьи и дорабатываем его для своего отчета. Тезисно, что мы делаем в модуле:
Читайте также: