Редактирование данных прямо в отчете СКД (как в Excel). Теперь с пересчетом итогов!


Вам не подходит обычная форма ввода данных
Клиент хочет прямо в отчете изменять цифры
Тогда этот шаблон поможет вам быстро добавить в ваш отчет СКД механизм редактирования данных

Предлагаю вашему вниманию механизм (почти универсальный) по редактированию данных в ячейках СКД

Во вложении конфигурация с демо данными  и отчетом "Планирование затрат"

Я смоделировал пример — необходимо планировать затраты по подразделениям

Все описание работы механизма в видеопрезентации. Теперь работает пересчет итогов по группировкам!

51 Comments

  1. KonstB

    Т.е. Итоги сами пересчитываются?

    Reply ↓
  2. Visitizer

    Нет, итоги сейчас не пересчитываются автоматом

    только при повторном обновлении отчета после внесения данных

    Reply ↓
  3. Visitizer

    (1) KonstB, если отчет небольшой, то после каждого внесения данных можно вызвать повторное формирование отчета

    Reply ↓
  4. Николай

    Еще можно обойтись без регистров:

    СохранитьЗначение(«Значение и Номер Ячейки и Имя Пользователя и Вариант отчета», ТабличаЗначенийОтчета);

    ТабличаЗначенийОтчета = ВосстановитьЗначение(«Значение и Номер Ячейки и Имя Пользователя и Вариант отчета»);

    Обрабатывать Таблицу Значений Отчета, а при окончании расшифровки заменять значения ячейк в отчете.

    Reply ↓
  5. chemezov

    всмысле как макет чтоли?

    Reply ↓
  6. kiros

    За идею «+», но универсальность здесь, именно идеи, применение на практике геморно, но идея очень интересна.

    Reply ↓
  7. Visitizer

    (6) kiros, Не согласен — вполне универсально

    я применил к разным задачам

    копи пасте и замена имен переменных

    на то он и шаблон

    Reply ↓
  8. Visitizer

    (4) Николай, Можно и без регистра — можно и в таблицу и в массив, и куда угодно — это же пример

    Reply ↓
  9. Yury1001

    а мне нравится, +

    Reply ↓
  10. gaglo
    Все описание работы механизма в видеопрезентации

    Однако сижу на работе, не могу открыть видео… Хоть бы пояснение в пару фраз могли бы в статье и поместить. А то «редактирование как в Excel» — слишком расплывчато. Могу только строить домыслы. Например:

    «Имеется отчет, построенный по регистру. К нему предлагается механизм, позволяющий набрать прямо в ячейках новые значения реквизитов, а затем сохранить их в записи регистра.»

    Ну вот насколько я угадал?

    Reply ↓
  11. Visitizer

    (10) gaglo, А вот мне чтобы мануал написать — так надо было бы в 3 раза больше времени потратить, а так — дома посмотришь 🙂

    Reply ↓
  12. Rustig

    Супер! Интересно как реализованы регламентированные отчеты в бухгалтерии 2.0? Ведь в них тоже можно редактировать данные в ячейках.

    Reply ↓
  13. адуырщдв

    Хорошая идея однозначно +

    Reply ↓
  14. eugen91

    Хорошая разработка) Респект

    Reply ↓
  15. tehas

    довольно интересно

    Reply ↓
  16. p1l1gr1m

    Хорошая идея, стоит отметить как ужасно неудобно реализован в скд механизм расшифровок и сколько действий нужно совершить чтобы сделать банальны вещи.

    Reply ↓
  17. KroVladS

    Плюс за идею.

    Использовал несколько иной механизм, в расшифровку засовывал открытие формы для редактирования (выбор из списка и комментарий) из которой и вносил изменения в регистр по которому строился отчёт, после записи отчёт переформировывал.

    Хотелось бы всё таки чтобы менялись итоги без переформирования отчёта.

    Reply ↓
  18. svcoopers

    Интересная программа!

    Reply ↓
  19. Visitizer

    (17) KV1s,

    Использовал несколько иной механизм, в расшифровку засовывал открытие формы для редактирования (выбор из списка и комментарий) из которой и вносил изменения в регистр по которому строился отчёт, после записи отчёт переформировывал.

    Хотелось бы всё таки чтобы менялись итоги без переформирования отчёта.

    Эта задача совсем другого порядка — ее можно решить, но это уже другие трудозатраты

    Reply ↓
  20. Visitizer

    ГОСПОДА, Теперь работает пересчет итогов!

    Правда не совсем мега супер универсально, но в 90% случаях подойдет

    В модуле формы добавил рекурсивную процедуру ПересчетИтоговВТаблице

    Reply ↓
  21. Созинов

    Спасибо — просто отличная вещь. Сейчас глядя на свое решение даже немного стыдно 🙁 Воспользуюсь вашей идеей, чтобы переписать свой код.

    Reply ↓
  22. Sasha255n

    Да от себя должен отметить что и идея достаточно свежая и оригинальая От меня атору большое спасибо

    Reply ↓
  23. krein

    Идея не новая, но реализация гораздо лучше, чем у меня получилось сделать в свое время

    Чаще всего используется для планирования и тут же оперативного просмотра, что и видно на скриншотах

    Reply ↓
  24. KroVladS

    Попробовал на реальной задаче 20 столбцов, 500+ строк(с группировками) после формирования отчёта ТЧ для расчёта итогов заполняется 4 минуты, сам отчёт формируется 10 сек.

    надо оптимизировать.

    Reply ↓
  25. KroVladS

    90% времени зависает вот тут:

    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    РезультатРасшифровки = ОбработкаРасшифровки.Расшифровать(Расшифровка, новый полеКомпоновкиДанных(ПолеРасшифровки));
    Reply ↓
  26. Visitizer

    это жесть — зачем такой большой файл, что же вы будете там смотреть 500 * 20 = 10 тыс. ячеек(24) KV1s,

    и что — будут редактировать 10 тыс. ячеек?

    я вообще не понимаю зачем пользовователям такие большие простыни

    Reply ↓
  27. KroVladS

    (26)

    в данный момент их заполняют в экселе, хотели перенести в 1с чтобы у пользователя интерфейс был похож на эксель.

    Заполняется не каждая ячейка (в строках номенклатура), но отображаться должны все.

    Reply ↓
  28. avtomatchik

    а как редактировать в обычных формах, неуправляемых? не пересчитываются итоги(

    Reply ↓
  29. avtomatchik

    разобрался, спасибо за отчет= )

    Reply ↓
  30. nano1c

    Господа, а почему у меня в веб-клиенте редактируемое поле смещено? А в тонком — все нормально!

    Reply ↓
  31. Odinas

    Отличная идея, для моей ситуации экономит массу времени и сил! Спасибо за разработку, как будут стартмани, обязательно скачаю.

    Reply ↓
  32. Odinas

    Наконец скачал отчет, появился небольшой вопрос.

    В своем отчете не использую группировки, возможно ли как то «отловить» содержимое ячейки, относительно выделенной изменяемой области? (Вместо статей затрат у меня колонка с номенклатурой, в конечном итоге в регистр сведений нужно писать Номенклатуру+ Значение выделенной ячейки)

    Reply ↓
  33. Odinas

    Все, разобрался, еще раз спасибо за разработку.

    Reply ↓
  34. lelusha

    Хорошая идея, экономит кучу времени. но доработка очевидна нужна.

    Спасибо разработчику.

    Reply ↓
  35. Dmitrii D

    идея класс!!! пошел разбираться)!

    Спасибо Вам большое замечательный отчет.

    Reply ↓
  36. Dmitrii D

    Один вопрос, пытаюсь сделать, чтобы при редактировании ячейки пересчитывались значения в соседнем столбце по формуле РедактируемаяЯчейка*СоседнююЯчейку, что-то не могу понять как это сделать пытаюсь смещать тут

    ЭлементыФормы.Результат.Область(текСтрокаСвязи.Ряд, текСтрокаСвязи.Колонка+1, текСтрокаСвязи.Ряд, текСтрокаСвязи.Колонка+1), 

    но не получается, пишет что значение недоступно для чтения.

    Есть какие-нибудь идеи как это реализовать?

    Reply ↓
  37. Dmitrii D

    (36) DmitriyDI, вроде получилось сделать!

    Reply ↓
  38. Dmitrii D

    (25) KV1s, да согласен, а если данных еще больше, то по часу заполняется идеи по оптимизации, есть какие-нибудь?

    Reply ↓
  39. Dmitrii D

    (38) DmitriyDI,

    Функция ПолучитьЗначенияГруппировокОтчета(знач ДанныеРасшифровки, Расшифровка, ПолеРасшифровки, ЗначенияГруппировок,ОбработкаРасшифровки)
    
    //ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
    
    РезультатРасшифровки = ОбработкаРасшифровки.Расшифровать(Расшифровка, новый полеКомпоновкиДанных(ПолеРасшифровки));
    
    для каждого текСтрокаОтбора из РезультатРасшифровки.Отбор.Элементы цикл
    для каждого текГруппировка из ЗначенияГруппировок цикл
    если текСтрокаОтбора.ЛевоеЗначение = новый ПолеКомпоновкиДанных(текГруппировка.Ключ) и текСтрокаОтбора.Использование=Истина Тогда
    ЗначенияГруппировок[текГруппировка.Ключ] = текСтрокаОтбора.ПравоеЗначение;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    
    Возврат ЗначенияГруппировок;
    КонецФункции
    

    Показать

    Сделал так отчет стал работать в разы быстрее, т.е. не создавать каждый раз обработку расшифровки а передавать 1 раз!

    Reply ↓
  40. Dmitrii D

    Теперь 70% времени тут

    ПолеКомпоновки = новый полеКомпоновкиДанных(ПолеРасшифровки);
    РезультатРасшифровки = ОбработкаРасшифровки.Расшифровать(Расшифровка, ПолеКомпоновки);
    

    Надо подумать как тут оптимизировать.

    Reply ↓
  41. Dmitrii D

    (40) DmitriyDI, и еще:

    ЗначенияГруппировок = ПолучитьЗначенияГруппировокОтчета(ДанныеРасшифровки, ТекущаяОбласть.Расшифровка, «СуммаПлан», Новый Структура(«Сотрудник, Контрагент, ТорговаяМарка»),ОбработкаРасшифровки);
    

    надо внести в это если:

    Если ЗначенияРасшифровки.Свойство(«СуммаПланСКР») Тогда
    

    Тогда и расшифровки норм останутся все и побыстрее еще будет работать!

    Reply ↓
  42. kentavr27

    (40) DmitriyDI, Что бы еще ускорится, нужно немного изменить порядок обхода. Сначала обходить колонки, внутри — строки (а не наоборот). И кроме того

    ЗначенияГруппировок = ПолучитьЗначенияГруппировокОтчета()

    можно перенести во внутренний цикл. Тем самым те колонки, которые для редактирования не интересны, не будут прогоняться, соответственно времени на прогонку затрачено будет в 2 или >2 раз меньше

    Для кол = ДокументРезультат.ФиксацияСлева+1 по ДокументРезультат.ШиринаТаблицы цикл
    Для ряд = ДокументРезультат.ФиксацияСверху+1 по ДокументРезультат.ВысотаТаблицы цикл
    ТекущаяОбласть = ДокументРезультат.Область(ряд, кол, ряд, кол);
    если ТекущаяОбласть.Расшифровка = Неопределено Тогда Продолжить; КонецЕсли;
    
    ЗначенияРасшифровки = ПолучитьВсеЗначенияРасшифровки(ДанныеРасшифровки.Элементы[ТекущаяОбласть.Расшифровка]);
    Если ЗначенияРасшифровки.Свойство(«КолонкаДляРедактирования») Тогда
    ТекущаяОбласть.Защита=ложь;
    ЗначенияГруппировок = ПолучитьЗначенияГруппировокОтчета(ДанныеРасшифровки, ТекущаяОбласть.Расшифровка, «КолонкаДляРедактирования», Новый Структура(«Товар, Клиент»),ОбработкаРасшифровки);
    .
    .
    .
    Иначе
    // !Добавить прерывание цикла для неинтересных колонок
    Прервать;
    КонецЕсли;
    КонецЦикла;
    КонецЦикла;
    

    Показать

    Reply ↓
  43. Baibolaika

    Visitizer, добрый день! Скажите, пожалуйста, существует ли версия для НЕ управляемых форм?

    Пытаюсь подстроить, не могу понять как формируется значение реквизита ДанныеРасшифровки?

    Reply ↓
  44. kanat1

    Спасибо. Очень пригодилось

    Reply ↓
  45. Stalker27

    Скачал, взял часть функционала для своей задачи (для начала просто нужно редактировать ячейки в табдоке). Получилось около 20 минут на выполнение (при количестве минимальных колонок для моей задачи около 20шт. и около 400 строк. Это данные просто для тестовой проверки. В реальности таблица получается намного больше (около 200-300 колонок и намного большего числа строк).

    В общем очень очень очень тормознутый метод для больших объемов информации. У меня мой метод работал мгновенно, но там были некие проблемы другого плана, поэтому подумал что ваша обработина мне поможет. Не помогла.

    Но некоторые методы пригодятся в доработке моего решения (хотя уже было принято решение делать обработкой, а не отчетом). В общем нафига потратил стартмани — непонятно 0_о

    Ну надо же их куда-то тратить, а то лежат и лежат уже года 2-3))

    Reply ↓
  46. lopatin

    Получится прикрутить такое решение, если это не отчет, а форма документа и табличную часть надо вывести через СКД Табличный документ? Программный вывод СКД в табличный документ будет в другом модуле выполняться, не в форме документа.

    Reply ↓
  47. Visitizer

    (46) Да какая разница, куда СКД прикручивать — табличный документ и логика заполнения и обработки вся на программном уровне

    Reply ↓
  48. HAMMER_59

    Михаил, насколько я понял Вы сначала выводить с помощью СКД результат в табличный документ. А затем перебираете все ячейки, и устанавливаете в нужном месте свойства «защита» и «содержит данные».

    Я пытался сразу в макете указать данные свойства, но именно эти свойства не перенеслись в полученный табличный документ.

    Может все-таки как-то можно решить задачу через макет, и не перебирать все ячейки?

    Reply ↓
  49. Visitizer

    (48) Как же давно это было — я уже и 1с не занимаюсь )

    но насколько я помню — на макет весь ставится защита редактирования, а программно подствечиваются и открываются ячейки для редактирования

    Reply ↓
  50. HAMMER_59

    (49) На текущий момент я пришел к тому же выводы, что других вариантов кроме как программно снять защиту с ячейки нет.

    Reply ↓
  51. leobrn

    заметил, что когда делаешь отбор в нижних итогах пересчета нет

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *