Добрый день.
Есть страница раздела с несколькими полями и деталью на ней. Деталь связана с объектом раздела, но при создании детали заполняется только то поле, по которому идет привязка. Мне нужно чтобы ещё несколько полей с объекта раздела передавалось в деталь. Как это можно сделать?
В схеме страницы редактирования раздела в поле details добавить что-то или же в карточки схемы самой детали нужно как то брать поля у родителя?

Нравится

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

Павел,

В схеме страницы редактирования при добавлении детали можно добавить блок defaultValues.
Ниже пример:

details: /**SCHEMA_DETAILS*/{
	"SmrPhase": {
		"schemaName": "SmrPhaseDetailV2",
		"entitySchemaName": "SmrPhase",
		"filter": {
			"detailColumn": "SmrContract",
			"masterColumn": "Id"
		},
		"defaultValues": {
			"SmrOrder": { // Поле в объекте детали
				"masterColumn": "SmrOrder" // Поле в родительском объекте
			}
		}
	}
}

Дмитрий, спасибо и с наступающим вас)

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

Здравствуйте! Есть объект (объект раздела), при создании которого нужно чтобы поле UsrNumber заполнялось автоматически. Добавляю событие [перед добавлением записи] по этмоу гайду.
Создал [Задание-сценарий] внутри с:

Entity.SetColumnValue("UsrNumber", "Numberrrrrrr");
return true;

Добавляю, открываю новый и ничего с этим полем не происходит.
Подскажите где не правильно?) Есть какая то возможность отслеживать, что происходит внутри процесса, дебагер какой нибудь.

Нравится

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

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

"Зарицкий Олег Васильевич" написал:

Павел,

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


Вообще задача такова - автонумерация полей формата типа "номер - тут зависящие от поля буквы - месяц\дата", поэтому вариант в свойствах установить значение не вариант)

Павел,

Есть несколько подходов по генерации номера. В основном применение того или иного варианта зависит от задачи.

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

Ваш вариант сработает после нажатия кнопки "Сохранить" на уровне объекта. Т.е. пользователь увидит номер уже после сохранения записи.

Отладка серверного кода: http://www.community.terrasoft.ru/blogs/8747

"Толмачев Дмитрий Юрьевич" написал:

Павел,

Есть несколько подходов по генерации номера. В основном применение того или иного варианта зависит от задачи.

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

Ваш вариант сработает после нажатия кнопки "Сохранить" на уровне объекта. Т.е. пользователь увидит номер уже после сохранения записи.

Отладка серверного кода: http://www.community.terrasoft.ru/blogs/8747


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

"Толмачев Дмитрий Юрьевич" написал:Если вы хотите, чтобы пользователь сразу видел новый номер на странице, то логику скорее всего необходимо вешать на странице редактирования в JS коде.

Ваш вариант сработает после нажатия кнопки "Сохранить" на уровне объекта. Т.е. пользователь увидит номер уже после сохранения записи.

А если надо и так, и так (иногда счета создаются автоматически, иногда пользователем), то необходимо делать 2 одинаковые логики - в JS и в процессе?

Владимир,

Если для вас важна последовательность нумерации я бы сделал логику только на уровне объекта в момент сохранения, либо через триггеры (как предлагал Дмитрий тут: http://www.community.terrasoft.ru/forum/topic/14256). Тем более предполагается автоматическое формирование счетов. Неудобство в том, что пользователь сразу не видит номер создаваемого счета.

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

"Толмачев Дмитрий Юрьевич" написал:Если же для вас важно отобразить номер пользователю, то в общем случае могут быть пробелы в нумерации.

А если надо отобразить после сохранения (для ввода продуктов, например, всё равно сохраняется счёт), то как его быстро подчитать из БД?

Здравствуйте, Владимир!

Если нумерация зависит от количества записей, то данная задача решается следующими путями:
1) через ESQ в событии объекта
2) через CustomQuery в событии объекта
3) через БП, запускающийся по событию после добавления записи.

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

