1с редактирование данных прямо в отчете скд
Тема не нова - похожие решения были и на 8.0. К написанию статьи меня подтолкнул коллега, т.к. я это чудом не считаю. Несколько раз я видел тонны сложнейшего, и посему нерабочего кода, целью которого было сделать нечто похожее средствами, которые для этого не предназначены. В статье дан простейший пример, показывающий, как можно применять средства СКД для редактирования сложной структуры данных, например, табличных частей документов. В частности, рассмотрена работа с набором данных типа "Объект" и событием "Обработка расшифровки"
Описание проблемы и предпосылки
Периодически приходится решать задачи удобного ввода информации пользователем по образу Excel, например, самый простой "План продаж" по месяцам, в котором горизонтально по колонкам расположены месяцы, а вертикально - некая аналитика. Раньше в типовых конфигурациях 1С данная задача не была решена вообще никак. Пользователю предлагалось заполнить обычную табличную часть вручную, добавляя строки и заполняя их датами и необходимой аналитикой. Весь ужас такого ввода объяснять не нужно. Потом разработчики отраслевых решений в "доэскадэшную" эпоху догадались использовать всю мощь макета табличного документа и в "Подрядчик строительства" от "Импульс ИВЦ" уже можно было наблюдать весьма недурное решение в блоке Бюджетирование. Но код был неуниверсальный, сложный и крайне тяжело переносился на другие похожие задачи. В данной статье я постараюсь показать, как решить эту задачу быстро, красиво и с минимальными затратами по времени. Также код, который вы напишете, используя этот пример, вы сможете легко переносить на другие свои решения.
Реализация задачи
Описана для обычных форм, но обработка содержит и УФ без использования модальности.
Нам понадобится: сам объект редактирования (в данном случае табличная часть), макет СКД, компоновщик настроек компоновки данных, элемент управления "поле табличного документа", обработчик "Обработка расшифровки".
Макет СКД представляет собой соединение двух наборов данных, каждый из которых имеет тип "Набор данных - объект":
Настройки вывода просты и примитивны - это обычная таблица с итогами:
В форме необходимо разместить следующие реквизиты:
В обработчике расшифровки должен быть размещен отказ от стандартной обработки, а также описание набора действий, которые необходимо совершить, когда пользователь кликает по ячейке двойным кликом.
Данный код позволяет определить по какой именно ячейке кликнул пользователь. Далее, зная значение Номенклатуры и Периода можно найти соответствующую строку в табличной части и присвоить в ней реквизиту "Сумма" нужное значение, после можно программно нажать на кнопку "Обновить".
Производительность
Существует 2 способа непосредственного ввода значения при двойном клике по ячейки:
1) Через диалоговое окно методами ВвестиЗначение() или ВвестиЧисло()
- этот способ применен в данном примере.
Преимущества: не усложняет код, высокая производительность.
Недостатки: вылетает дополнительное окно ввода.
При таком способе ввода в каждой ячейке, как и при формировании обычного отчета на СКД, содержится лишь некий объект типа "ИдентификаторРасшифровкиКомпоновкиДанных", который по сути представляет собой число.
2) Непосредственно в ячейку, как в Excel.
Данный способ с применением СКД можно увидеть в ERP 2.0.
Преимущества: очень красиво, у неискушенных вызывает мгновенный вау-эффект, окон не вылетает.
Недостатки: низкая производительность, усложняет код. Нужно понимать, что при таком способе ввода в каждую ячейку придется помещать элемент управления "Поле ввода". Ячеек в поле табличного документа может быть несколько тысяч, т.е. несколько тысяч полей ввода. Вывод этого всего в поле табличного документа не будет быстрым даже в толстом клиенте.
Особенности работы в тонком клиенте без использования режима модальности.
Для работы в тонком клиенте необходимо помещать схему СКД и Данные расшифровки во временное хранилище. Хранить полученные адреса удобно в реквизитах формы.
Записываем адреса хранилищ в обработчике ПриСозданииНаСервере()
Обработчики событий Поля табличного документа и асинхронные вызовы
Обратите внимание, что во все конструкторы объектов СКД передаются сохраненные адреса АдресДанныеРасшифровки, АдреcМакетСКД. И почти все процедуры работают на клиенте. Но к сожалению не только лишь все могут работать на клиенте на клиенте реализованы не все объекты СКД. Иногда придется нырнуть на сервер, например для работы с объектом типа ДанныеРасшифровкиКомпоновкиДанных.
Обработчик ПолеТабличногоДокументаПредставлениеПриАктивизацииОбласти необходим для того, чтобы редактировать число(показатель) можно было непосредственно в ячейке, без использования дополнительных диалоговых окон.
Что еще?
UPD 07.07.2021 Добавлена реализация для тонкого клиента на управляемой форме без использования модальности.
1) Никто не запрещает размещать на форме стандартные настройки компоновщика настроек.
2) Можно добавлять в схему СКД любую другую информацию (с помощью других наборов данных), которая не содержится в табличной части редактируемого объекта, но которая необходима для принятия решения при вводе данных (например свойства номенклатуры).
3) Группировка данных в таблице также может быть сколь угодно сложной, в зависимости от решаемой задачи.
4) Можно и нужно использовать всю мощь СКД и возможностей условного оформления.
Если вам необходимо реализовать обработку по вводу данных с сохранением в регистр сведений, табличную часть либо как нибудь еще обработать, причём: 1. Структура данных должна настраиваться, 2. Данные могут быть разными, и может меняться их состав, 3. Должна иметься возможность производить всеразличные отборы. 4. Данных относительно не много (соотношение КоличествоИзмененийФормы/Производительность склоняется на КоличествоИзмененийФормы). То, как вариант можно использовать всю мощь СКД. При этом будет реализована большая функциональность при малом количестве кода. Представленные обработки/шаблоны можно запускать в любой базе, где есть справочник Организации.
Очень помогла и натолкнула на разработку в этом направлении вот эта публикация, единственно, что она основана на отчете и в обработке не применима, поэтому мне пришлось реализовывать данный функционал, как говориться с 0. Что-то подобное реализовано здесь хотя я не проверял.
Ограничения данного подхода:
1. Все измерения, по которым нужно получить значения должны быть выведены в группировках. Если вы не вынесли измерение в группировку, его значения как и его самого вы получить не сможете
2. Детальные записи использовать не получится, ни одного измерения вы не получите.
3. Производительность, в моем случае пользователи готовы подождать несколько секунд. Кроме того использование отбора уменьшает количество выводимых данных, а следовательно вывод происходит при этом мгновенно.
4. Я не советую использовать данный метод, если вам нужно пересчитывать суммы в иерархии при изменении суммы ячейки.
В данной публикации представлены 2 обработки шаблона.
Вторая обработка генерирует Элементы формы и МакетСКД, но для демонстрации использования настроек компоновки, использует встроенный МакетСКД (кроме 3-ей вкладки). Данный шаблон можно использовать, если вам необходимо выводить данные для ввода пользователям с разными Макетами СКД (запросами, настройками. ), при этом данные выводятся в разные вкладки. На каждую вкладку будет приходится свой Табличный документ, КомпроновщикНастроек, СхемаКомпоновкиДанных, Кнопки. В данной обработке реализован весь тот же функционал, что и в первой обработке + возможность редактировать структуру выводимых данных.
Есть отчет сделанный в СКД. Такого вида:
http://www.picshare.ru/view/6942691/
Все работает нормально. Поле "Оплачено" заполняется при проведении соответствующего документа, поле "Остаток" отражает разницу между полями "К оплате" и "Оплачено"
http://www.picshare.ru/view/6942692/
поле "Остаток" переходящий с предыдущего периода.
Вопрос такой, как можно сделать "Оплачено" редактируемым и при изменении данного поля чтобы автоматически пересчитывался остаток на каждую дату(поле "Остаток") и затем в итогах?
2. в модуле формы Результату цепляешь обработчик ПриИзмененииСодержимогоОбласти - в нем смотришь что где было поменяно, и дальше алгоритм расчета
- Алилуя теперь редактируется.
2. в модуле формы Результату цепляешь обработчик ПриИзмененииСодержимогоОбласти - в нем смотришь что где было поменяно, и дальше алгоритм расчета
выдает ошибку:
В самом примере все ок, туда передается адрес
Это как то связано с тем что пример сделан на упр формах а мой отчет на толстом клиенте?
Д (8) Да, там есть поле(редактируемое пользователем) от которого должны перерасчитываться остатки на дату и по итогам.
(12) на первых порах можно отрубить стандартную форму настроек, подсунуть свою - чтоб не повадно было чего-то менять
а так да - на написание почти универсального алгоритма, учитывающего различные комбинации вложенности группировок как по строкам, так и по столбцам, с использованием массивов-структур-массивов-структур, заданием расчетных формул, влияющих и зависимых полей - у меня ушло НЕ МЕНЕЕ ПОЛУГОДА
пусть ТС решает что нужнее
(13) И. Твое резюме. Стоит ли желание буха увидеть в отчете "чтобы автоматически пересчитывался остаток" полугода рабочего времени?
в моем случае это была целая подсистема планирования продаж, я и не жалею - куча народа реально пользуется
а если жестко зафиксировать структуру настроек, отрубив стандартную форму, то в его случае можно наваять гораздо быстрее
(15) Да скорее всего отрублю возможность пользователям менять структуру отчета. В принципе это и не нужно пользователям.
(11) Объявил в модуле отчета переменную, тут же вставил функцию ПолучитьПолеПоРасшифровкеОбластиСКД. Параметр областьТабличногоПоля у меня называется СуммаРасход(я так понимаю это наименование той самой редактируемой ячейки в макете?), затем из модуля формы обращаюсь к этой функции. Но при проверке ругается: Переменная не определена (СуммаРасход)
(17) не-е-е. так не пойдет, макеты тут ни причем
у тебя есть табличный документ, в СКД он обычно носит имя Результат, так вот ОбластьСКД в данном случае подразумевает под собой область этого табдока Результат, т.е. по-сути одну ячейку, ячейку и передавай
в моих отчетах редактируемых "видов" ячеек было несколько,
1) из модуля объекта в ПриКомпоновкеРезультата(ДокументРезультат, . )
.
Поле = ПолучитьПолеПоРасшифровкеОбластиСКД(ДокументРезультат.Область(индСтр, индКол));
.
вернет тебе только название самого поля но не его значение
2) из модуля формы
.
.
(18) Спасибо за подробные ответы! Получилось достать содержимое ячейки. Но у автора той статьи в функция ПолучитьВсеЗначенияРасшифровки() возвращает структуру Название ячейки и содержимое ячейки, затем в функция ЗаписатьПланСервер() и дальше пересчет итогов.
(20) да без разницы, главное чтобы сам помнил и ориентировался что у тебя в коде возвращается
лично мне проще написать две почти похожие функции, а спустя пол года, мельком взглянув, по названию понять что же возвращается функцией
(21) А если у меня нет группировок, как правильно переделать процедуру ПересчетИтоговВТаблице(. )? А то ругается : Значение не является значением объектного типа (Родитель)
(21) . при изменении данного поля чтобы автоматически пересчитывался остаток на каждую дату(поле "Остаток") и затем в итогах?
(22) что там за код в (4) я не смотрел, и честно говоря нет ни времени ни желания
у тебя есть значение до редактирования - можно запоминать то что в ТекущейОбласти в обработчике ПриАктивизации для табдока
у тебя есть новое значение после ввода пользователем в ПриИзмененииСодержимогоОбласти, считаешь разность между ними, а дальше в цикле все ячейки остатка на последующие даты увеличиваешь на эту дельту, в т.ч. и итог
Как добавить параметр для отчета на форму, созданного на СКД? Чтобы было, как например в оборотно-сальдовой ведомости, выбор начала и окончания периода и, например, организации. В свое время, долгое время поисков не увенчалось успехом. После небольшого перерыва в разработке на 1С, попытки найти что-либо подобное, опять же не увенчались успехом. На форумах находил только стандартный код построителя отчета. Конечно, можно изменить и его, но для несложного отчета, когда требуется для удобства пользователя просто вынести реквизиты на форму, чтобы не залезать каждый раз в настройки отчета, менять стандартный код не требуется. Нужно только внести небольшие коррективы. Ниже, привожу текст кода:
Процедура ДатаНачПриИзменении ( Элемент )
ПараметрДатаНач = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы.Найти ( "НачалоПериода" );
ПараметрДатаНач . Использование = Истина;
ПараметрДатаНач . Значение = НачалоДня ( ДатаНач );
КонецПроцедуры
Писать в модуле формы, в обработчике ПриИзменении элемента. В примере - элемент "Начало периода".
В принципе, это все. Как дополнение, можно сделать еще обработчик ПередОткрытием формы, куда записать следующий код для открытия отчета уже с предустановленными параметрами:
Процедура ПередОткрытием ( Отказ , СтандартнаяОбработка )
ПараметрДатаНач = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы . Найти ( "НачалоПериода" ) ;
ПараметрДатаНач . Использование = Истина;
ПараметрДатаНач . Значение = ДатаНач ;
ПараметрДатаКон = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы . Найти ( "КонецПериода" );
ПараметрДатаКон.Использование = Истина;
ПараметрДатаКон.Значение = ДатаКон ;
ПараметрОрганизация = КомпоновщикНастроек . Настройки . ПараметрыДанных . Элементы . Найти ( "Организация" );
ПараметрОрганизация.Использование = Истина;
ПараметрОрганизация.Значение = Организация ;
КонецПроцедуры
Значение параметров ДатаНач, ДатаКон и Организация для этой процедуры нужно определить отдельно.
Тема не нова — похожие решения были и на 8.0. К написанию статьи меня подтолкнул коллега, т.к. я это чудом не считаю. Несколько раз я видел тонны сложнейшего, и посему нерабочего кода, целью которого было сделать нечто похожее средствами, которые для этого не предназначены. В статье дан простейший пример, показывающий, как можно применять средства СКД для редактирования сложной структуры данных, например, табличных частей документов. В частности, рассмотрена работа с набором данных типа «Объект» и событием «Обработка расшифровки»
Описание проблемы и предпосылки
Периодически приходится решать задачи удобного ввода информации пользователем по образу Excel, например, самый простой "План продаж" по месяцам, в котором горизонтально по колонкам расположены месяцы, а вертикально — некая аналитика. Раньше в типовых конфигурациях 1С данная задача не была решена вообще никак. Пользователю предлагалось заполнить обычную табличную часть вручную, добавляя строки и заполняя их датами и необходимой аналитикой. Весь ужас такого ввода объяснять не нужно. Потом разработчики отраслевых решений в "доэскадэшную" эпоху догадались использовать всю мощь макета табличного документа и в "Подрядчик строительства" от "Импульс ИВЦ" уже можно было наблюдать весьма недурное решение в блоке Бюджетирование. Но код был неуниверсальный, сложный и крайне тяжело переносился на другие похожие задачи. В данной статье я постараюсь показать, как решить эту задачу быстро, красиво и с минимальными затратами по времени. Также код, который вы напишете, используя этот пример, вы сможете легко переносить на другие свои решения.
Реализация задачи
Нам понадобится: сам объект редактирования (в данном случае табличная часть), макет СКД, компоновщик настроек компоновки данных, элемент управления "поле табличного документа", обработчик "Обработка расшифровки".
Макет СКД представляет собой соединение двух наборов данных, каждый из которых имеет тип "Наборданных-объект":
Настройки вывода просты и примитивны — это обычная таблица с итогами:
В форме необходимо разместить следующие реквизиты:
В
В обработчике расшифровки должен быть размещен отказ от стандартной обработки, а также описание набора действий, которые необходимо совершить, когда пользователь кликает по ячейке двойным кликом.
Данный код позволяет определить по какой именно ячейке кликнул пользователь. Далее, зная значение Номенклатуры и Периода можно найти соответствующую строку в табличной части и присвоить в ней реквизиту "Сумма" нужное значение, после можно программно нажать на кнопку "Обновить".
Производительность
Существует 2 способа непосредственного ввода значения при двойном клике по ячейки:
1) Через диалоговое окно методами ВвестиЗначение() или ВвестиЧисло()
— этот способ применен в данном примере.
Преимущества: не усложняет код, высокая производительность.
Недостатки: вылетает дополнительное окно ввода.
При таком способе ввода в каждой ячейке, как и при формировании обычного отчета на СКД, содержится лишь некий объект типа "ИдентификаторРасшифровкиКомпоновкиДанных", который по сути представляет собой число.
2) Непосредственно в ячейку, как в Excel.
Данный способ с применением СКД можно увидеть в ERP 2.0.
Преимущества: очень красиво, у неискушенных вызывает мгновенный вау-эффект, окон не вылетает.
Недостатки: низкая производительность, усложняет код. Нужно понимать, что при таком способе ввода в каждую ячейку придется помещать элемент управления "Поле ввода". Ячеек в поле табличного документа может быть несколько тысяч, т.е. несколько тысяч полей ввода. Вывод этого всего в поле табличного документа не будет быстрым даже в толстом клиенте.
Что еще?
1) Никто не запрещает размещать на форме стандарнтые настроки компоновщика настроек.
2) Можно добавлять в схему СКД любую другую информацию (с помощью других наборов данных), которая не содержится в табличной части редактируемого объекта, но которая необходима для принятия решения при вводе данных (например свойства номенклатуры).
3) Группировка данных в таблице также может быть сколь угодно сложной, в зависимости от решаемой задачи.
4) Можно и нужно использовать всю мощь СКД и возможностей условного оформления.
Читайте также: