Переход на Йоксель за 5 минут



Быстрое внедрение ВК Йоксель в конфигурацию на примере отчета «Ведомость по контрагентам» для ТИС Релиз 7.70.954 от 22.07.2008 г.

Благодаря возможностям Йоксель в отчете есть структура документа (есть возможность свернуть/развернуть группы строк) которая сохраняется при сохранении в формат Excel.

Внедрение занимает около 5-10 минут на отчет, подходит для всех отчетов, в которых есть Процедура ВывестиГруппировку (15 отчетов в ТИС).

Благодаря выходу в свет новой версии Йокселя, (огромная благодарность за это Ужасу Бухгалтера) внедрение стало еще проще, быстрее и в большей степени соответствует поведению стандартных отчетов 1С. Стала возможна работа кнопок «Обновить» и «Расшифровка» т.е. внедрение компоненты в форму больше не требуется, (первоначальный вариант с внедрением в форму + использование formex есть в примере).

Требует внешнюю компоненту:  Йоксель версии не ниже 01.01.04. ВК в «Ведомость по Контрагентам Йоксель» не вложена. Раздобыть ее можно на домашней странице автора компоненты:  http://yoksel.net.ru/HomePage (самые последние версии компонеты на странице: http://yoksel.net.ru/Hotfixes).

Изменения:

15.01.09 Исправлена ошибка в некорректной работе кнопки «Расшифровка» и «Обновить»,  спасибо за обнаружение ошибки Sagittarius и Winter.

P.S. Благодарности отсылайте разработкику ВК Йоксель

Внедрение: Сохраняем отчет как внешний и открываем его на редактирование.

  1. На слой «Подвал» помещаем флажок с идентификатором «СтандартныйРежим», он будет использоваться для возможности отката к стандартному режиму отчета.
  2. В начало модуля добавляем переменные:
  Перем ГруппыСтрок,ПанельИнструментов;
  1. В процедуре ПриОткрытии ищем строки
  Если Обновить <> 0 Тогда
Таб = глТаблица;
КонецЕсли;

          Меняем на:

  Если Обновить <> 0 Тогда
Таб = глТаблица;
ПанельИнструментов = глТаблица;
КонецЕсли;
  1. В конец процедуры ПриОткрытии добавляем
 Попытка
ТабличныйДокумент=СоздатьОбъект ("ТабличныйДокумент");
Исключение
Если ЗагрузитьВнешнююКомпоненту ("SpreadSheet.dll")=0 Тогда
Сообщить("Не удалось загрузить компоненту Йоксель. "
"Компонента должна быть в каталоге BIN 1С или в каталоге базы данных. "
"Скачать компоненту можно на сайте http://yoksel.net.ru");
СтандартныйРежим=1;
КонецЕсли;
КонецПопытки;
  1. В конце процедуры ВывестиГруппировку меняем строки
 // если есть более детальная группировка - выведем ее
Если КоличествоГруппировок > Ном Тогда
ВывестиГруппировку(Запрос,Ном+1);
КонецЕсли;

          Меняем на:

 // если есть более детальная группировка - выведем ее
Если КоличествоГруппировок > Ном Тогда
НачалоГруппы = Таб.ВысотаТаблицы()+1;
ВывестиГруппировку(Запрос,Ном+1);
ОкончаниеГруппы = Таб.ВысотаТаблицы();
Если НачалоГруппы <= ОкончаниеГруппы Тогда
ГруппыСтрок.НоваяСтрока();
ГруппыСтрок.Начало = НачалоГруппы;
ГруппыСтрок.Окончание = ОкончаниеГруппы;
КонецЕсли;
КонецЕсли;
  1. В процедуре Сформировать ищем строки
 Расшифровка = СоздатьОбъект("СписокЗначений");
Расшифровка.Установить("Отчет", "ВедомостьПоКонтрагентам");

          Меняем на:

 Расшифровка = СоздатьОбъект("СписокЗначений");
