Коллеги, добрый день.

Пытаюсь настроить Visual Studio для разработки отдельных модулей исходного кода без перекомпиляции всей структуры как описано в статье https://academy.terrasoft.ru/documents/technic-sdk/7-13/razrabotka-konf…

Настроил всё по инструкции, Debug успешно запускается, но при обращении к свойствам EntitySchemaManager, например, прямо на первой строке примера из статьи:

 var schema = userConnection.EntitySchemaManager.GetInstanceByName("Contact");

получаю ошибку 

Exception: Exception thrown: 
'Terrasoft.Common.ArgumentNullOrEmptyException' in Terrasoft.Common.dll 
("Value for argument "outputDirectory" must be specified."). 

Может кто-то уже сталкивался с подобным? Подскажите что за outputDirectory и где его нужно его указать?

 

Нравится

2 комментария

Было похожее,  в ходе тестирования было выявлено, что проблемы возникали из-за параметра:

<add key="Feature-UseRuntimeEntitySchemaMetadata" value="true" /> 

в  Terrasoft.Tools.WorkspaceConsole.exe.config.

При значении false отладка работает.

Зверев Александр,

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

Показать все комментарии
Lead
Лид
продажа
7.12
sales

Добрый день!



Хочется узнать идеологическое обоснование того, что сейчас к лиду привязана только одна продажа.

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



В итоге привязка первой продажи к лиду пропадает.

Ваше мнение, как корректнее было бы управлять такими ситуациями?

Изображение удалено.

Нравится

7 комментариев
Лучший ответ

Я бы предложила при возврате лида - оставить его для истории. А для работы создать новый лид . Ведь если лид не закончился продажей - значит необходимо поменять условия и тактику. Это уже можно назвать новым лидом. Возможно создать "Родительский лид" и связать его со всеми дочерними.

Так можно решить проблему и цитата: "...И в рамках одной потребности можем получать лиды на 10 вебинаров, 5 white page и по другим каналам  Причём, от разных контактов..." Привяжите их к "родителю". для "родительского лида" создайте отчетные поля.

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

О лидах и продажах описано тут.

Слишком много логики их связывает, все квалификации-дисквалификации, чтобы переделывать на деталь.

Может, лучше просто пользоваться кнопкой копирования в разделе лидов. Или, развивая вариант, сделать БП, который делает копию лида в нужном состоянии и в ранее добавленное справочное поле ставит ссылку на родительский.

Эту логику мы читали. Просто, и так слишком много лидов генерируется, пока один клиент с одной потребностью разбирается  А тут ещё один лид без сохранения истории создадим. 

Можно настроить в разделе фильтрацию, чтобы не видеть не интересующие лиды.

У меня больше идеологические расхождения. 

Что мы взращиваем - потребность (может быть много разных лидов) или конкретную заявку (лид в системе) 

И в рамках одной потребности можем получать лиды на 10 вебинаров, 5 white page и по другим каналам  Причём, от разных контактов.

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

Лидов может быть ещё больше. Если подключена веб-форма регистрации лидов, один и тот же человек может их завести сколько угодно. Но в результате продадут только по одному.

Я бы предложила при возврате лида - оставить его для истории. А для работы создать новый лид . Ведь если лид не закончился продажей - значит необходимо поменять условия и тактику. Это уже можно назвать новым лидом. Возможно создать "Родительский лид" и связать его со всеми дочерними.

Так можно решить проблему и цитата: "...И в рамках одной потребности можем получать лиды на 10 вебинаров, 5 white page и по другим каналам  Причём, от разных контактов..." Привяжите их к "родителю". для "родительского лида" создайте отчетные поля.

Показать все комментарии

Есть проблема: При удалении записи(допустим контакта) нужно сделать обработку контрагента этого контакта. Можно ли в БП как то узнать контрагента этого контакта? И если нет, то как вообще это сделать? Только на стороне клиента?

Нравится

8 комментариев
Лучший ответ

