суббота, 15 сентября 2012 г.

1С:Предприятие 8.2. Управляемая Форма. Меняем иконку рабочего стола.

Многим разработчикам 1С наверно понравился новый подход к интерфейсу в 1С:Предприятие 8.2. Теперь не надо надо мучиться с привязками элементов, не надо рассчитывать координаты элементов, не надо думать что отображать для одного пользователя, что для другого. 1С стала "умнее". Но есть вещи которые нельзя изменить, например, расположение основных элементов интерфейса (панель разделов, панель навигации и др.). Для конфигураций имеющих свой дизайн важно иметь возможность сменить не только картинки разделов для созданных подсистем, но и картинку рабочего стола, но менять ее нет возможности. Сама 1С объясняет это тем что интерфейс любой конфигурации должен быть унифицирован: "Дело не в одной картинке, а в общей стилистике для любых конфигураций. Важно чтобы пользователи привыкали к общему стилю и одинаково воспринимали одинаковые элементы в разных конфигурациях - это ускорит и освоение конфигураций и повседневную работу пользователей с ними." (http://partners.v8.1c.ru/forum/thread.jsp?id=714007)

Но все же можно попытаться ее сменить.
Ход мыслей простой - картинка где то должна храниться как файл, как поле БД, как часть файла, как ссылка. Надо только ее найти. Самый простой способ ее найти это запустить любую конфигурацию 1С в веб клиенте. Например УТ 11. Сделать это можно со страницы http://v8.1c.ru/trade/demo/index.htm или непосредственно http://demo-ma.1c.ru/trade.

1с управляемая форма


Далее включаем режим разработчика, в Internet Explorer 9 это делается клавишей F12 либо через меню Настроек.

Просматриваем содержимое веб-клиента 1с

Теперь надо найти элемент соттветствующий картинке рабочего стола. Для этого включим возможность выделения мышью.

Просматриваем содержимое веб-клиента 1с

Выделим картинку рабочего стола.

Просматриваем содержимое веб-клиента 1с

Внизу приложения отобразится строка HTML разметки: "<div id="img_0" style="width: 48px; height: 48px; background-image: url("e1cib/convertPicture?sysver=8.2.15.318&url=e1csys%2Fbackend%2Fdesktop.png&w=48&h=48");"/>"

e1cib/convertPicture?sysver=8.2.15.318&url=e1csys%2Fbackend%2Fdesktop.png&w=48&h=48" становится понятно, что картинку  "desktop.png" из какого то системного хранилища  "e1csys/backend" передают в функцию конвертации картинки до размеров 48*48.

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

Просмотрев множество файлов из "C:\Program Files\1cv82\8.2.16.352", мое внимание привлекли файлы "backend.dll", "backend_ru.res" и "backend_root.res".
В файле "backend_root.re"s нашлось упоминание о "desktop.png". Я пробовал различные редакторы ресурсов, но видимо фирма 1с использует свой редактор. Если открыть этот файл в блокноте, то можно заметить, что файл состоит из двух частей, первая хранит названия ресурсов, а вторая ее данные.

Ресурс 1с

Названия ресурсов перечислены без каких либо указаний на расположение, значит надо искать последовательно в этом файле. Следовательно надо подсчитать порядковый номер нашей картинки и найти по порядковому номеру ее данные из второй секции файла. Действий будет меньше если мы будем считать количество файлов с раширением "png", а во второй секции будем искать файл который содержит "‰PNG". Лучше использовать HEX-редактор. Я буду использовать WinHEX.
Итак найдем порядковый номер искомого файла среди файлов формата PNG.

Ресурс 1с

Если долго жать F3 и считать количество нажатий то мы прийдем к записи "desktop.png". Для версии 8.2.16.352 он оказался 11-м.
Теперь найдем Начало данных этого файла. Для этого 11 раз нажмем F3 при установленном поиске "PNG". Не забудьте установить галочку "Match case", она дает указание, что поиск идет с учетом регистра символов.
Ресурс 1с

Нажав F3 одиннадцать раз мы перешли на начало файла. Но как найти окончание файла? Для этого достаточно глянуть любой другой файл формата "PNG". Он заканчивается строкой "END®B`‚", мало того в файле  "backend_root.res" есть разделитель между ресурсами.
Ну так давайте выделим этот диапазон двоичных данных и сохраним в отдельный файл.
Мышкой протянем от начала файла.


И до следующего файла


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

Теперь скопируем выделенный блок в новый файл (Cntr+Shift+N). Так мы сможем проверить что нашли тот самый файл иконки рабочего стола и там же будем его править.



Сохраняем картинку 1с

После просмотра сохраненной картинки, было понятно что хранятся они не последовательно. На 11й позиции была другая картинка. Пришлось скопировать другие блоки, что бы найти нашу картинку. Она оказалась на 18 месте.

Иконка рабочего стола 1с

Советую перед все эти действия выполнять на копиях файлов.

Теперь нам нужен графический редактор. Я буду использовать Paint. Меняем рисунок на свое предпочтение. Например так:

Иконка рабочего стола 1с

И теперь осталось поместить новый рисунок в файл ресурсов. Недостаток в том, что измененный файл должен быть не больше по размеру чем исходный. Возможно это не так, но файл большего размера у меня поместить не удалось.
Потому измененный файл надо подогнать под размер исходного файла. Откроем ИсходныйФайл.png и посмотрим размер:


Его размер 3145 байт.

Откроем ИзмененныйФайл.png и определим его размер.


Размер измененного файла - 2643 байта. Разница в размерах 502 байта.

Дополним измененный файл нулями до нужного размера:


Нажмем ОК и сохраним файл.

Смена иконки рабочего стола 1с

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

Теперь в WinHEX выделяем весь "ИзмененныйФайл.png" (Cntr+A) и копируем (Cntr+C). переходим к файлу "backend_root.res". Надо заменить блок с изображением рабочего стола на скопированную в буфер обмена  измененную пиктограмму рабочего стола. Перейдите на начало блока и вызовите команду Write(Cntr+B). Эта команда вставить содержимое буфера с заменой, а не с добавлением.

Смена иконки рабочего стола 1с

Проверьте что расмер файла  "backend_root.res" не изменился и сохраните.

Можно ложить файл обратно в папку  "C:\Program Files\1cv82\8.2.16.352" и запускать 1С.

Смена иконки рабочего стола 1с

Ну теперь интерфес точно стал унифицированным! Картинка заменилась только для толстого клиента, наверняка были найдены не все файлы где хранится картинка рабочего стола. Если у вас получится сделать изменение картинки для веб клиента или тонкого клиента, то поделитесь как вам это удалось. Помимо этого есть другие недостатки, например при обновлении платформы новый файл  "backend_root.res" может конфликтовать с вашим.

Результаты работы можно скачать тут http://yadi.sk/d/n329aa0TgpfK

Пишите свои комментарии, замечания и предложения. Буду рад, если эта статья вам поможет.






6 комментариев:

  1. Очень интересно про ресурсы. Спасибо за материал.
    Вот ещё как бы сменить надписи в этих ресурсных файлах на свои.

    ОтветитьУдалить
  2. Гениально, особенно про вычисление ...e1cib/convertPicture...! Спасибо! Очень выручило! Менял другой ресурс....оказался совсем в другом файле, заработало сразу и в тонком и в толстом клиенте.

    ОтветитьУдалить
  3. Этот комментарий был удален автором.

    ОтветитьУдалить
  4. Анонимный21 июля, 2016 13:41

    Добрый день!
    Статья очень познавательная.
    Но вот интересно.. Картинка которая запускается при запуске 1с (заставка), лежит в этих-же файлах ?
    Хочу поменять дизайн стандартной картинки при загрузке, сделать ее в темных тонах.

    ОтветитьУдалить
    Ответы
    1. Здравствуйте. Точно сказать не могу, но по моему я ее там видел. Если вы можете использовать версию 1С 8.3 то там есть возможность поменять заставку через конфигуратор. Это намного проще. Точную версию сказать не могу, но сделано это давно, в конце 2014 уже было.

      Удалить
  5. Отличная статья! Спасибо! Использование строки HTML разметки решило мою проблему)

    ОтветитьУдалить