Путь = "";
ИмяФайла = "";
РасположениеФайла(Путь,ИмяФайла);
ФайлОтчета = Путь + ИмяФайла;
Расшифровка.Установить("Отчет", ?(ПустоеЗначение(ФайлОтчета) = 1,"ВедомостьПоКонтрагентам", ФайлОтчета));
  1. В процедуре Сформировать ищем строки
 // ВЫВОД ГРУППИРОВОК ЗАПРОСА
ВывестиГруппировку(Запрос,1);

          Меняем на:

 // ТЗ с группировками для Yoxcel 
ГруппыСтрок=СоздатьОбъект ("ТаблицаЗначений");
ГруппыСтрок.НоваяКолонка ("Начало", "Число");
ГруппыСтрок.НоваяКолонка ("Окончание", "Число");
// ВЫВОД ГРУППИРОВОК ЗАПРОСА
ВывестиГруппировку(Запрос,1);
  1. В процедуре Сформировать ищем строку
 Таб.Показать("Ведомость по контрагентам","");

          Меняем на:

 Если СтандартныйРежим=1 Тогда
Таб.Показать("Ведомость по контрагентам", "");
Иначе
Если ТипЗначенияСтр(ПанельИнструментов) <> "Йоксель.ПанельИнструментов" Тогда
Документ = СоздатьОбъект ("ТабличныйДокумент");
Иначе
Документ = ПанельИнструментов.Документ;
Документ.Очистить ();
КонецЕсли;
Документ.ЗагрузитьИзТаблицы(Таб);

Если ТипЗначенияСтр(ПанельИнструментов) <> "Йоксель.ПанельИнструментов" Тогда
Фрейм = Документ.Показать("Ведомость по контрагентам");
Фрейм.ОтображатьСтруктуру(1);
Фрейм.ОтображатьКнопкиУровней(1);

Панель = Фрейм.ПанельИнструментов;
Панель.Видимость = 1;
// Обратите внимание если у Вас переписана ОбработкаЯчейкиТаблицы и ее события то следущие
// строки нужно привести к тому виду, какой он должен быть в Вашей конфигурации!
Панель.ПодписатьсяНаСобытие("ОбработкаЯчейкиТаблицы", "ОбработкаЯчейкиТаблицы", 1);
Иначе
Панель = ПанельИнструментов;
КонецЕсли;

Кнопка = Панель.ДобавитьКнопку("Обновить");
Кнопка.Заголовок = "Обновить";
Кнопка.Значение = РасшифровкаОбновить(1);
Кнопка = Панель.ДобавитьКнопку("Настройка");
Кнопка.Заголовок = "Настройка";
Кнопка.Значение = РасшифровкаОбновить(2);

Документ.УдалитьСтроки(1,2); // Удаляем Настройка и Обновить
// Установка группировок строк
ГруппыСтрок.ВыбратьСтроки();
Пока ГруппыСтрок.ПолучитьСтроку () = 1 Цикл
Документ.ДобавитьГруппуСтрок(ГруппыСтрок.Начало-2,ГруппыСтрок.Окончание-2);
КонецЦикла;
// Свертка всех группировок Йоксель
Для инд = -Документ.КоличествоУровнейГруппировкиСтрок() По -1 Цикл
Документ.ПоказатьУровеньГруппировокСтрок (-инд);
КонецЦикла;
Документ.ОбновитьВсеОтображения();
КонецЕсли;

 

Вот и все. Если все сделано аккуратно, и ничего не упущено, отчет переведен на работу с Йоксель.

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

P.P.S. Некоторые отчеты Вам возможно потребуется немного доработать. Например при нажатии кнопки «Инвентаризация» в отчете «ОстаткиТМЦ» потребуется установить СтандартныйРежим=1 и т.п.