"Павел И" написал:Ваш вариант сработает после нажатия кнопки "Сохранить" на уровне объекта. Т.е. пользователь увидит номер уже после сохранения записи.

Дополнительный вопрос:

Стандартный User Task для action = Generate number имеет 2 параметра: ResultCode и EntitySchema.
Необходимо же нумеровать счета в зависимости от типа.

В JS реализовали так (в System Settings задали маски для типов счетов):

getIncrementCode: function(callback, scope) {
	var data = {
		sysSettingName: "ClientInvoice" 
                  + this.get("Resources.Strings.IncrementNumberSuffix"),	
                sysSettingMaskName: "ClientInvoice" 
                  + this.get("Resources.Strings.IncrementMaskSuffix")
	};
	this.callServiceMethod("SysSettingsService", "GetIncrementValueVsMask", function(response) {
		callback.call(this, response.GetIncrementValueVsMaskResult);
	}, 
         data, scope || this); 
},

А как это же реализовать в БП?

Здравствуйте, Владимир!

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

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

Здравствуйте. Возникла необходимость добавления файла документа при формировании Активности. БП построил, но кажется, что-то неправильно указал и желаемого результата не выдало. Помогите пожалуйста разобраться.






Нравится

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

Добрый день, Дмитрий. Вам вместо последних 2-х элементов нужно вставить один элемент "Добавление данных" и там выбрать "Добавить результат выборки"
http://clip2net.com/s/3skvbrd
1. Объект в который записываем.
2. Объект с которого считываем.

"Павлюк Роман" написал:

Добрый день, Дмитрий. Вам вместо последних 2-х элементов нужно вставить один элемент "Добавление данных" и там выбрать "Добавить результат выборки"

http://clip2net.com/s/3skvbrd

1. Объект в который записываем.

2. Объект с которого считываем.

Здравствуйте, Роман. Чему должно соответствовать условие? Просто не понял как у вас заказ оказался равен заказу? Значение полей считываться должно из данных файлов и ссылок документа или же активности?

Здравствуйте, Дмитрий!

Элемент "Изменить данные"/"Добавить данные" не умеет работать с полями типа blob (тип поля, в котором хранятся данные файла).

Если пройтись по процессу, то очень много ошибок. Вероятность того, что в системе созданная активность получит такой же Id, как и Id существующего в системе "Документа" тождественно 0 (скриншоты 3-5).
Последнее изменение данных вообще непонятно. В результате у Вас должно получится две разных записи в разных таблицах с одинаковыми Id?

В комментарии Романа поле объекта "Заказ" сравнивается с параметром процесса Заказ.

Решить Вашу задачу без программирования не получится. К тому же Ваше решение очень сильно увеличит размер базы данных. Представьте, что у Вас есть 1 файл размером 1Мб и Вы создаете 1000 активностей. Размер базы данных вырастет на 1ГБ. Как-то нехорошо...

Более оптимальным будет следующее решение - прикреплять созданной активности ссылку на файл.
В любом случае я Вам рекомендую еще раз продумать бизнес задачу, которую Вы хотите решить и описать ее более подробно.

Здравствуйте, Алексей. Для каждого документа будет создана только одна активность. В системе дополнительно интегрирован PT Docs работа с документами и согласование. По логике сначала будет отправляться активность директору и для облегчения системы, в смысле манипуляций с разделами, было принято решение привязывать файлы и к отправленной активности.
Насчёт ссылки идея хорошая. Не могли бы помочь с данной реализацией?

Добрый день!