В объекте можно отловить событие Deleted (После удаления записи). В БД записи уже не будет, но из текущей Entity вы еще сможете получить контрагента.

Entity.GetTypedColumnValue<Guid>("AccountId");

Добрый день. Нужно на уровне объекта Контакт (в данном случае) создать событийный процесс сигналом для начала которого будет сообщение "Перед удалением записи" (ContactDeleting) , там считать данные этой записи (контрагента) и выполнить какую-то логику, это будет происходить все на сервере



Либо в БП просто началом процесса назначить сигнал "Удаление записи" 

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

Колодяжный Владислав Эдуардович,

перед удалением - это 100% удаление потом будет?

Обработка контрагента происходит на основании оставшихся контактов. В принципе, можно исключить с обработки этот контакт, но если удаление не произойдет?

В БП после события удаления я могу влепить элемент чтения(прочитать поле контрагент) потом посчитать к примеру кол-во контактов в контрагенте - посчитает с удаленным или без?

В объекте можно отловить событие Deleted (После удаления записи). В БД записи уже не будет, но из текущей Entity вы еще сможете получить контрагента.

Entity.GetTypedColumnValue<Guid>("AccountId");

Радчук Виталий Владимирович,

В БП посчитает с "удаленным". Как раз недавно столкнулся. (Физически запись еще не удалена). Оптимальным решением будет написание логики в объекте на событии "После удаления записи".

Добавить комментарий

Пащенко Александр Сергеевич пишет:

то что нужно! 

Радчук Виталий Владимирович пишет:

В БП после события удаления я могу влепить элемент чтения(прочитать поле контрагент) потом посчитать к примеру кол-во контактов в контрагенте - посчитает с удаленным или без?

Считайте количество контактов, без учёта (AND Id <>...) Id удаляемой записи , получаемого в сигнале

Показать все комментарии

Решил подключить Visual Studio,  для более удобной разработки.

После измены параметров:

fileDesignMode enabled="true" />
...

зашел компилировать - пишет что не найдено родителя у (Внимание!) схемы - это исходный код!

В системе уже есть несколько пакетов с доработками, все делал по https://academy.terrasoft.ru/documents/technic-sdk/7-12/nastroyka-visual-studio-dlya-razrabotki-v-faylovoy-sisteme

Как скомпилировать и продолжить настройку?

Нравится

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

 

Вот текст ошибки:

Зависимость 'UsrSyncInvoicesService' пакета 'Sync1C' не найдена. Путь поиска: C:\inetpub\wwwroot\Terrasoft.WebApp\Terrasoft.Configuration\Pkg\Sync1C\Schemas\UsrSyncInvoicesService\UsrSyncInvoicesService.cs

Добрый день. Скомпилируйте через конфигурацию, потом обновите проект и продолжайте работать из студии.

Ефанов Иван Александрович,

так не дает скомпилировать! я же писал об этом

Судя по тексту сообщения, что-то неправильно сделано с самодельной схемой UsrSyncInvoicesService. Возможно, на неё есть ссылка из другой схемы, а сама UsrSyncInvoicesService была удалена, переименована или не перенесена с другой базы.

Зверев Александр,

Она на месте, с ней все в порядке, используется в БП, компиляция без настроек проходит успешно

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

Показать все комментарии

Добрый день, формирую процесс, который бы изменял права доступа на запись раздела Контакт или Контрагент при изменении ответственного. Вопрос - как получить id пользователя, группу орг. структуры, группу руководителя и группу руководителя выше стоящего эл-та орг. структуры для контакта, который указан в Ответственном?

Нравится

2 комментария
Лучший ответ

Можно получить выполнив весьма громоздкий запрос к таблицам SysAdminUnit и SysUserInRole. Иначе никак.

Похожий вопрос обсуждали в теме: https://community.terrasoft.ua/questions/proverit-nalicie-prav-u-polzov…



