пакет
привязка данных
раздел
7.15
Sales_Creatio_enterprise_edition

Подскажите как забиндить настройку страниц в разделе? Это я так вижу таблица и должна отдельно от настройки раздела быть, но не как не найду ее. При сохранение настроек (нажатие "Сохранить" в настройках раздела) нужные данные не сохраняются в пакет, и при установке его на другую среду таблица со списком есть но вторая колонка (справа) пустая, данные не сохраняются в ней

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

Нравится

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

Александр Тыра,

1. Уточните, пожалуйста, версию bpm'online, в которой Вы выполняете настройки?

2. Я правильно понимаю, что при создании нескольких страниц редактирования, через мастер разделов, не выполняется автоматическая привязка данных об этих страницах в таблицу SysModuleEdit?

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

У нас был похожий опыт переноса дополнительных страниц редактирования для стандартных разделов году в 2018. На сколько я помню, все кастомные разделы с несколькими страницами редактирования переносятся нормально, а для стандартных разделов нужно выполнить это не привязкой данных, а SQL скриптом на целевой среде после переноса. Я попробую поискать вариант скрипта в архивах. Если найду - вышлю вам.



 

Нашел.

Необходимо добавить связь в таблицу SysModuleEdit. Детальнее можно почитать здесь. Нам помогло.

 https://community.terrasoft.ru/questions/rucnaa-registracia-razdela

Сидоров Александр Валерьевич,

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

Александр Тыра,

1. Уточните, пожалуйста, версию bpm'online, в которой Вы выполняете настройки?

2. Я правильно понимаю, что при создании нескольких страниц редактирования, через мастер разделов, не выполняется автоматическая привязка данных об этих страницах в таблицу SysModuleEdit?

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

Александр Тыра пишет:

не могу найти колонку что отвечает за справочник (таблицу в которой значения на основе которых разные страницы прописываются)

В таблице SysModuleEntity колонка TypeColumnUId.

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

Алла Савельева,

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

Алла Савельева,

Колонка TypeColumnUId заполнена у страниц, проверил на корректность. Но справочник (выделенное поле) не заполнен, и потому думаю не происходит установка значений из пакета (связка видимо не дает)

Алла Савельева,

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

Александр Тыра,

Интересно, исправлено ли это в последней актуальной на текущий момент версии 7.15.4?

Алла, с версии 7.14.3 заведена проблема «Перенос пакетов. При переносе пакетами раздела с несколькими страницами редактирования настройка типизированных страниц не переносится - используемые значения справочников не переносятся пока для колонки  TypeColumnValue не установить признак Force Update», она ещё не решена.

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

Решил попробовать то что Вы процетировали, и после того как указал принудительное обновление колонок все перенеслось.

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

Показать все комментарии
#многострочное
текстовое поле
Мобильное приложение
7.15

Коллеги, привет)

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

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

Нравится

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

Здравствуйте, Виктория!

 

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

Данная проблема уже находится на рассмотрении у аналитиков продукта и, возможно, будет исправлена в последующих релизах.

Данную настройку можно решить с помощью доработки.

Если колонка ранее добавлена в мастере мобильного приложения, то необходимо ее сконфигурировать следующим образом:

Terrasoft.sdk.RecordPage.configureColumn("Activity", "primaryColumnSet", "Title", {
    isMultiline: true
});

Для этого нужно просто знать название колонки и группу колонок, в которой размещена колонка (второй параметр в примере выше).



Пример реализации:



1. Создать в конфигурации модуль http://prntscr.com/pgj6cm  в пакете Custom 

2. Называем его UsrMobileActivityModuleConfig  и пишем в схеме код: 

 

Terrasoft.sdk.RecordPage.configureColumn("Activity", "primaryColumnSet", "DetailedResult", {
    isMultiline: true
});



https://prnt.sc/q0zgem



3. Сохраняем схему 

4. В MobileApplicationManifestDefaultWorkplace в пакете Custom добавляем созданную схему https://prnt.sc/q0zh0l

Как это правильно делать также описано на Академии https://academy.terrasoft.ru/documents/technic-sdkmob/7-14/kak-dobavit-standartnuyu-detal-s-kolonkami