Решение будет выглядеть следующим образом:
1. Предположим, что файл уже загружен на деталь “Файлы и ссылки” в документ. Нажать на файл правой кнопкой – Копировать адрес ссылки.
2. Элемент добавления данных. Объект “Файл и ссылка активности”. Заполнить поля: Тип – Ссылка, Активность – СтартовыйСигнал. Id, Название – вставить в кавычках адрес ссылки на файл (например “http://localhost:1760/0/rest/FileService/GetFile/7b332db9-3993-4136-ac3…”)

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

Добрый день!

Как в TS 3.X лучше работать с zip-архивами (распаковать файлы, упаковать файлы)?

Нравится

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

Думаю, стоит использовать какой-то COM-объеккт и вызывать его методы. Например, стандартный в Windows объект Shell.Application тоже умеет работать с ZIP.

Добрый день.
Все зависит от поставленной задачи.

Самый простой способ, это использовать встроенный Zip-архиватор ОС Windows.

Пример использования:

function Main() {
    var zFolder = "c:\\log.zip";
    var eFolder = "c:\\log";
 
    ExtractFileFromZip(zFolder, eFolder);
    CompriseFileToZip(eFolder, zFolder);
}
 
function ExtractFileFromZip(PathFrom, PathTo) {
    var FSO = new ActiveXObject("Scripting.FileSystemObject");
    var App = new ActiveXObject("Shell.Application");
    if (FSO.FolderExists(PathTo)) {
    	FSO.DeleteFolder(PathTo, true);
    }
    FSO.CreateFolder(PathTo);
    var FolderPathTo = FSO.GetFolder(PathTo).Path;
    var FolderPathFrom = App.Namespace(FSO.GetFile(PathFrom).Path);
    var ZipItems = App.Namespace(FolderPathFrom).Items();
    App.Namespace(FolderPathTo).CopyHere(ZipItems);
}
 
function CompriseFileToZip(PathFrom, PathTo) {
    var Str = "PK%05%06%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00";
    var ForWriting = 2;
    var FSO = new ActiveXObject("Scripting.FileSystemObject");
    var App = new ActiveXObject("Shell.Application");
    if (FSO.FileExists(PathTo)) {
    	FSO.DeleteFile(PathTo, true);
    }
 
    var Itm = FSO.OpenTextFile(PathTo, ForWriting, true);
    Itm.Write(unescape(Str));
    Itm.Close();
 
    var Enm = new Enumerator(FSO.GetFolder(PathFrom).Files);
    for (; !Enm.atEnd(); Enm.moveNext()) {
    	Itm = Enm.item();
    	App.Namespace(FSO.GetFile(PathTo).Path).CopyHere(Itm.Path);
	}
}
Показать все комментарии

Здравствуйте. Делаю фильтр по контакту. Нужно что бы отображались контакты, у которых у контрагента определенный тип. Ниже кидаю кусок attributes. Нашел как сделать, но проблема с построением пути к колонке. Подскажите как правильно путь прописать. В таблице Account есть поле TypeId, по нему и нужно фильтровать контакты. В таблице Contact поле AccountId, это типа связь с account. Как я не пробовал, а в консоле когда открываю словарь "Элемент коллекции с именем TypeId не найден".

attributes: {
                "UsrDriver": {
                    dataValueType: Terrasoft.DataValueType.LOOKUP,
                    lookupListConfig: {
                        filters: [
                            function () {
                                var filterGroup = Ext.create("Terrasoft.FilterGroup");
                                filterGroup.add("IsActive",
                                Terrasoft.createColumnFilterWithParameter(
                                Terrasoft.ComparisonType.EQUAL,
                                "Account.TypeId", - (вот на это ругается)
                                 "57412fad-53e6-df11-971b-001d60e938c6"));
                                return filterGroup;
                            }
                        ]
                    }
                }
            }

Нравится

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

без суффикса Id

"UsrDriver": {
	dataValueType: Terrasoft.DataValueType.LOOKUP,
	lookupListConfig: {
		filters: [
			function () {
				var filterGroup = Ext.create("Terrasoft.FilterGroup");
				filterGroup.add("IsActive",
				Terrasoft.createColumnFilterWithParameter(
					Terrasoft.ComparisonType.EQUAL,
					"Account.Type",
					"57412fad-53e6-df11-971b-001d60e938c6"));
				return filterGroup;
			}
		]
	}
},

Так же более предпочтительный вариант, использовать бизнес-правила для этой задачи:
http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddBusines…

"Щиголь Максим" написал:

без суффикса Id

"UsrDriver": {

        dataValueType: Terrasoft.DataValueType.LOOKUP,

        lookupListConfig: {

                filters: [

                        function () {

                                var filterGroup = Ext.create("Terrasoft.FilterGroup");

                                filterGroup.add("IsActive",

                                Terrasoft.createColumnFilterWithParameter(

                                        Terrasoft.ComparisonType.EQUAL,

                                        "Account.Type",

                                        "57412fad-53e6-df11-971b-001d60e938c6"));

                                return filterGroup;

                        }

                ]

        }

},

Так же более предпочтительный вариант, использовать бизнес-правила для этой задачи:

http://academy.terrasoft.ru/documents/docs/technic/SDK/7.6.0/AddBusiness...


Целый день промучился, а знал что истина где то рядом. Спасибо большое.

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

Добрый день!

Подскажите, как в 5-ке вывести всплывающее окно (уведомление) пользователю? Аналог в 7-ке - это:

showOrderInfo: function() {
    var activeRowId = this.get("ActiveRow");
    var gridData = this.get("GridData");
    var dueDate = gridData.get(activeRowId).get("Date");
    this.showInformationDialog(dueDate);
}

Заранее спасибо!

Нравится

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

Вам подойдет следующий способ отсюда:

http://www.community.terrasoft.ru/forum/topic/11784

"Вильшанский Дмитрий" написал:

Стандартный способ показать информационное сообщение пользователю из скрипта страницы.

Создаем скрипт подготовки и Действие процесса "Открыть окно сообщения"

Пишем в скрипте:

InfoMessageUserTask.Page = Page;

InfoMessageUserTask.Icon = "INFORMATION";

InfoMessageUserTask.Buttons = "OK";

InfoMessageUserTask.MessageText = "Тариф успешно заведен в Bill-Master";

*не забываем использовать Localizible strings

Также можно сделать следующим образом:

InfoMessageUserTask.ResponseMessages = new Dictionary<string, string> {{"ok", "SomeMessage"}}  Генерация сообщения SomeMessage по нажатию кнопки ok

Увы, это способ я находил... Я потому и создал новый пост, чтобы узнать, есть ли другой способ, к примеру, не создавая "Действие процесса". И, насколько я понял, одними средствами C# это сделать не получится. Но спасибо всё равно, что уделили время моему вопросу!

Средствами C# сделать можно всё. То же действие «Открыть окно сообщения» можно создать и выполнить программно.

Пример из ApprovalInServiceRequestEditPage:

var openMessageWindow = new QuestionUserTask(UserConnection); 
openMessageWindow.Page = Page;
openMessageWindow.ProcessInstanceId = InstanceUId;
openMessageWindow.MessageText = ServiceApprovalNotFindedMessage;
openMessageWindow.Buttons = "OK";
openMessageWindow.Icon = "INFO";
openMessageWindow.ResponseMessages = new Dictionary<string, string> {
      	{"ok", "ClosePageMessage"},
};
openMessageWindow.Execute(context);

Александр - очень признателен за ответ: как раз то, что надо! Спасибо, что всегда выручаете!!! С наступающим Вас праздником!)