И учтите, что один пользователь может входить в несколько групп орг.структуры. Тогда остается вопрос, должны ли все его руководители видеть его записи. В некоторых проектах мы напрямую указывали отдел (или руководителя) в карточке пользователя

Можно получить выполнив весьма громоздкий запрос к таблицам SysAdminUnit и SysUserInRole. Иначе никак.

Показать все комментарии
7.10
sales

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

Попытался повторить ответ на вопрос https://community.terrasoft.ru/questions/sredstva-svazi-lida, так как в моем случае, средства связи будут привязываться(указывать) к конкретному лиду.

Но реализовать выше приведенную пример, мне не удалось, деталь не отображается. 

Таблица детали: 

UsrLeadCommunication, унаследована от Базовое средство связи ( Base ).

Добавил два Lookup'а на таблицу Lead, и на таблицу раздела, где должна отображаться данная деталь. 

Модель детали: 

define("UsrLeadCommunicationDetail", ["UsrLeadCommunicationDetailResources", "terrasoft", "Lead",
    "ConfigurationEnums", "ConfigurationConstants"], function(resources, Terrasoft, Lead, ConfigurationEnums,
    ConfigurationConstants) {
        return {
            entitySchemaName: "UsrLeadCommunication",
            methods: {}
        };
    });

В dependencies добавил все зависимости. 

В page раздела добавил: 

в details: 

  

{
   // Настройка детали [Способы связи]
   "UsrLeadCommunicationDetailElement": {
      "schemaName": "UsrLeadCommunicationDetail",
      "entitySchemaName": "UsrLeadCommunication"
      "filter": {
         "detailColumn": "UsrApplicationForm", // Lookup на раздел с формой
         "Id"
      }
   }
}



            

в diff:

{
   "operation": "insert",
   // Название детали.
   "name": "UsrLeadCommunicationDetailElement",
   "values": {
      "itemType": Terrasoft.core.enums.ViewItemType.DETAIL,
      "markerValue": "added-detail"
   },
   "parentName": "Tabf9415591TabLabel",
   "propertyName": "items",
   // Индекс в списке добавляемых элементов.
   "index": 3
}

 

В логи браузера сыпется ошибка: 

SchemaBuilderV2.js:282 Uncaught TypeError: Cannot read property 'entitySchemaName' of undefined
    at i. (SchemaBuilderV2.js:282)
    at all-combined.js:503
    at Object.execCb (require.js:1693)
    at Module.check (require.js:881)
    at Module.enable (require.js:1173)
    at Module.init (require.js:786)
    at require.js:1457

 

Вопрос: как правильно реализовать деталь средств связи для формы раздела? 

Нравится

4 комментария
Лучший ответ

Проверьте ошибки при сохранении схемы и устраните,обычно данное сообщение связано с нарушение структуры модуля, те лишняя запятая, скобка и тд. Все это в последних версиях проверяется при сохранении и выводится ошибка и номер строки в которой она обнаружена!

Если не получится найти ошибку самостоятельно приведите полный исходный код модуля (текст)

Проверьте ошибки при сохранении схемы и устраните,обычно данное сообщение связано с нарушение структуры модуля, те лишняя запятая, скобка и тд. Все это в последних версиях проверяется при сохранении и выводится ошибка и номер строки в которой она обнаружена!

Если не получится найти ошибку самостоятельно приведите полный исходный код модуля (текст)

Григорий Чех, 

Спасибо за Ваш ответ! Ошибки действительно присутствовали(не хватало запятой), все исправил(так же проверил остальные модули). Теперь форма раздела открывается, отображаются другие детали, но данная деталь "Средства связи" не отображается.

В консоль браузера сыпятся ошибки:

Uncaught TypeError: Cannot set property 'entitySchemaName' of undefined
    at initSchemaCustomAttributes (SchemaBuilderV2.js:132)
    at f (all-combined.js:495)
    at i.<anonymous> (SchemaBuilderV2.js:111)
    at all-combined.js:503
    at Object.execCb (require.js:1693)
    at Module.check (require.js:881)
    at Module.<anonymous> (require.js:1136)
    at require.js:134
    at require.js:1186
    at each (require.js:59)