55 Comments

  1. vandalsvq

    Кстати хотел рассказать об очень «интересном» поведении 1С+Йоксель (у меня инет ограничен так что вынужден сюда писать может передашь это Uzhast-у).

    Так вот если выводить кнопки по уровням (аля как в Excel для быстрой свертки) 1С можно уронить следующими действиями.

    1. Разворачиваем «большую» группу (чтобы строк было столько когда на экран не вмещается)

    2. Прокручиваем позицию ячейки таким образом чтобы и кнопочка +- была скрыта и окончание блока тоже. Т.е. серединка блока например.

    3. Нажимаем на кнопку свертки всего уровня.

    У меня далее 1С зависает и падает ножками вверх.

    Reply
  2. Ужас бухгалтера

    Спасибо автору! 🙂 А то я все пытался сделать комплект отчетов с группами для ТиС. Теперь это будет проще 🙂

    (1) Можешь описать подробнее, как добиться появления ошибки? Я, например, делаю так: открываю форму «Структура документа», включаю отображение структуры и кнопок уровней. Добавляю группу строк 3-50. Прокручиваю документ так, чтобы не были видно ни кнопку сворачивания, ни конец группы. Нажимаю кнопку «1». Все работает корректно. Кстати, наверное, лучше, если подобные вещи будем дальше обсуждать здесь: http://yoksel.net.ru/forum/

    Reply
  3. Ёпрст

    Давно заменил всё на йоксель, правда с фреймами….пока.

    (2) Будет ли возможность как в экселе сворачивать /разворачивать все группы …типа кнопок сверху ?

    Reply
  4. Ёпрст

    блин …(3) снимается… 🙂

    Reply
  5. Ужас бухгалтера

    (3) Кстати, если это ты на сайте аналогичный вопрос задавал, то я там еще про проблемный файл ответил — хотелось бы разобраться, что там за фигня 🙂

    Reply
  6. Ужас бухгалтера

    (3) С фреймами скоро будет немного получше 🙂

    Reply
  7. Ёпрст

    (5) Да это я…

    могу кинуть куда нить…

    Еще вопрос — будут ли расшифровки на внедренных объектах, типа Текст и т.д ?

    ЗЫ: Автор, звиняйте за оффтопик, ваша метода оч. полезна.

    Я правда сворачивал вместе с группами, т.е. если группы попадают (детализация с группами номенклатуры. к примеру,) — объединял их в одну «группу».

    Reply
  8. Ёпрст

    +7 зарегился на форуме, туда баги запостю… и файло прикреплю.

    Reply
  9. Ужас бухгалтера

    (7) «Еще вопрос — будут ли расшифровки на внедренных объектах, типа Текст и т.д ?» Будут, но точное время сказать не могу.

    PS. Да, автор, тоже извини за оффтопик 🙂

    Reply
  10. JohnyDeath

    (3) Ёпрст, ты говоришь, что всё на йоксель перевёл. А как у тебя ведут себя пользователи, если в ширину колонки не умещаются все цифры, или наоборот: она слишком широкая? В йокселе сейчас нельзя интерактивно изменять ширину и высоту колонок. (

    Reply
  11. Ужас бухгалтера

    (10) Высоты колонок не бывает 🙂

    Если не помещаются цифры, то можно попробовать выкрутиться через автонастройку ширины колонки. Например, делать автонастройку сразу после формирования отчета. Или предусмотреть возможность, когда пользователь по клику в заголовке колонки сможет запустить эту автонастройку (через обработку расшифровки).

    Но обычно отчеты делают так, чтобы юзеру не требовалось подкручивать ширину колонок 🙂

    Reply
  12. JohnyDeath

    (11) Да, не спорю, что лучше всего делать так, чтобы ширину не приходилось подкручивать. Но, млин, если делать один и тот же отчет за неделю и за квартал, то цифры будут ой как разниться, а если выбирать «примерно наибольшую», то с маленькими цифрами вся эта байда выглядит очень некрасиво.

    С автонастройкой ширины по клику на названии — идея хорошая, надо будет попробывать.

    Reply
  13. Ёпрст

    (10) на это забил + оставил штатный отчет (галкой).

    Единственное, чего не хватает — ПовторятьПриПечатиСтроки…

    Reply
  14. Ёпрст

    +12 Пока просто всех юзверей еще предупредил — тестите ошибки 🙂

    Все пока довольны.

    из минусов — М,М+,М- не работает, если фрейм — то без доп усилий, что либо поменять — болт…

    да и так, по мелочи 🙂

    Reply
  15. Ёпрст

    + во фрейме организовать кнопки Обновить и Настройка тоже тот еще подарок 🙂

    Зато многие спец формы, типа деклараций на ура, за счет событий..

    Reply
  16. Djelf

    (7) Я пробовал сворачивать с группами справочников, мне не очень понравилось. Дерево группировок получается, на мой взгляд, довольно непонятное и теряется смысл в свертке/развертке всех групп 2го (или еще какого нибудь) уровня.

    Reply
  17. Ужас бухгалтера

    (14) То, что «по мелочи» тоже пиши 🙂

    (15) «во фрейме организовать кнопки Обновить и Настройка тоже тот еще подарок»

    Это как раз будет основной темой нашей следующей серии, которая выйдет уже на днях 🙂

    Reply
  18. Ёпрст

    (16) Не ..просто в стандартных отчетах нужно переделать макет, чтоб иерархия была «лесенкой» , а не как щас — всё в первом столбце. Тогда будет видна вся структура более наглядно. А как у вас щас — получаются » разрывы» … Типа группы лишние..

    Я посмотрел и так и сяк, оставил, чтоб группы тоже объединял.

    Имхо.

    Reply
  19. JohnyDeath

    Вот вы всё «фрей-фрейм», а я не могу понять в чём фишка? Зачем? Какие преимущества?

    Reply
  20. Ужас бухгалтера

    (19) Привычнее? Специфичная менюшка для таблиц? (у элемента на форме такого меню нет). А вообще, конечно, да. В 8.х там в основном отчеты в таблицах на форме сидят.

    Reply
  21. Ёпрст

    (19) Юзверю так проще 🙂 Привычка — страшное дело, + если нужно слепить 2/3 отчета с разными параметрами, что делать будешь?

    Reply
  22. JohnyDeath

    (20) Всё равно не въеду. Можно как-нить поподробнее. Что привычнее? Какая менюшка? Что такого можно сделать во фрейме, чего нельзя сделать в ЭУ?

    Reply
  23. Ёпрст

    Разве что закладки с новой Таблицей лепить на форме…

    Reply
  24. Ужас бухгалтера

    (22) Это менюшки под пунктами «Таблица», «Вид» и «Действия».

    Reply
  25. JohnyDeath

    (21) {Сначала не заметил, что уже новая страница пошла.}

    А про 3 отчета с разными параметрами расскажи — интересно (точнее пока тоже непонятно). Что ты делаешь? В 3-х отчетах сформировал по табличке, а потом всё это в одну?

    Reply
  26. JohnyDeath

    (24) Из всех этих менюшек моим юзерам нужен только поиск по таблице. Смотрю твою демку, во фрейме оно не активно.

    Reply
  27. Ужас бухгалтера

    (25) Наверное, имеется в виду, что отчет, скажем, формируется за 3 разных периода. Чтобы их между собой сравнивать. Или там с фильтрами другими…

    Reply
  28. Ужас бухгалтера

    (27) «Смотрю твою демку, во фрейме оно не активно.»

    Да уж знаю… 🙂

    Reply
  29. Ёпрст

    (25) Разные настройки, периоды, потом «сравнивают» … Типа ОСВ Долгов по клиентосам и т.д…. Довольно таки часто все так делают.

    Reply
  30. Ёпрст

    Один хрен, автору ВК спасибо за группировки.

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

    Reply
  31. JohnyDeath

    (26, 25) Понял, спсб.

    Тогда другой вопрос: Ёпрст, ты как в Йоксель выводишь? Сначала выводишь всё в стандартную таблицу, а потом, не показывая её, загружаешь в Йоксель?

    (28) Прям тока хотел спросить: будет/возможен поиск по таблице как во фрейме, так и в ЭУ?

    Reply
  32. Ужас бухгалтера

    (30) Не за что 🙂

    (31) Буду стремиться, чтобы везде работало.

    Reply
  33. Ёпрст

    (31) да.

    Reply
  34. ev-kov

    Попробовал перевести, отчет не из конфы от 1с на йоксель, всё заработало, (группировк там не было). Но с расшифровкой есть ньанс, расшифровка в отчете юзается глобальная, и там используется формексовский Сервис.ВыбратьЗначение … вот листинг ошибки

    Если _Сервис.ВыбратьЗначение(Меню,Отчет) = 0 Тогда

    {Глобальный модуль(391)}: Возникла критическая ошибка. Описание ошибки, возвращаемое Windows: Операция успешно завершена.

    Reply
  35. Djelf

    Иногда ВК между собой не дружат. Есть такое дело ;(

    Тест написан, приложен в твоей баге на yoksel.net.ru

    Reply
  36. АЛьФ

    Проблему совместимости с FormEx постараемся решить совместно в ближайшее время.

    Reply
  37. Winter

    Классная штука. Но вот есть одно но… Пытаюсь применить метод «АвтоподборШириныКолонки». Перед этим выбираю область. Мне нужно область значений ниже шапки. Выбираю область. Даю команду «АвтоподборШириныКолонки». Выравнивание идет не только по этой области, идет захват строк, выше выбранной обсласти. Я так понимаю, что этот метод аналогичен двойному щелчку в Экселе на разделители между адресами колонок. Тогда непонятно, зачем указывать начальную строку, если все равно отформатироруются все строки в выбранном диапазоне колонок?

    И еще одно. попытался применить метод «Защита»:

    Фрейм = Документ.Показать(«Выпуск продукции»);

    Фрейм.ОтображатьСтруктуру(1);

    Фрейм.ОтображатьКнопкиУровней(1);

    Фрейм.Защита (0);

    И выходит ошибка: Поле агрегатного объекта не обнаружено (Защита). Может что-то делаю неправильно?

    Reply
  38. Winter

    Классная штука. Но вот есть одно но… Пытаюсь применить метод «АвтоподборШириныКолонки». Перед этим выбираю область. Мне нужно область значений ниже шапки. Выбираю область. Даю команду «АвтоподборШириныКолонки». Выравнивание идет не только по этой области, идет захват строк, выше выбранной обсласти. Я так понимаю, что этот метод аналогичен двойному щелчку в Экселе на разделители между адресами колонок. Тогда непонятно, зачем указывать начальную строку, если все равно отформатируются все строки в выбранном диапазоне колонок?

    И еще одно. попытался применить метод «Защита»:

    Фрейм = Документ.Показать(«Выпуск продукции»);

    Фрейм.ОтображатьСтруктуру(1);

    Фрейм.ОтображатьКнопкиУровней(1);

    Фрейм.Защита (0);

    И выходит ошибка: Поле агрегатного объекта не обнаружено (Защита). Может что-то делаю неправильно?

    Reply
  39. Sagittarius

    Глубочайшее уважение разработчикам ВК и автору данной темы за проведенную работу, как обычно есть маленькие косячки:

    1) кнопки «Обновить» и «Настройка» работают не совсем корректно. Если в построенном отчете нажать «Настройка» и, например, изменить период отчета, то новый отчет сформируется с новым периодом, но если после этого нажать «Обновить», то отчет перестраивается с начальным периодом. Происходит это из-за того что проверка

    >Если ТипЗначенияСтр(ПанельИнструментов) <> «Йоксель.ПанельИнструментов» Тогда<

    выполняется только первый раз при создании фрейма в самый первый раз, остальные действия с «Обновить» и «Настройка» не вызывают перезаполнения значений кнопок новыми значениями расшифровок:

    Кнопка = Панель.ДобавитьКнопку(«Обновить»);

    Кнопка.Заголовок = «Обновить»;

    Кнопка.Значение = РасшифровкаОбновить(1);

    Кнопка = Панель.ДобавитьКнопку(«Настройка»);

    Кнопка.Заголовок = «Настройка»;

    Кнопка.Значение = РасшифровкаОбновить(2);

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

    Reply
  40. Winter

    (39) Я так же сталкнулся с этой проблемой. Все решается очень просто:

    Кнопка = Панель.ПолучитьКнопкуПоИдентификатору(«Обновить»);

    Кнопка.Значение = глРасшифровкаОбновить(1);

    Кнопка = Панель.ПолучитьКнопкуПоИдентификатору(«Настройка»);

    Кнопка.Значение = глРасшифровкаОбновить(2);

    Reply
  41. Ужас бухгалтера

    (38) Насчет автоподбора ширины. Да, указание строк области ни на что не влияет — учитываются только колонки. Это было сделано, потому что ставилась как раз цель сделать аналог двойного клика в Excel 🙂 Но, учитывая, что уже не первый раз упоминается необходимость учитывать строки при автоподборе, думаю, это можно будет сделать в одном из следующих релизов.

    Насчет Защиты. Все делаете правильно, просто этот метод как-то незаметно пропал из Йокселя 🙂 Верну в ближайшем хотфиксе.

    PS. Спасибо еще раз автору данной методики перехода. Теперь вот сижу, завидую, что сам не догадался сделать что-то подобное 🙂

    Reply
  42. Djelf

    Sagittarius, Winter. Спасибо за обнаружение косяков.

    Обработку обновил по варианту от Sagittarius.

    Reply
  43. CheBurator

    Кстати, тут выложили зачетную обработочку, которой в принципе можно штатные отчеты превращать в группировочные без изменения кода источника…

    зачетно!

    Reply
  44. Ёпрст

    (43) И что самое удивительное, если приглядеться — то это тот-же автор!

    :))

    Reply
  45. CheBurator

    (44) Не оскудела еще земля богатырями!

    Reply
  46. Ёпрст

    (45) новый йоксель 10 марта вышел, если что..

    Reply
  47. CheBurator

    пошел смотреть

    Reply
  48. Djelf

    (34) FormEx`овский Сервис.ВыбратьЗначение наконец заработал во Фрейме на последнем Йокселе. Только вместо

    Сервис.ВыбратьЗначение(Список,Зн);

    надо писать

    Сервис.ВыбратьЗначение(Список,Зн,,,2);

    Reply
  49. CheBurator

    еще бы вертикальнфе развороты приделать…

    Reply
  50. Djelf

    (49) Так ведь это не разработка в прямом смысле этого слова, а так, простенькое пособие по переходу на Йоксель. Перегружать пример лишним кодом думаю не стоит.

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

    P.S. Для НовейшихОтчетов группировка кросс-таблиц во вертикали уже сделана в «Переход на Йоксель за 1 минуту».

    Reply
  51. panver

    Спасибо автору. До этого никогда не сталкивался с выводом таб части как в Ексель (группировки по уровням).

    Reply
  52. diocompany

    Спасибо Автору публикации!

    Изложено всё очень понятно!

    Спасибо Авторам внешней компоненты!

    Всё работает на Ура!

    Reply
  53. gosizo

    Спасибо.

    Переделал несколько отчетов и сразу появились хотелки у манагеров и руководства.

    Допустим есть прайс с группировками.

    Можно ли сделать возможность помечать некоторые позиции товара (запоминая их в список значений) с тем, что бы обработать?

    Reply
  54. gosizo

    (43)(44) можно ссылку? Что-то я не нашел в разработках автора или не так понял комментарий (43)

    Reply
  55. Ёпрст

Leave a Comment

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