Недокументированное использование стандартных форм Upd.




Вам не хватает возможностей в платформе 1С или у Вас нет времени на углубленное изучение платформы 1С?
Рассмотрены возможности использования стандартных форм, вызываемых из платформы.

Первоисточник: Недокументированное использование стандартных обработок из меню "Все функции".

Отличие:

  • Используются стандартные формы, вызываемые из платформы.

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

LF — это стандартная компилированная управляемая форма, вызываемая платформой. В платформе 1с предприятия есть стандартные формы: "Все функции", "Все сообщения", "Выбрать цвет", "Выбрать тип документа", "Выбрать шрифт" и т.д. тому подобно.

Первичная цель: Как из компилированной управляемой формы перенести данные в форму с модулями из внешней обработки?

Порядок выполнения действий "Преобразование стандартных форм":

  1. Открыть обработку, нажать на кнопку "Получить список ресурсов", отметить необходимые ресурсы, выбрать каталог и нажать "Распаковать и упаковать".
  2. В выбранном каталоге открыть любую обработку в режиме конфигуратора.
  3. Открыть форму внешней обработки, восстановить в ней связи между элементами и реквизитами, записать и закрыть.
  4. Открыть записанную обработку в режиме предприятия.

Что делает обработка "Преобразование стандартных форм":

  1. Получает встроенную в виде отдельного файла LF.
  2. Получает готовый шаблон внешней обработки из макета обработки и сохраняет его во временный файл.
  3. Распаковывает временный файл внешней обработки во временный каталог.
  4. Заменяет файл "<guid.0>" на содержимое файла LF.
  5. Упаковывает в обработку обратно в обычный каталог.

Чтобы сделать самому себе обработку "AllFunction.lf", имея на руках V8Unpack, нужно выполнить следующее действие:

  1. Создать в конфигураторе новую обработку.
  2. Создать в ней новую управляемую форму.
  3. Сохранить обработку.
  4. Распаковать получившуюся обработку с помощью V8Unpack.
  5. Там должен быть один файл с именем вида <guid>.0 — поменять его содержимое на содержимое файла "AllFunctions.lf".
  6. После этого обратно собрать обработку с помощью V8Unpack.

Чтобы получить встроенную в виде отдельного файла "AllFunctions.lf", нужно выполнить код:

КопироватьФайл("v8res://mngbase/AllFunctions.lf","C:AllFunctions.lf");

Информация обо всех файлах в формате LF лежит в файлах:

C:Program Files (x86)1cv8хх.хх.хх.ххinmngbase_root.res

C:Program Files (x86)1cv8хх.хх.хх.ххinmngbase_ru.res

Помимо этого была сделана внешняя обработка для тестирования для конфигураций 1С: Предприятия 8. Все изменения касательно внешней обработки "Все функции":

  1. Восстановлена связь между элементами и реквизитами.
  2. Закомментирован код закрытия формы обработки после выбора формы.
  3. Изменено поведение Enter в форме обработки выбора.
  4. Изменено поведение Esc (запрашивает подтверждение при закрытии приложения).

Второисточник: Просмотр ресурсов 1С методами встроенного языка (8.3.9).
Автор r0610201 любезно разрешил опубликовать расширенный анализ ресурсов 1С со ссылкой на второисточник. За что ему большое спасибо!

Отличие:

  • Добавлено преобразование стандартных форм (*.lf, *.f).
  • Сохранение всех файлов с ресурсами одним нажатием кнопки.

В последнее время авторы жалуются на отсутствие информации о стандартных обычных формах.

Вторичная цель: Как вытащить стандартные обычные формы?

В файле mngbase_ru.res или mngbase_root.res лежат управляемые формы (*.lf), а обычные формы (*.f) в basicui_ru.res и других файлах.

F — это стандартная компилированная обычная форма, вызываемая платформой.

Была проблема с извлечением ресурсов *.f через ‘КопироватьФайл("v8res://….")’. Порыскал в интернете и нашёл инфу о том, что можно распаковать ресурсы непосредственным чтением двоичных данных res-файла, которые другими способами извлечь не получается.

Порядок выполнения действий "Анализ ресурсов 1С (расширенный)":

  1. Открыть обработку, нажать "Выбрать расширения", снять все ресурсы, выбрать ресурс "f" или "lf", нажать на кнопку "Выбрать" и "Анализ".
  2. Поставить галочку ".f (…)" или ".lf (…)", выбрать каталог в поле "Каталог" и нажать "Преобразовать форму(ы)".
  3. В выбранном каталоге открыть любую обработку в режиме конфигуратора.