Виталий, Вам тоже хороших праздников!

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

Здравствуйте. Создал бизнес-процесс при автоматическом создании страницы при поступившем сигнале. Однако, возникла вот такая проблема ID страницы не формируется и в итоге она не отображается. Подскажите в чём может быть проблема?

Нравится

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

Добрый день!

Такое поведение встречается, когда страница редактирования раздела написана некорректно.
Если в разделе несколько страниц редактирования, при создании записи в бизнес-процессе необходимо в элементе “Добавить данные” указывать тип записи (по которой будет определена страница редактирования).

"Зарицкий Олег Васильевич" написал:

Добрый день!

Такое поведение встречается, когда страница редактирования раздела написана некорректно.

Если в разделе несколько страниц редактирования, при создании записи в бизнес-процессе необходимо в элементе “Добавить данные” указывать тип записи (по которой будет определена страница редактирования).

Здравствуйте. Т.е. мне нужно добавить в результат выборки тот самый раздел, который буду создавать и ID=начальному сигналу?

Добрый день!

В случае с несколькими страницами редактирования. Предположим, что в разделе Контакты – 2 станицы редактирования в зависимости от типа. Одна страница для контактов с типом “клиент”, вторая для “сотрудник”. Если стоит задача добавить запись в раздел контакты с помощью бизнес-процесса, в элементе “Добавить данные” необходимо указать объект – “Контакт” и обязательно заполнить поле “Тип” (клиент или сотрудник). Если этого не сделать в консоли будет сообщение вида “Cannot read EntitySchemaName”
По скриншотам трудно определить источник проблемы, необходимо дебажить.

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