https://academy.terrasoft.ru/documents/technic-sdkmob/7-15/sdk-reestra

5. Сохраняем манифест 

6. Компилируем измененное.

 

Здравствуйте, Виктория!

 

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

Данная проблема уже находится на рассмотрении у аналитиков продукта и, возможно, будет исправлена в последующих релизах.

Данную настройку можно решить с помощью доработки.

Если колонка ранее добавлена в мастере мобильного приложения, то необходимо ее сконфигурировать следующим образом:

Terrasoft.sdk.RecordPage.configureColumn("Activity", "primaryColumnSet", "Title", {
    isMultiline: true
});

Для этого нужно просто знать название колонки и группу колонок, в которой размещена колонка (второй параметр в примере выше).



Пример реализации:



1. Создать в конфигурации модуль http://prntscr.com/pgj6cm  в пакете Custom 

2. Называем его UsrMobileActivityModuleConfig  и пишем в схеме код: 

 

Terrasoft.sdk.RecordPage.configureColumn("Activity", "primaryColumnSet", "DetailedResult", {
    isMultiline: true
});



https://prnt.sc/q0zgem



3. Сохраняем схему 

4. В MobileApplicationManifestDefaultWorkplace в пакете Custom добавляем созданную схему https://prnt.sc/q0zh0l

Как это правильно делать также описано на Академии https://academy.terrasoft.ru/documents/technic-sdkmob/7-14/kak-dobavit-standartnuyu-detal-s-kolonkami

https://academy.terrasoft.ru/documents/technic-sdkmob/7-15/sdk-reestra

5. Сохраняем манифест 

6. Компилируем измененное.

 

Мотков Илья,

большое спасибо!

Илья, привет! С Праздником Пасхи! Мира, добра и всех благ :-)

Подскажи, пожалуйста, если у меня колонка вообще не отображается в моб.приложении после всех действий, что можно сделать?

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

Может данную колонку нужно добавить в коллекцию первичных колонок?

Viktoriya Abysova,

вопрос уже не актуален, разобралась, спасибо!

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

Добрый день!

 

В описании приложения "Calculated metrics for Creatio" на сайте marketplace.terrasoft.ru, указано что настройка вычисляемых показателей (сумма, разность, отношение, произведение для двух-четырех переменных и любого количества констант) возможна не только в дашбордах, но и на страницах разделов и деталей.

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

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

Нравится

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

Добрый день, Дмитрий,

 

блок итогов "Расчетный показатель" доступен не только в дашбордах, но и в мастере настройки страницы раздела/детали в группе настроек Элементы страницы (вместе с другими стандартными блоками итогов Показатель, Шкала и др.).

Ирина Лазоренко, спасибо за пояснения! Было бы не плохо добавить это в подробную инструкцию пользователя)

Ирина, добрый день!

Расчетный показатель не работает на ПРОД (версия 7.15.4.3055).

Я настроил расчет показателя по простой формуле (a / 60), для пересчета длительности звонков из секунд в минуты. Но данный показатель не рассчитывается 

Хотя на ПП среде заказчика (версия 7.16.0.4449) аналогичный Расчетный показатель считается корректно http://prntscr.com/s34nyt 

Прошу помочь с данной проблемой.

Дмитрий, добрый день,

 

на чистой сборке 7.15.4 расчетный показатель по формуле a / 60 работает корректно. Уточните, пожалуйста, ошибка возникает только при указанной формуле или всегда, в том числе и для базовых формул?

Ирина, добрый день!

 

 

 

 

 

Опытным путем установили что проблема с полем "Длительность" в разделе "Звонки". По нему расчетный показатель на ПРОД (7.16.0.4449) не считается даже для базовых формул. В то время как для поля "Время разговора" расчетный показатель работает корректно. Вопрос можно считать закрытым.

Спасибо.

Показать все комментарии
валидация
преднастроенная страница
7.15
Studio_Creatio

Добрый день,

Есть несколько преднастроенных страниц (использую в БП). Необходимо настроить валидацию определенных полей (напр. только цифры).

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

