Недокументированное использование стандартных форм 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 не будет опубликован. Обязательные поля помечены *