подскажите, как повторить функционал поиска дублей, но для Лидов. Версия 7.5

Нравится

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

Добрый день!
Лид в bpm'online - потребность клиента. Для одного и того же контакта/контрагента может быть несколько одинаковых лидов(потребностей) в разные промежутки времени. В случае поиска дублей лидов все эти потребности объединятся, что является логически некорректным.

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

предусмотрено ведение различных задач по различным продуктам для одного лида. поиск дублей должен производится по детали «Средства связи» (по полям, содержащим телефон, а также по полю «E-mail»).

Валентин, добрый день!

Функциональность поиска дублей по лидам уже присутствует в версии 7.7
В данном случае оптимальным решением является обновление до последней версии.

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

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

Здравствуйте, Валентин!

Для того, чтобы объединить дубли лидов необходимо выполнить следующие действия:
1) Создать процесс для поиска лидов (аналогично процессу StartGlobalContactDuplicatesSearch). Для поиска необходимо создать процедуру в базе данных, аналогичную tsp_GloballySearchForDuplicates. Код процедуры tsp_GloballySearchForDuplicates можно найти в конфигурации, перейдя на вкладку "SQL сценарии". Процедура будет записывать данные в созданный Вами объект LeadDuplicates (создайте объект по аналогии с объектом ContactDuplicate)

2) Необходимо создать новую страницу редактирования, которая будет отображать данные из созданного объекта LeadDuplicates по аналогии со страницей DuplicatesPageV2 (либо заместите DuplicatesPageV2, добавив в нее нужную логику).

А теперь самое интересное - слияние лидов и удаление лишних. Так как удалить лид средствами системы не получится (связи, запущенный процесс...), то придется придумывать что-то новое.
Я бы в этот момент создавал бы новую запись лида и изменял данной записи значение в поле "Стадия" на нужное. Остальным дублям изменял бы стадию на "Дисквалифицирован" и указывал причину дисквалификации "Дубль".

Но лучше, наверное, обновиться до 7.7.0.:smile:

Спасибо.
Процесс StartGlobalContactDuplicatesSearch запускается в действии процесса StartGlobalDuplicatesSearch. Как теперь правильно заместить StartGlobalDuplicatesSearch, чтобы добавить в него запуск процесса StartGlobalLeadDuplicatesSearch? или если создать подобное действие процесса со своей логикой, где оно должно запускаться?

"Медведев Валентин Николаевич" написал:

Как теперь правильно заместить StartGlobalDuplicatesSearch, чтобы добавить в него запуск процесса StartGlobalLeadDuplicatesSearch?

Замещение процессов в системе не предусмотрено. Вам необходимо создать новый процесс и запускать его.

"Медведев Валентин Николаевич" написал:

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