Явно, я что-то упускаю срецифическое для преднастроенных страниц? Просьб направить в правильном направлении.

Пример метода, которй я использую:

            setValidationConfig: function() {

               this.addColumnValidator("CrpINN", this.innValidator);

            },

                innValidator: function(value) {

                var invalidMessage = "";

                var isValid = true;

                var number = value || this.get("CrpINN");

                isValid = (Ext.isEmpty(number) ||

                    new RegExp("^[0-9]{8}$").test(number));

                if (!isValid) {

                    invalidMessage = this.get("Resources.Strings.InvalidINNCodeFormat");

                }

                return {

                    invalidMessage: invalidMessage

                };

            },

      

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

 

 

Нравится

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

судя по всему проблема в том, что преднастроенная страница и обычная страница раздела унаследованы от разных родителей. Следовательно в зависимости преднастроенной нужно добавить тот модуль, в котором реализован функционал валидации. Беглым поиском нашел BaseSchemaViewModel, однако не уверен на 100%.

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

Вадим Косарев,

 Спасибо! Я обязательно разберусь с зависимостями.

 

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

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

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

 

setValidationConfig: function() {

             this.addColumnValidator("CrpPortalProductRequest1.CrpINN", this.innValidator);

            },

                innValidator: function(value) {

                

                var invalidMessage = "";

                var isValid = true;

                var number = value || this.get("CrpPortalProductRequest1.CrpINN");

            

                isValid = (Ext.isEmpty(number) ||

                    new RegExp("^[0-9]{8}$").test(number));

                if (!isValid) {

                    invalidMessage = this.get("Resources.Strings.InvalidINNCodeFormat");

                }

                return {

                    invalidMessage: invalidMessage

                };

            },

Показать все комментарии
оформление
розничной
продажи
в
Creatio
7.15
Sales_Creatio_enterprise_edition

Коллеги, подскажите пожалуйста логику оформление розничной продажи физическому лицу в Creatio 7.15

Ранее создавали контрагента и контакт контрагента - фактически вели двойные записи. На контрагента Иванова Ивана Ивановича создавалась продажа, заказ, договор. Не очень удобно так делать. Может изменилось что то?

Нравится

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

Есть три основных подхода:



1. Вести юридические лица в контрагентах, физические - в контактах. И модифицировать Лиды, Продажи, Договора, Документы, Счета, Заказы для использования обоих типов клиентов. Зато для маркетинга всё хорошо, и информация не дублируется (зато часто дублируется клиентский функционал в Контрагентах и Контактах)



2. Вести всех клиентов (физ. и юр. лица) в контрагентах, а их контактные лица - в контактах. Тогда вся Sales часть работает по базовой логике, но начинает страдать Marketing часть, либо надо дублировать информацию о клиентах-физ.лицах в контрагентах и контактах (можно, конечно, писать БП для синхронизации)



3. Завести раздел Клиенты, который связан с контрагентом или контактом. В нём вести клиентсткую информацию, и модифицировать Лиды, Продажи, Договора, Документы, Счета, Заказы для использования нового раздела.



В каждом проекте приходится серьезно взвешивать плюсы и минусы. Универсального решения пока не нашёл

Есть три основных подхода:



1. Вести юридические лица в контрагентах, физические - в контактах. И модифицировать Лиды, Продажи, Договора, Документы, Счета, Заказы для использования обоих типов клиентов. Зато для маркетинга всё хорошо, и информация не дублируется (зато часто дублируется клиентский функционал в Контрагентах и Контактах)



2. Вести всех клиентов (физ. и юр. лица) в контрагентах, а их контактные лица - в контактах. Тогда вся Sales часть работает по базовой логике, но начинает страдать Marketing часть, либо надо дублировать информацию о клиентах-физ.лицах в контрагентах и контактах (можно, конечно, писать БП для синхронизации)



3. Завести раздел Клиенты, который связан с контрагентом или контактом. В нём вести клиентсткую информацию, и модифицировать Лиды, Продажи, Договора, Документы, Счета, Заказы для использования нового раздела.



В каждом проекте приходится серьезно взвешивать плюсы и минусы. Универсального решения пока не нашёл

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