core.js:633 
--------------------------------------------------
user: Supervisor/7f553b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost:83/0/Nui/ViewModule.aspx
 line: 3
 column: 1
 message: Uncaught SyntaxError: Unexpected token < 
 date: Wed Oct 31 2018 20:12:20 GMT+0300 (Москва, стандартное время)
 stack: SyntaxError: Unexpected token <
writeErrorMessage @ core.js:633
core.js:633 
--------------------------------------------------
user: Supervisor/7f3b869f-34f3-4f20-ab4d-7480a5fdf647
 file: http://localhost:83/0/configuration/257f6624f537935d17c182584045709dru-RU/SchemaBuilderV2.js
 line: 132
 column: 38
 message: Uncaught TypeError: Cannot set property 'entitySchemaName' of undefined 
 date: Wed Oct 31 2018 20:12:20 GMT+0300 (Москва, стандартное время)
 stack: TypeError: Cannot set property 'entitySchemaName' of undefined
    at initSchemaCustomAttributes 

По первой ошибке открыл код(привожу строки, где эта ошибка содержится): 

// файл SchemaBuilderV2.js
if (entitySchemaName) {
	schemaResponse.entitySchemaName = entitySchemaName; // ошибка тут
}
callback(config);

 

Вы деталь зарегестрировали, те выполнили sql запросы? Очистили кєш браузера, кєш рєдиса? Если это дела или не помогло выкладывайте код вашейдетали и код старницы куда ее подключили

Григорий Чех,

Добрый день! Некоторыми способами удалось достичь желаемое, необходимо было в странице формы при объявлении детали, заменить колонку детали в фильтре: 

{
   // Настройка детали [Способы связи]
   "UsrLeadCommunicationDetailElement": {
      "schemaName": "UsrLeadCommunicationDetail",
      "entitySchemaName": "UsrLeadCommunication"
      "filter": {
         "detailColumn": "UsrLead", // << Здесь нужна была замена
         "Id"
      }
   }
}

Так же добавил все зависимости, какие находятся у базовой  детали средств связи с полями

В справочнике UsrApplicationForm изменил свойство "Обязательно для заполнения" на "Уровне приложения". 

После данных действий, деталь корректно отобразилась на странице. Появился список с возможность выбора средства связи, есть возможность заполнения выбранного средства связи. 

Но, присутствует проблема сохранения. 

При сохранении записи кнопкой Save, расположенной в левой верхней части формы, в лог браузера появляется ошибка: 

user: Supervisor/7541b869f-34f3-4f20-ab4d-7480a5fdf647
 file: undefined
 line: undefined
 column: undefined
 message: Cannot read property 'replace' of undefined 
 date: Thu Nov 08 2018 15:40:33 GMT+0300 (Москва, стандартное время)
 moduleId: ext-window
 moduleName: undefined

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

Показать все комментарии

1) Добавил базовую схему детали с полями согласно статье: https://academy.terrasoft.ru/documents/technic-sdk/7-11/sozdanie-polzovatelskoy-detali-s-polyami

define("InformationDetail", [],
    function() {
        return {
            entitySchemaName: "GeneralInformation",
            diff: [],
            methods: {
                getDisplayColumns: function() {
                    return ["Identifier", "Type", "FullName", 
                    "Birthday"];
                }
            }
        };
    }
);

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

 

Вопрос: как отобразить произвольное количество элементов (колонок) по две на строке?

Нравится

2 комментария
Лучший ответ