Запускать новый процесс Вы можете, например, из библиотеки процессов (самая простая реализация). Также Вы можете добавить соответствующее действие в раздел "Лиды". Более подробно о создании действий, Вы можете прочитать в Академии.

имелось в виду
что собой и представляет StartGlobalDuplicatesSearch.

Добрый день!

Добавить соответствующее действие в раздел "Лиды" – подразумевается в замещающей странице редактирования лидов добавить новую кнопку в меню “Дейсвтия”. Также добавить обработчик, который будет запускать процесс по нажатию на эту кнопку.

StartGlobalDuplicatesSearch(Действие процесса) содержит сценарий:

string jobProcessName = (SchemaName == "Account") ? "StartGlobalAccountDuplicatesSearch" : "StartGlobalContactDuplicatesSearch";
AppScheduler.ScheduleImmediateProcessJob("DuplicatesSearchJob", "DuplicatesSearchGroup",
jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
return true;

если я создам подобное, в котором переменная jobProcessName будет получать "StartGlobalLeadDuplicatesSearch", то где оно должно вызываться?

Здравствуйте!

Этот код добавляет в планировщик Quartz процесс StartGlobalAccountDuplicatesSearch, если поиск осуществляется со схемы Account, StartGlobalContactDuplicatesSearch - при поиске с другой схемы.

Для Вашей задачи, Вы можете действие процесса заменить на следующее:

string jobProcessName = "StartGlobalLeadDuplicatesSearch";
AppScheduler.ScheduleImmediateProcessJob("DuplicatesSearchJob", "DuplicatesSearchGroup",
jobProcessName, UserConnection.Workspace.Name, UserConnection.CurrentUser.Name);
return true;

спасибо всем за помощь! разобрался.
теперь такой вопрос... можно ли изменить логику поиска дублей Лидов при импорте данных из Exel? например, чтобы телефоны "+7 (978) 123 12 31" и "+79781231231" считались совпадением. в каких модулях реализована стандартная логика?

Здравствуйте!

При импорте из Excel записи +7 (978) 123 12 31 и +79781231231 действительно будут считаться разными записями. Проверка на тождественность этих записей не осуществляется.

При импорте из Excel Вы можете проверять уникальность по другим полям/признакам. Также непосредственно перед импортом Вы можете в файле Excel автозаменой символов "(", ")", " " на "".

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

На данный момент колонки объектов с типом = Время в мобильном приложении отображаются и имеют элемент выбора значения совпадающий с типом Дата/Время что не является полностью корректным. Планируются ли в связи с этим какие-то доработки приложения и каким образом на данный момент можно отображать в контролах и элементах выбора значения только время?

Нравится

1 комментарий

Алексей, здравствуйте!
Поддержка колонок с типом Время запланирована в bpm'online версии 7.8. В это же время будет обновлено мобильное приложение в магазине

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

На сторінці реєстру звернень добавив кнопку, прописав назву, встановив відступ і опублікував схему.
Після чого не зміг відкрити схему в дизайнері.
Дає
Exception Message: Ссылка на объект не указывает на экземпляр объекта.
Exception Type: System.NullReferenceException
Exception Source: Terrasoft.UI.WebControls

Виявилось, що я не можу взагалі жодної сторінки відкрити в дизайнері, - всюди те саме.

І що то воно таке ?

error.txt

Нравится

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

Деякі сторінки все ж відкриваються:
Cостояния запросов на обслуживание
Cостояния инцидентов

Потім пачка базових сторінок відкривається, але починаючи з "Базовая страница редактирования" - помилка.

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

Схема сторінки виявилась битою, не вистачало цілої купи методів (це з того, що вдалося помітити)
Це спотворило весь згенерований C#-текст схеми.

Відновлювався з нічної бази, тож видно було, що схема бита задовго до створення кнопки.
Кнопку я добавляв на робочій, просто, щоб перевірити, що все ок, перед заливкою оновлень.
Тож опісля всі оновлення залив. Те, що добавив - працює.

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

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