Идеи для разработки:

  • Получить системную папку bin 1С, прочитать файл mngbase_root.res, найти в нём позицию первого ".lf" и нулевой байт и читать пока идут печатаемые символы или нулевой байт.
  • Уметь сравнивать ресурсы: какие ресурсы добавлены, а какие удалены. Например, сравнить 2 файла mngbase_root.res разных версий платформы.
  • Анализировать ресурсы всех файлов.
  • Преобразовать стандартные обычные формы (*.f).

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

Выражаю благодарность awa за оказанную помощь.

56 Comments

  1. klinval

    А «Все действия» — «Настроить список» — эту форму/обработку можно получить вашей обработкой?

    Reply
  2. ZhokhovM

    (1) klinval, конечно, есть стандартная форма «UniversalListSettings.lf». В ней нужно восстанавливать связи между элементами и реквизитами непосредственно в обработке, такие как: Filter, Order, Group и т.д.

    Reply
  3. LSV79

    А зачем такие сложности?

    http://infostart.ru/public/369487/ тут вариант значительно проще

    Reply
  4. ZhokhovM

    (3) LSV79, там нет вариантов со стандартными формами, только упоминания в комментариях

    Reply
  5. Serj1C

    Ой, ой, ой… На фоне шумихи с вирусом для 1С… Т.е. теперь можно подложить файлы в каталог бин и пользователь сам когда-нибудь да откроет обработку.

    А также можно обойти ограничение на открытие внешних обработок…

    Большая-большая дыра в безопасности каждой компании, где у пользователей есть доступ на запись в каталог bin

    Reply
  6. the1

    (5) Serj1C, тсссс

    Reply
  7. vano-ekt

    екарук писала уже, но плюсану за обработку, лень копаться 🙂

    Reply
  8. ZhokhovM

    (7) vano-ekt, спасибо.

    Reply
  9. fishca

    ЖЫРНЫЙ ПЛЮС!

    Reply
  10. ZhokhovM

    (10) fishca, спасибо

    Reply
  11. dolter

    А действительно… можно ли вытянуть стандартную форму, слегка ее переделать (например вставить попытку открыть другую форму из состава конфигурации в случае ее там присутствия) и поместить ее обратно в bin?

    Reply
  12. ZhokhovM

    (12)я знаю только вытянуть и переделать форму но поместить ее обратно в бин нет, не пробовал

    Reply
  13. dolter

    Нашел инструмент у Орефкова на сайте… Полностью разобрать получилось, а вот собрать пока не очень…

    Reply
  14. ander_

    Что-то я не в теме. А зачем все это? Поясните плиз где и как это может пригодиться

    Reply
  15. ZhokhovM

    (15)

    где и как это может пригодиться

    Мне она пригодилась для тестирования для конфигураций: «Управление торговлей, редакция 11» и «Управление предприятием, редакция 2». На всякий случай указал первоисточник.

    Reply
  16. ander_

    (16)

    а еще чуть подробней.. 🙂

    что здесь имеется ввиду под «тестированием»?

    может пример тестового сценария, в котором это используется… может так понятнее будет 🙁

    Reply
  17. ZhokhovM

    (17)ну изначально я тестировал руками все формы, вызываемые через меню все функции, например, открыть и закрыть формы документа или справочника, но после длительного использования были проблемы, что автоматически закрывается стандартная форма «Все функции» после выбора любой формы и деактивируется строка дерева значений «Table» после переоткрытия стандартной формы «Все функции», что практически невозможно было выбрать следующую форму нажатием стрелочки «вниз» или «вверх», так вот решил создать тему https://partners.v8.1c.ru/forum/topic/1510855, но ответа там до сих пор не дали, затем вспомнил про статью «Недокументированное использование стандартных обработок из меню «Все функции»» на инфостарте от автора екарук и мне нужно было придумать как стандартную форму «Все функции» вызываемую из платформы перенести во внешнюю обработку с формой для этого и была придумана мной статья. Все изменения касательно внешней обработки «Все функции» я писал выше.

    Reply
  18. ander_

    (18)

    Спасибо, теперь более-менее понятно.

    Reply
  19. ZhokhovM

    (136)пожалуйста

    Reply
  20. ZhokhovM

    28.07.2017:

    Что изменилось:

    Добавил внешнюю обработку «Стандартная форма «Все функции» для ERP». Проверял на версии ERP 2.4.1.126. На УТ данная обработка не подходит, так как к каждой конфигурации проверяется право доступа «TotalsControl», «CollaborationSystemInfoBaseRegistration» и т.д.

    Reply
  21. tormozit

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

     л_Формы.Добавить(«DataHistoryVersionData», «Data history data»);
    л_Формы.Добавить(«DataHistoryVersions», «Data history versions»);
    л_Формы.Добавить(«DataHistoryVersionsDiff», «Data history difference»);
    Reply
  22. ZhokhovM

    (22)Всегда пожалуйста!

    Reply
  23. ZhokhovM

    19.04.2017:

    Что изменилось:

    Добавлены формы:

    BorderChoose

    ChartLabelArea

    ChartAxis

    ChartScale

    GanttChartChoiceValue

    DataHistoryVersions

    DataHistoryVersionsFilter

    DataHistoryVersionsFilterUser

    DataHistoryVersionData

    DataHistoryVersionsDiff

    ECSMainForm

    fdSave

    fullscreen

    moxelName

    moxelNames

    moxelDupName

    NotificationsDlgNew

    TrendLines

    Исправлена ошибка, в которой не учитываются пометки в списке при выгрузке.

    Reply
  24. romankoav

    А как программно открыть такую форму? Например DataHistoryVersions

    Reply
  25. ZhokhovM

    (25)воспользоваться обработкой «Преобразование стандартных форм.epf» и вызвать форму методом ОткрытьФорму(«ВнешняяОбработка.DataHistoryVersions.Форма»);

    Reply
  26. romankoav

    (26) То есть без вынесения из конфигурации никак?

    Reply
  27. ZhokhovM

    (27)Никак.

    Есть пример в первоисточнике:

    &НаКлиенте

    Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)

    ПодключитьВнешнююОбработкуНаСервере();

    ОткрытьФорму(«ВнешняяОбработка.StandardFindByRef.Форма»);

    КонецПроцедуры

    &НаСервере

    Процедура ПодключитьВнешнююОбработкуНаСервере()

    ВнешниеОбработки.Подключить(«v8res://mngbase/StandardFindByRef.epf», «StandardFindByRef», false);

    КонецПроцедуры

    но сделать так же для стандартной формы не получится

    ВнешниеОбработки.Подключить(«v8res://mngbase/DataHistoryVersions.lf», «DataHistoryVersions», false);

    Reply
  28. unknown181538

    А настройка панели навигации в списке есть?

    Reply
  29. ZhokhovM

    (29)эта dcschangesettingsstructure?

    Reply
  30. unknown181538

    (30)

    dcschangesettingsstructure

    похоже на то. Понять бы еще, как ее отключить.

    Reply
  31. needmic

    А для обычных форм (не управляемых) что-то есть? Нужно стандартные обработки под обычным приложение достать. Или если это расписывалось где-то подкинте ссылку. Спасибо.

    Reply
  32. ZhokhovM

    (32)для обычных форм не делал. здесь только стандартные формы, а в первоисточнике — стандартные обработки.

    Reply
  33. needmic

    Ясно. Жаль. Просто стандартные обработки есть и в режиме запуска обычного приложения. Вот про эти обработкиформы (операции-проведения документов) хотелось узнать. Буду искать. Спасибо.

    Reply
  34. tormozit

    (22) 1С:Предприятие 8.3 (8.3.13.1865)

    DataHistoryVersions — открывается

    DataHistoryVersionData — не открывается (ошибка — форма не обнаружена)

    DataHistoryVersionsDiff — не открывается (ошибка — форма не обнаружена)

    При выгрузке в файл аналогично —

    {ВнешняяОбработка.ZhokhovM_ConversionOfStandardForms.МодульОбъекта(39)}: Ошибка при вызове метода контекста (КопироватьФайл)

    КопироватьФайл(«v8res://mngbase/»+п_Форма.Значение+».lf»,п_Файл.ПолноеИмя);

    по причине:

    Ошибка копирования файлов

    по причине:

    Файл не обнаружен ‘v8res://mngbase/DataHistoryVersionData.lf’. Ресурс не найден

    Нашел похожие формы

    DataHistoryVersionDataRuForm

    DataHistoryVersionsDiffRuForm

    Но уже с русскими именами параметров

    Reply
  35. tormozit

    (35) DataHistoryVersionsDiffRuForm DataHistoryVersionDifferenecesRuForm

    Reply
  36. ZhokhovM

    (35) Понял, исправлю.

    Reply
  37. ZhokhovM

    04.06.2019:

    Что изменилось:

    Добавлены формы:

    dcsgroupselecteditems_mobile

    dcstableselecteditems_mobile

    dcschartselecteditems_mobile

    dcssettingselecteditems_mobile

    dcsnestedsettingselecteditems_mobile

    image

    StandardPeriodM

    moxelGoToCell

    moxelInsert

    moxelSplitCell

    moxelRowHeight

    moxelColumnWidth

    moxelDeleteCell

    MoxelHeadersAndFooters

    moxelSectType

    FontChooseDlgMobile

    HelpM

    PrintInfo

    PageSettings

    About

    InputPurchaseEmu

    SelectFileDlg

    ChartPaletteDescription

    ChartRefLines

    ChartRefBands

    DCSChartRefLine

    DCSChartRefBand

    ChartTypeChoose

    DataHistoryChangeHistoryEnForm

    DataHistoryChangeHistoryRuForm

    DataHistoryVersionDataEnForm

    DataHistoryVersionDataRuForm

    DataHistoryVersionDifferencesEnForm

    DataHistoryVersionDifferencesRuForm

    DataHistoryVersionsFilterDialog

    DataHistoryUsersChooseDialog

    ECSSettings

    SearchForm

    SearchForm_ru

    ECSMainFormMA

    ECSMainFormMA2

    ECSConvAddMA

    ECSConvTitleMA

    ECSConvMembersMA

    ECSUserInfoMA

    ECSContextConvSmallMA

    ECSContextConvLargeMA

    ECSFullUserInfoDlgMA

    TypeDomainDlgMA

    ECSSettingsMA

    ECSContextConvSmallMAv13

    ECSContextConvLargeMAv13

    ECSConvAddMAv13

    ECSConvMembersMAv13

    ECSFullUserInfoDlgMAv13

    ECSMainFormMAv13

    ECSMainFormMA2v13

    CertificateInfo

    CryptoCertManager

    Тестировал на платформе 8.3.14.1779.

    Reply
  38. ZhokhovM

    (36)Добавил. Список изменений предоставил. Файлы, которые выгружаются с ошибками — рекомендуется выгружать на старых платформах. Похожие формы обнаруживаются только в новых платформах.

    Reply
  39. SlavaKron

    Может просто обработкой получить системную папку bin 1С, прочитать файл mngbase_root.res. Найти в нём позицию первого «.lf» + нулевой байт и читать пока идут печатаемые символы или нулевой байт.

    Reply
  40. ZhokhovM

    (40)Тоже об этом подумал, но времени пока не нашлось.

    Reply
  41. acanta

    Для других языков свои версии формы истории данных?

    Reply
  42. ZhokhovM

    (40)А еще нужно уметь сравнивать формы: какие добавлены, а какие удалены.

    Reply
  43. ZhokhovM

    (42)Для языка RU в некоторых формах есть код или форма на русском.

    Reply
  44. SlavaKron

    (41)

    &НаКлиенте
    Процедура ПолучитьСписокРесурсов(Команда)
    
    ИменаРесурсов = Новый Соответствие;
    
    КаталогПрограммы = КаталогПрограммы();
    
    //ОбластьПоиска = НайтиФайлы(КаталогПрограммы, «*.*», Истина);
    
    ОбластьПоиска = Новый Массив;
    ОбластьПоиска.Добавить(КаталогПрограммы + «mngbase_root.res»);
    ОбластьПоиска.Добавить(КаталогПрограммы + «mngbase_ru.res»);
    
    Маркер = Новый БуферДвоичныхДанных(4);
    Маркер[0] = КодСимвола(«.»);
    Маркер[1] = КодСимвола(«l»);
    Маркер[2] = КодСимвола(«f»);
    Маркер[3] = 0;
    
    БайтБуфер = Новый БуферДвоичныхДанных(1);
    
    Для Каждого ИмяФайла Из ОбластьПоиска Цикл
    ЧтениеДанных = Новый ЧтениеДанных(ИмяФайла);
    
    Если ЧтениеДанных.ПропуститьДо(Маркер) = -1 Тогда
    Продолжить
    КонецЕсли;
    Поток = ЧтениеДанных.ИсходныйПоток();
    Поток.Перейти(-6, ПозицияВПотоке.Текущая);
    
    Пока Истина Цикл
    Поток.Прочитать(БайтБуфер, 0, 1);
    Если БайтБуфер[0] = 0 Тогда
    Прервать
    КонецЕсли;
    Поток.Перейти(-2, ПозицияВПотоке.Текущая);
    КонецЦикла;
    
    ТекущееИмя = «»;
    КодПредыдущего = 0;
    
    Пока Истина Цикл
    Поток.Прочитать(БайтБуфер, 0, 1);
    Код = БайтБуфер[0];
    
    Если Код = 0 Тогда
    Если КодПредыдущего = 0 Тогда
    Прервать
    КонецЕсли;
    ИменаРесурсов.Вставить(ТекущееИмя, ИмяФайла);
    ТекущееИмя = «»;
    ИначеЕсли Код >= 32 И Код <= 122 Тогда
    ТекущееИмя = ТекущееИмя + Символ(Код);
    Иначе
    Прервать
    КонецЕсли;
    КодПредыдущего = Код;
    КонецЦикла;
    
    Если ТекущееИмя <> «» Тогда
    ИменаРесурсов.Вставить(ТекущееИмя, ИмяФайла);
    КонецЕсли;
    
    Поток.Закрыть();
    ЧтениеДанных.Закрыть();
    КонецЦикла;
    
    СписокИмен.Очистить();
    Для Каждого КлючИЗначение Из ИменаРесурсов Цикл
    НоваяСтрока = СписокИмен.Добавить();
    НоваяСтрока.ИмяРесурса = КлючИЗначение.Ключ;
    НоваяСтрока.Источник = КлючИЗначение.Значение;
    КонецЦикла;
    
    СписокИмен.Сортировать(«ИмяРесурса»);
    
    КонецПроцедуры

    Показать

    Reply
  45. ZhokhovM

    (45)О, спасибо! Постараюсь внести изменения в ближайшие дни.

    Reply
  46. buganov

    (18) а через ОткрытьФорму(…) нельзя было протестить?

    Reply
  47. ZhokhovM

    (47)так список форм нужен был не полный, а тот который в стандартной форме «Все функции». если открывать все формы, то там большинство не ошибки. например, при проверке материалов или совместимо 1с проверяет практически все формы и не все из них является ошибками.

    Reply
  48. ZhokhovM

    (45)В список ресурсов попадает не только ресурс .lf, но и .mxl, .txt, .zip, .epf и т.д. Нужно слегка подправить код.

    Reply
  49. ZhokhovM

    07.06.2019:

    Что изменилось:

    Получение списка ресурсов непосредственно из файлов «mngbase_root.res» и «mngbase_ru.res».

    Чтобы получить нужную системную папку bin 1С нужно запускать конкретную версию платформы.

    Reply
  50. ZhokhovM

    10.10.2019:

    Что изменилось:

    Добавлено сравнение ресурсов с другими каталогами.

    Порядок действий:

    Запустить 1С:Предприятие в режиме толстого клиента — открыть обработку преобразования стандартных форм — нажать на кнопку «Сравнить с другими каталогами (толстый-клиент)» — выбрать другую системную папку bin 1С и нажать «Выбор папки» — будут отображены отличия в специальном окне (см. скриншот в публикации).

    Пример системной папки:

    C:Program Files (x86)1cv8хх.хх.хх.ххin

    Reply
  51. frkbvfnjh

    (51) А есть форма предварительного просмотра табличного документа?

    Reply
  52. ZhokhovM

    (52)Не нашел форму, вроде нет.

    Reply
  53. frkbvfnjh

    (53) Прискорбно, спасибо

    Reply
  54. ZhokhovM

    (54)используйте типовую форму «ОбщаяФорма.ПечатьДокументов».

    Reply
  55. ZhokhovM

    (32)Пока в разработке — обычные формы.

    Reply
  56. ZhokhovM

    07.11.2019:

    Что изменилось:

    Добавлена возможность анализировать ресурсы всех файлов и преобразовать стандартные обычные формы без модуля(*.f).

    Reply

Leave a Comment

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