Вам нужно создавать деталь с реестром (редактируемым или не редактируемым (если добавление/изменение будет по кнопке)

Подробнее смотрите в академии

Вам нужно создавать деталь с реестром (редактируемым или не редактируемым (если добавление/изменение будет по кнопке)

Подробнее смотрите в академии

Григорий Чех,

Спасибо, посмотрю.

Показать все комментарии

Выполняется интергация с другой системой. Нужно из трансферной таблицы которая находится в другой базе данных достать значения. Можно ли это сделать средствами BPM?

PS: БД Oracle Database 11g

Нравится

3 комментария
Лучший ответ

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

 

Все мощь .net (c#) к вашим услугам, вариантов подключения множетство. Наберите в гугле using C# without Oracle Client

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

 

Колодяжный Владислав Эдуардович,

так и решил сделать

Показать все комментарии

Вот такая ошибка, зайти нельзя, бекапа пакетов нет, там дохрена разных разработок. Последнее что делал - успешная компиляция - создал 2 новых сервиса ReportHelper ReportService - копиии базовых с приставкой к именам. Компиляция была успешна, я не проверяя отошол н немного, после прихода оказалось что база выдает вот такое и изменить конфигурацию уже нельзя. Я надеюсь на вашу поддержку и что ктото стыкался с данной проблемой....Изображение удалено.

Нравится

5 комментариев
Лучший ответ

Если не выгружены исходники, то можно попробовать обнулить AssemblyData в базе, предварительно сделав бэкап. Тогда должно сразу при логине пустить в конфигурацию.

 

update SysWorkspace
set AssemblyData = null
where Id='07BA2497-D09B-40EF-92D3-D56F01D426FA' -- Id вашей конфигурации

 

Добрый день, попробуйте зайди в конфигурацию, дописав в конце адреса /dev и откомпилировать.

Данные никакие не устанавливали?

Схемы исходного кода добавляли без публикации (только сохранение) ?

Судя по адресу, сайт у вас локально, попробуйте почитать логи, дам может быть более подробная ошибка. C:\Windows\Temp\BPMonline

0/dev  - не помогло, таже ошибка, соответственно зайти и скомпилировать не могу....

нет не устанавливали

последнее что добавлял я - было успешно скомпилировано

сейчас логи посмотрю

2018-10-30 09:33:16,476 [BPMonlineQuartzScheduler_Worker-5] ERROR SBORKI-TS\Developer Terrasoft.Core.Scheduler.ProcessJobStub SafeSendRequest - System.Net.WebException: Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

   в System.Net.HttpWebRequest.GetResponse()

   в Terrasoft.Core.Scheduler.ProcessJobStub.SafeSendRequest(HttpWebRequest request)

 

Наиболее вероятная ошибка, сейчас постоянно пишет в логах

Судя по всему, после создания клонов ReportHelper и ReportService у вас в системе 2 класса с одинаковым именем в одном пространстве имен. Если у вас подключена VisualStudio и включен режим разработки в файловой системе, можно исправить название классов оттуда, не заходя в конфигурацию.

Если не выгружены исходники, то можно попробовать обнулить AssemblyData в базе, предварительно сделав бэкап. Тогда должно сразу при логине пустить в конфигурацию.

 

update SysWorkspace
set AssemblyData = null
where Id='07BA2497-D09B-40EF-92D3-D56F01D426FA' -- Id вашей конфигурации

 

Показать все комментарии
наследование
карточка сотрудника
7.12
sales

В карточке сотрудника нужно вместо поля Photo из контакта отображать другое поле.

Каким образом можно это реализовать, если в карточке сотрудника метод init() реализован таким образом:

                init: function() {

                    this.primaryImageColumnName = "ContactPhoto";

                    this.on("change:OrgStructureUnit", this.onChangedOrgStructureUnit, this);

                    this.callParent(arguments);

                },

То есть мне нужно, чтобы в моей карточке сотрудника в init были 2-я и 3-я строчки, а первая нет.

Но из-за описанной выше реализации, я не могу теперь реализовать свой код просто добавив свою логику и после вызвать родительскую.

Можно ли вообще каким-то образом указать, чтобы в моем методе вызывались 2-я и 3-я строчки, именно из тех карточек, из которых нужно, а не из непосредственного родителя?

Нравится

13 комментариев

А если через правила сделать фото невидимым?

Григорий Чех,

Допустим, и что дальше?

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

В init

this.callParent(arguments);

this.set(this.primaryImageColumnName, null);

Григорий Чех,

Не уверенна, что так заработает, но можно попробовать.

Григорий Чех,

Хотелось бы по данному вопросу услышать комментарий службы поддержки!

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

init: function() {

       this.primaryImageColumnName = "ContactPhoto";                                               this.on("change:OrgStructureUnit",this.onChangedOrgStructureUnit, this);

       this.callParent(arguments);

    }

Переписав тот же самый код (без первой строки), а в наследниках уже дополнить метод под каждую карточку отдельно

Колодяжный Владислав Эдуардович,

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

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

Весь вопрос в том, что метод реализован некорректно и, если бы код в 1-й и 2-й строчке метода init был вынесен в другую функцию, то никаких бы сложностей не возникло.

Мне нужно было бы всего-то переопределить эту функцию и все.

 

но смысл тогда в базовых разделах, особенно, таком, как сотрудники.

Смысл, внезапно, в ведении информации о сотрудниках.

Весь вопрос в том, что метод реализован некорректно

Метод реализован корректно. Фото выводится.

По поводу обнуления после вызова this.callParent(arguments), то в странице SysProcessUserTaskPage есть такое обнуление:

onImageChange: function(image) {
    if (!image) {
        this.set(this.primaryImageColumnName, null);
        return;
    }

То есть присваивание значения с последующим его удалением, в принципе, может работать. Но доработанную логику нужно тестировать.

Зверев Александр пишет:

Смысл, внезапно, в ведении информации о сотрудниках.

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

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

Зверев Александр пишет:

Метод реализован корректно. Фото выводится.

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

Зверев Александр пишет:

Но доработанную логику нужно тестировать.

Да, теперь мне придется, чтобы доработать свою логику, "забить" костыль devil

Я немного в шоке. Вместо пары строк кода вы развели вайн на пару страниц.

init: function(callback, scope) {
	//сначала вызовутся родительские init-методы
	this.callParent([function() {
		debugger;
		//тут можно занулить this.primaryImageColumnName
		callback.call(scope);
	}, this]);
}

Зверев Александр,

Это всё замечательно, но вот ситуация: я захотел заместить в одной схеме ViewModel. Модули (внезапно!) с 7.13 замещать нельзя. Ну ок, делаем свой через extend. Лезем в схему, а там прямо в init зашита сторчка а-ля:

this.viewModelName = '123'; this.callParent(arguments);

Ну клёво теперь. И как в таком случае менять что-либо? (принимая во внимание, что 95% пользователей не знают о коде выше). Делать сначала callParent, а потом простановку своего viewModelName — бред. Привет асинхронность, непонятно какое присвоение выполнится первее. Таймауты/деферы - костыль. Так-то вынести всю кастомную логику из init  в отдельную функцию - правильнее будет. 

PS. Пользуясь случаем - какой гений догадался запретить перегруз модулей?

Если есть идеи по разработке собственного раздела сотрудников, улучшенного по сравнению со стандартным, можно его выпустить и продавать в маркете.

Варфоломеев Данила пишет:

Так-то вынести всю кастомную логику из init  в отдельную функцию - правильнее будет

Так вот об этом же и речь, что нужно не только реализовать "шоб работало", но и так, чтобы потом с этим другие могли работать! 

Тут палка о двух концах. Если вообще всё выносить в отдельные функции, в ожидании, что кто-то захочет их переопределить, то сам код станет более громоздким и хуже читаемым. Хотя и более структурируемым. Видимо, при создании этой функции не предполагалась потребность в смене поля с картинкой.

В 3.Х и 5.Х не было разграничений по пакетам, весь код доступен для изменений, но там и нет автоматизации обновления конфигурации на новые версии.

Показать все комментарии