Добрый день!

 

Помогите, пожалуйста, со следующим вопросом:

 

Как можно почистить таблицу dbo.ActivityFile?

Нравится

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

Если есть доступ к базе, то можно SQL-запросом. Если очень много данных и delete from dbo.ActivityFile будет выполняться долго, то удалить всё можно при помощи truncate table dbo.ActivityFile.

 

Если встроенными средствами системы, то есть элемент БП для удаления данных:

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

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

Спасибо!

Можно таким запросом почистить данную таблицу

(delete from [dbo.ActivityFile]

where [CreatedOn] between '20100101' and '20100301')? 

Думаю, можно. Промежуток времени не такой большой, сильно тормозить не должно, но если всё же долго, то разделить на меньшие.

 

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

 

Но бекап перед запуском лучше сделать.

Показать все комментарии
ErrorCompilation
WorkspaceExplorerModule
7.15
Sales_Creatio_enterprise_edition

При попытке "Скомпилировать все" через несколько секунд пропадает фон загрузки, что не свойственно и в консоли видим следующее: 

 

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

Сама система после этого зависает на длительное время. 

Дефолтные действия типа перезагрузки IIS/MSSQL и чистки кэша Redis проблему не решают. 

При попытке публиковать отчет через DevExpress получаем, то что в этой теме.

При попытке запустить новый метод в сервисе написанном серверным кодом получаем ошибку "Конечная точка не найдена" или видим следующее при попытке вызвать в строке url:

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

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

Есть идеи? 

Нравится

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

Проверьте права доступа на папку где лежи сайт для IIS_USERS

Проверьте права доступа на папку где лежи сайт для IIS_USERS

Александр Тыра,

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

Есть инструкция по установке, там говорится в том числе и об этом:

Пользователю, от имени которого в IIS запущен пул приложения, необходимо предоставить права на чтение, запись и удаление файлов и вложенных каталогов для каталога .\Terrasoft.WebApp\Terrasoft.Configuration.

Для включения русского языка необходимо, чтобы пользователю, от имени которого в IIS запущен пул приложения, были предоставлены права на чтение, запись и удаление файлов и вложенных каталогов статического контента приложения (каталог .\Terrasoft.WebApp\conf). 

Ошибка вернулась и при этом проделанные выше действия и игры с правами на папки сайта в IIS не действуют.

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

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

Помогите разобраться, как настроить фильтры для графика в итогах, чтобы на нем отображалось количество переведенных обращений из состояния НОВОЕ в состояние В РАБОТЕ по нескольким пользователям. 



На скриншоте то, как я пытаюсь настроить, но на графике ничего не отображает по такому фильтру. 



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

Нравится

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

Если без VIEW на SQL, то примерно так:



1. В объект CaseLifecycle добавьте поле "Предыдущий статус"

2. Сделайте простой БП: на добавление записи в CaseLifecycle читайте последнюю (предыдущую) запись CaseLifecysle по данному обращению, и значение Статус из неё записывайте в добавленную запись в поле "Предыдущий статус".

3. А потом построите аналитику по CaseLifecycle и записям, где Предыдущий статус = Новый, а Статус = В работе.



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

Так в одной записи таблицы CaseLifecycle хранится одно состояние, а Вам нужно и старое, и новое. Или пока это не важно, хотя бы переходы в работу откуда угодно?

А самым верхним условием пытаетесь отфильтровать, что по обращению на детали есть только одна запись? Тогда те, где таких две и больше (сначала в новом, потом в работе и т. д.) в выборку не попадут.

Если есть доступ к базе, попробуйте написать SQL-запрос по выборке нужной информации и убедиться в адекватности результатов. А потом либо, ориентируясь по нему, настроить фильтр, либо, как любят тут советовать, сделать view, объект и далее строить диаграмму по нему.

Зверев Александр, доступа к базе нет.



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

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

Если без VIEW на SQL, то примерно так:



1. В объект CaseLifecycle добавьте поле "Предыдущий статус"

2. Сделайте простой БП: на добавление записи в CaseLifecycle читайте последнюю (предыдущую) запись CaseLifecysle по данному обращению, и значение Статус из неё записывайте в добавленную запись в поле "Предыдущий статус".

3. А потом построите аналитику по CaseLifecycle и записям, где Предыдущий статус = Новый, а Статус = В работе.



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

Владимир Соколов пишет:

Сделайте простой БП: на добавление записи в CaseLifecycle читайте последнюю (предыдущую) запись CaseLifecysle по данному обращению, и значение Статус из неё записывайте в добавленную запись в поле "Предыдущий статус".

Дополню, поскольку на момент запуска БП в базе уже сохранена новая запись, для получения статуса из предыдущей можно в блоке чтения данных отсортировать по дате создания и отфильтровать по Id, не равному Id той записи, по которой запустился процесс, а также по равному с ней полю CaseId (обращению).

Владимир Соколов пишет:

Если надо и исторические данные изменить

Судя по дате «сегодня» в настройках графика на скриншоте, думаю, их не нужно.

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

Добрый день.

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

Заполнить поля они должны вместе на одной стадии, параллельно.

Нравится

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

Можно сделать булевое поле в атрибуте со значением по умолчанию, забиндить его для поля на странице в параметр видимости, а при старте запускать проверку роли пользователя текущего (сделать можно через написанный Ильей миксин, спасибо ему за это https://community.terrasoft.ru/questions/userutilsmixin-utility-dla-rab…)  с возвратом присвоения значения атрибуту.

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

Лучше не прямо проверять роли, а завести системную операцию, выдать права на неё нужным ролям и в коде страницы проверять наличие у текущего пользователя. Они для этого и придуманы.

См. примеры тут, у Вас аналогично, только не enabled, а isRequired.

Спасибо за помощь, попробуем разобраться.

Показать все комментарии
PostgreSQL
exists
7.15
Sales_Creatio_enterprise_edition

Коллеги, приветствую.

 

Помогите, пожалуйста, с формированием кода запроса.

Я формирую таблицу, в столбец (логического типа) которой подзапросом вывожу 1 или 0 в зависимости от наличия записи в другой таблице: в дополнение к Продаже вывожу столбец, в котором отмечаю была ли эта Продажа на стадии, например, Контрактование.

При этом нужно именно значение 1 или 0.

 

Нашёл 2 решения в виде sql-запроса:

1. select "O"."Id", "O"."Title"

, (select exists(select 1 from "OpportunityInStage" AS "OinS" where "OinS"."OpportunityId" = "O"."Id" and "OinS"."StageId" = 'fb563df2-5ae6-df11-971b-001d60e938c6')) AS "Contracting"

from "Opportunity" AS "O"

2. либо через count(*) делённый сам на себя

1. select "O"."Id", "O"."Title"

, coalesce(select count(*) / count(*) as "cnt" from "OpportunityInStage" AS "OinS" where "OinS"."OpportunityId" = "O"."Id" and "OinS"."StageId" = 'fb563df2-5ae6-df11-971b-001d60e938c6') AS "Contracting"

from "Opportunity" AS "O"

 

Я закодировал подзапрос с одним count таким образом

var stagePresentSubSelect = new Select(userConnection).Count("*").As("cnt")

    .From("OpportunityInStage", "OinS")

    .Where("OinS", "OpportunityId").IsEqual("O", "Id");

 

Подскажите, пожалуйста, как можно добавить в код exists (не в фильтр) или деление count на себя?

Нравится

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

У меня на MSSQL ни первый, ни второй запросы не заработали. Что за база у Вас?

Если переписать первый так, результат будет тот же?

select "O"."Id", "O"."Title",
 isnull((select 1 from "OpportunityInStage" AS "OinS" where "OinS"."OpportunityId" = "O"."Id" and "OinS"."StageId" = 'fb563df2-5ae6-df11-971b-001d60e938c6'),0) AS "Contracting"
from "Opportunity" AS "O"

А с IsNull мы уже работать сможем, примерно так:

.Column(Func.IsNull(Column.SubSelect(mySubSelect), Column.Const(0)))

А по второму примеру вообще не не понял, зачем делить само на себя, там же будет либо 1, либо ошибка деления на 0.

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