Несколько приемов построения эффективных интерфейсов, о которых мало кто знает

17.07.25

Разработка - Работа с интерфейсом

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

Бесплатные

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Бесплатно
КонсольЗапросов - типовая
.epf 109,98Kb
42 Скачать бесплатно
КонсольЗапросов — подправленная
.epf 110,19Kb
68 Скачать бесплатно
Пример работы с деревом
.epf 7,99Kb
58 Скачать бесплатно
Эксперимент с ТабДок
.epf 7,63Kb
54 Скачать бесплатно

Меня зовут Люлюк Евгений. Я разработчик. Для меня эффективность интерфейса — это не количество кликов и не расположение кнопок, а программистская эффективность: то, насколько быстро интерфейсы выводятся и насколько мало они памяти потребляют.

Я разрабатываю Infostart Toolkit, Infostart Data Form Wizard, Data Conversion 3 Booster. Это продукты с достаточно удобным и быстрым интерфейсом. Они работают с метаданными, с большими объемами и при этом адекватно все отображают. То, о чем я буду рассказывать, основано на опыте разработки этих продуктов.

 

Оптимизация работы с табличным документом

 

Первая тема, которую хочу осветить — это табличный документ. Простая вещь. Удивительно, но можно в него вывести данные неправильно. И это очень легко.

Сам объект «Табличный документ» очень продвинутый, в нем много возможностей, он здорово спроектирован. Когда все понимаешь, им удобно пользоваться. Но он еще, помимо этого, динамический. То есть, если он большого объема, он данные считывает не сразу. У вас может быть 100 страниц табличного документа, а на экране вы видите только одну-две. По мере пролистывания данные загружаются. Это очень важно для эффективности.

 

Вариант первый: неправильный подход

 

Это самый распространенный вариант неправильного вывода. Мы на клиенте создаем табличный документ как поле на форме. Затем вызываем серверную функцию (например, «ПримерТабличногоДокумента»). Она может быть без контекста, это не важно. Функция выводит все в табличный документ, а затем результат возвращается на клиент.

// НЕПРАВИЛЬНО!!!

&НаКлиенте

Процедура ВывестиОбычным(Команда)

// ~1,5Mb, ~18,5Mb, ~2,4 c

ТабличныйДокумент = ПримерТабличногоДокумента();

КонецПроцедуры

Если мы так сделаем, с сервера прилетит весь табличный документ, например, 20 мегабайт, и поместится в табличный документ на клиенте. То есть полностью весь трафик с сервера перетечет на клиента. У клиента потребление памяти будет большое, и на сервере будет то же самое.

 

Вариант второй: правильный подход

 

Нужно сделать контекстный вызов сервера, перейти на сервер в контексте и выполнить те же действия.

// ПРАВИЛЬНО

&НаКлиенте

Процедура ВывестиВТабДокНаСервере(Команда)

// ~2Kb, ~10Kb, ~1,23 c

ВывестиВТабДокСервер();

КонецПроцедуры

&НаСервере

Процедура ВывестиВТабДокСервер()

ТабличныйДокумент = ПримерТабличногоДокумента();

КонецПроцедуры

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

 

Результаты измерений

 

У меня есть данные замеров. В первом случае 18 мегабайт трафика «переплыло» с сервера на клиент. Это заняло 2,4 секунды. А во втором примере — 10 килобайт, то есть только то, что умещается на экране. И за 1,2 секунды.

Тот пример, который я описал, дает выигрыш в 2 раза. При выводе 20 000 строк обычным способом — 2,5 секунды, оптимизированным — 1,2 секунды.

Интересно, что механизмы БСП, печать, механизм отчетов — все это реализовано корректно. То есть в них такой проблемы нет. А вот если мы возьмем консоль запросов, которая доступна на сайте 1С, которую мы все скачиваем, то она жутко медленно выводит данные. Я буквально пять строк переписал в ней, используя этот подход, и добился выигрыша в 10%. Там главная проблема в другом — сам вывод табличного документа занимает много времени, но даже пять строк позволяют добиться улучшения.

 

Оптимизация метода «Присоединить»

 

Относительно табличного документа есть еще одна проблема. Консоль запросов выводит каждую колонку через метод «Присоединить». Для вывода четырех строк по семь колонок через метод «Присоединить» требуется 28 повторений.

 

 

Для 1С большие циклы — это проблема. 10 000 строк и 10 колонок — это 100 000 операций. Вывод может занимать до 20 секунд.

Я рекомендую метод «Присоединить» по возможности не использовать, он очень медленный. Лучше делать область (обычно в ней одна-две колонки), заполнять поле значением и идти дальше. Если выводите строку, используйте «ПолучитьОбласть», заполните ее и выведите сразу семь параметров. Это работает намного быстрее.

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

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

 

Работа с большими деревьями на форме

 

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

Однако с этим объектом есть сложности. Когда дерево большое (например, каталог проводника с большим количеством файлов и папок), если попытаться сразу все развернуть, как мы обычно делаем, система может зависнуть надолго.

Аналогичный пример — когда нам нужно отобразить дерево метаданных и что-то выбрать. В 1С:ERP легко может быть 5 000 объектов: в справочниках 1 000, документов 500 и т.д. Все это накапливается, и дерево получается очень большим. Если выводить все его сразу, это будет неэффективно — из-за большого потребления памяти и долгой работы.

 

Оптимизация загрузки дерева

 

Эта хитрость придумана очень давно, думаю, многие о ней знают. Смысл следующий: мы добавляем корневые части дерева (константы, справочники, документы) и внутрь добавляем фиктивную строку. Для чего? Чтобы появился плюсик, чтобы интерфейс думал, что там есть какие-то ветки дерева.

Когда ветки есть, дерево можно разворачивать. И в момент, когда строка разворачивается, мы загружаем туда необходимые данные.

 

 

Простой пример: дерево метаданных может состоять из 9 000 строк. При традиционном подходе добавляются все 9 000. Если использовать описанный мной подход, добавится только 20 строк. Дерево будет открываться мгновенно, а в традиционном подходе — за полторы секунды.

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

Я привел пример с номенклатурой в каталоге: вы будете нажимать плюсик, и данные будут выпадать без задержки. Если дерево содержит одну колонку — это одно. Если оно содержит семь колонок — другое: добавить сразу 9 000 строк будет еще тяжелее.

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

Вот простой код, который показывает этот подход:

ЗаполнитьВсе(); // Просто заполняет все строки

// Добавление фиктивной строки

НоваяСтрока = Дерево.Строки.Добавить();

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

В обработчике события «ПередРазворачиванием» мы находим разворачиваемую строку по идентификатору, проверяем, что ее необходимо развернуть. Если там уже все добавлено, считывать ничего не надо.

Функция «НеобходимоРазвернутьСтроку» отвечает за эту проверку и проверяет, что добавлена именно фиктивная строка. Может быть такое, что у вас добавилась одна осмысленная строка, тогда это уже не будет разворачивать.

Иногда нужно в заголовке написать, например, «Констант: 15», чтобы пользователь знал, сколько элементов в группе. Тогда можно либо при разворачивании дополнить заголовок, либо заранее создать заголовок «Константы (15)». Когда они развернутся, внутри будет 15 элементов.

 

Реализация поиска в динамически загружаемом дереве

 

Когда мы реализовываем дерево описанным методом, мы сразу сталкиваемся с проблемой. Есть удобный платформенный поиск, который появился в 1С:Предприятие 8.3.15. Он ищет по всем колонкам таблицы или дерева и подсвечивает результаты. Но если мы будем использовать этот поиск в нашем случае, у нас просто ничего не отобразится. В дереве нет всех строк, поэтому поиск ничего не найдет.

 

 

У стандартного поискового окошка нет события, когда в нем что-то набрали. Мы могли бы в этот момент догрузить дерево и поиск бы сработал. Но там нет никаких подписок на события, он закрыт. Поэтому приходится реализовывать поиск самостоятельно.

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

 

Алгоритм эффективного поиска

&НаКлиенте

Процедура ПоискПриИзменении(Значение)

ОбновитьПоискСервер();

КонецПроцедуры

&НаСервере

Процедура ОбновитьПоискНаСервере()

РезультатПоиска.Очистить();

НетПоиска = (Шаг(Поиск) = 0);

ШаблонПоискаНижний = НРег(СокрЛП(Поиск));

Для Каждого ОбъектМетаданных По ДоступнымКоллекциям Цикл

Если СтрНайти(НРег(ОбъектМетаданных.Представление()), ШаблонПоиска) Тогда

РезультатПоиска.Добавить(ОбъектМетаданных.Представление(), ОбъектМетаданных.ПолноеИмя());

КонецЕсли;

Если КоличествоНайденных = 30 Тогда

Возврат;

КонецЕсли;

КонецЦикла;

КонецПроцедуры

Вот основные моменты реализации:

  • В интерфейсе добавляется окошко поиска, которое запускает наш алгоритм.

  • В момент поиска не нужно добавлять в дерево все строки — они там не нужны. Они появятся, когда пользователь развернет соответствующие ветки.

  • Тяжелое место — сам поиск. Если будет миллион итераций, это будет медленно. Все, что можно вынести из цикла поиска, выносим.

  • Функция «СтрНайти» регистрозависимая. Чтобы искать без учета регистра, нужно перевести все в верхний или нижний регистр. Опыт показывает, что нижний регистр предпочтительнее — меньше действий (т.к. большая часть текста — в нижнем регистре).

  • Ограничиваем количество результатов. Нет смысла искать и показывать все 10 000 совпадений. Достаточно 30-50 строк. Пользователь никогда не долистает до 105-го элемента. Если нужно, он может уточнить поисковый запрос.

  • Если не очевидно, что в результате поиска не все элементы, можно внизу вывести сообщение «Внимание, выведено не все». Для этого, если у вас ограничение 30 строк, нужно найти 31-ю и вывести предупреждение.

 

Плюсы и минусы своего поиска

 

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

У стандартного поиска есть один недостаток: например, он не найдет «контрагент» в поле «НоменклатураКонтрагентов». Аналогично, когда ищешь «основание», а реквизит называется «ДокументОснование», он ничего не находит.

Свой поиск позволяет реализовать дополнительные возможности. Например, я сделал так: при поиске объекта метаданных можно поставить дробь «/» и указать имя коллекции (например, «справочники»). Тогда поиск будет выполняться только в справочниках. Это оптимизация — если раньше поиск искал по 10 коллекциям и обходил 10 000 строк, теперь он обходит 100 или 1 000 строк. Поиск работает в разы быстрее.

В конфигураторе очень не хватает такой возможности. Если я ищу регистр сведений «Номенклатура» и набираю «номенклатура», он находит все реквизиты с этим именем. По ключевому слову практически невозможно найти нужный объект.

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

 

Оптимизация передачи дерева между клиентом и сервером

 

Дерево — тяжелый объект для передачи между клиентом и сервером. Если табличный документ позволяет передать часть данных, то дерево — нет. Если в дереве 10 000 строк, оно будет работать медленно. Когда вы переходите на сервер, чтобы отсортировать эти 10 000, даже если поменяются местами только три строки, это займет 2 секунды.

Выход есть: делайте операции с деревом на клиенте. Это нормально работает . Я использовал даже алгоритм быстрой сортировки для элементов дерева.

Например, у меня есть групповая обработка, которая обрабатывает сто тысяч объектов. Каждый объект, обработанный успешно, должен попасть в ветку «Обработано успешно». Все объекты с ошибками должны быть сгруппированы по типам ошибок.

Обработалась тысяча строк, они добавились. Обработали следующую тысячу, их нужно добавить туда же и отсортировать. Проблема: если каждый раз выполнять сортировку на сервере, к концу обработки вы столкнетесь с тем, что сама обработка будет выполняться за секунду, а добавление десяти строк в дерево — за минуту.

 

Работа только с реально используемыми данными

 

Не нужно брать все данные сразу. Возьмите ограниченную часть, выполните работу. Не стоит руководствоваться подходом «вытащить все, а потом работать». Пока вы будете все перетаскивать, может прийти «хозяин» и сказать, что передумал и ничего перетаскивать не надо. Работа будет сделана впустую.

Часто бывает, что у АРМ менеджера есть закладки с таблицами. Не нужно загружать все закладки сразу, когда пользователь только вошел. Когда закладка активирована, то можно загрузить содержимое. Так все будет работать быстро и эффективно, даже если код не оптимален. Если же все загружать сразу, проблемы проявятся уже при открытии.

 

Использование механизма длительных операций

 

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

 

 

Я когда-то разбирался, как в платежном поручении работает заполнение выписки. Зашел, нажал «Заполнить». Оказалось, заполнение табличной части платежного поручения работает на длительных операциях. В тот момент я понял, что этот механизм надежный и широко используется.

 

Преимущества механизма длительных операций

 

Очевидные плюсы:

  • Не блокирует работу пользователя,

  • Поддерживает многопоточную оптимизацию.

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

Небольшой недостаток — некоторая сложность реализации, но она не критична. Требуется наличие БСП. Если вам необходимо отлаживать длительные операции, используйте параметр запуска режима отладки «/РежимОтладки». При этом задания запускаются не в фоне, а как обычные, и их можно отладить.

 

Примеры использования длительных операций

 

В Infostart Toolkit есть обработка подписки на события. Когда активируешь подписку, справа показывается, какие объекты подписаны, какие модули затрагиваются. Часто обновление происходит так быстро, что индикатор прогресса даже не появляется. А когда появляется, он не вызывает задержек. Если пользователь переключился на другую строку до завершения обработки, предыдущее задание отменяется и запускается новое. Все происходит незаметно.

Другие примеры использования длительных операций в Toolkit:

  • Поиск ссылок на объект (занимает время, но не блокирует интерфейс);

  • Фоновое выполнение запроса (тяжелый запрос можно отменить и запустить заново).

 

Прочие проблемы, рекомендации

 

Проблема с описанием оповещения о закрытии

 

Есть интересная проблема. Когда мы открываем подчиненную форму, у нее есть параметр «ОписаниеОповещенияОЗакрытии». Возникает мысль создать переменную с таким же именем, записать в нее обработчик и передать его. Вроде все работает нормально.

 

 

Но потом оказывается, что при закрытии какой-то формы она попадает в код, который совершенно не должна затрагивать. Дело в том, что у формы клиентского приложения есть глобальная переменная «ОписаниеОповещенияОЗакрытии». И я нечаянно ее заменил своим обработчиком.

Как избежать проблемы:

  • Не использовать это название для переменных,

  • Явно объявить переменную через «Перем» и зафиксировать ее под себя.

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

 

Не используйте коллекции картинок

 

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

 

Декларирование параметров формы

 

 

Есть стандарт, до которого редко доходят руки. На закладке «Параметры» можно задать значения параметров, которые будут передаваться в форму. При этом будут приводиться типы к этим значениям, и на входе они будут обязательны.

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

 

Стандартные команды

 

В 1С есть стандартные команды — такие как «ИзменитьФорму», «ДобавитьСтрокуТаблицы» или «ДобавитьСтрокуДерева». Эти команды нельзя создать программным путем. Сначала у меня появилась мысль : я сделаю программно команду «ИзменитьФорму», добавлю ее во все формы, и когда-нибудь сделаю свою. Но это невозможно. Стандартные команды добавляются только интерактивно, программно их добавить нельзя.

Еще одна особенность: команда «ИзменитьФорму» не локализуется автоматически. Если пользователь откроет англоязычную платформу или конфигурацию, вместо «ИзменитьФорму» он должен увидеть Change Form, но этого не происходит.

 

 

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

 

*************

Статья написана по итогам доклада (видео), прочитанного на конференции INFOSTART TECH EVENT.

Вступайте в нашу телеграмм-группу Инфостарт

См. также

Работа с интерфейсом Анализ учета Мониторинг 1С v8.3 8.3.14 1C:Бухгалтерия 1С:Бухгалтерия 3.0 1С:Библиотека стандартных подсистем 1С:ERP Управление предприятием 2 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 Платные (руб)

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

28800 руб.

27.03.2025    13484    24    18    

34

Работа с интерфейсом Рабочее место 1С v8.3 Управляемые формы 1C:Бухгалтерия Платные (руб)

Универсальный редактор картинок 1С предназначен для обработки изображений в режиме «Предприятие», с возможностью рисовать на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    65962    45    60    

84

Работа с интерфейсом Программист 1С v8.3 1C:Бухгалтерия 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    21638    31    6    

48

Работа с интерфейсом Программист Стажер 1С v8.3 Бесплатно (free)

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

20.08.2024    36030    mrXoxot    44    

136

Работа с интерфейсом Программист 1С v8.3 Бесплатно (free)

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

27.05.2024    21171    smielka    37    

106

Работа с интерфейсом 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    20947    1285    elcoan    53    

128

Инструментарий разработчика Работа с интерфейсом Программист 1С v8.3 1C:Бухгалтерия Абонемент ($m)

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

3 стартмани

10.04.2023    14900    175    acces969    31    

132

Работа с интерфейсом Программист 1С v8.3 1C:Бухгалтерия Бесплатно (free)

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

12.08.2022    9640    rpgshnik    39    

95
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. milanse 40 17.07.25 22:39 Сейчас в теме
По табличному документу специально делал чтобы он весь передавался на клиент. Иначе если перейти в конец и начать листать вверх, платформе срывает башню и она начинает тянуть документ целиком на клиент порциями по 100 строк. Если это 20-30к строк, длится это десятки секунд.
Да и вцелом частично переданный на клиента документ ведёт себя не очень. Что если захочется в нем поискать? Да и просто постраничный скролл начинает лагать. Так себе в общем
tormozit; mrChOP93; tsmult; artbear; yzimin; +5 Ответить
8. Evg-Lylyk 5163 18.07.25 13:15 Сейчас в теме
(1) Мне ближе порционный подход. Сценарий когда используется всё не такой частый. В подавляющем большинстве типовых механизмов отчёты СКД, печатные форма не используется получение всего сразу.
2. G_109024220817455627449 18.07.25 01:37 Сейчас в теме
Прикольный лайфхак про заглушки в дереве, спасибо.
3. lone_mayson 60 18.07.25 07:44 Сейчас в теме
>>Если вам необходимо отлаживать длительные операции, используйте параметр запуска режима отладки «/РежимОтладки». При этом задания запускаются не в фоне, а как обычные, и их можно отладить.

В таком режиме по-иному работает процедура ОбщегоНазначенияУТ.ВыполнитьПакетЗапросов: запрос выполняется по частям, тогда как тебе нужно вытащить его целиком для отладки.
Не то, чтобы я часто использовал РежимОтладки (скорее, наоборот), но со временем пришёл к выводу, что отладка в фоновом задании более информативна и целесообразна — это касается отладки в целом.
mrChOP93; Crazy_Max; tsmult; Altez; Evg-Lylyk; yzimin; unichkin; +7 Ответить
4. unichkin 1609 18.07.25 10:34 Сейчас в теме
По РежимОтладки - мне от тех. поддержки 1С был такой комментарий (май 2024):

"Касательно режима отладки: он был сделан в далекие времена, когда платформа не позволяла нормально подключать и отлаживать запускающиеся фоновые задания.
Уже точно больше пяти лет, как этой проблемы нет. В частности, я отлаживаюсь с автоподключением предметов отладки фоновых заданий уже так давно, что не помню, когда последний раз применял параметр "/C РежимОтладки"."
tormozit; mrChOP93; ixijixi; Evg-Lylyk; yzimin; lone_mayson; user-z99999; +7 Ответить
7. Evg-Lylyk 5163 18.07.25 13:12 Сейчас в теме
(4) Да как вам удобнее, есть момент что подключаясь через ключ не поймаешь другие фоновые задания.
kalyaka; mrChOP93; +2 Ответить
5. ixijixi 2042 18.07.25 11:13 Сейчас в теме
Функция «СтрНайти» регистрозависимая. Чтобы искать без учета регистра, нужно перевести все в верхний или нижний регистр. Опыт показывает, что нижний регистр предпочтительнее — меньше действий (т.к. большая часть текста — в нижнем регистре).
Проверил это утверждение. Тесты показывают, что разницы нет. На 1кк итераций разница в среднем менее 1% в пользу ВРег
Прикрепленные файлы:
mrChOP93; Evg-Lylyk; +2 Ответить
6. Evg-Lylyk 5163 18.07.25 13:11 Сейчас в теме
(5) Да скорее всего разница будет маленькой. Это зависит от того какие строки
35. tormozit 7303 06.08.25 07:23 Сейчас в теме
(5) В моих тестах разница стабильна - ВРег() медленнее на 4% чем НРег() на большом тексте с программным кодом 1С. Такой текст по соотношению больших и малых букв сопоставим с текстом на естественном языке. Но и такую разницу тоже можно считать незначительной.
VyacheslavShilov; Evg-Lylyk; +2 Ответить
9. coollerinc 198 18.07.25 14:02 Сейчас в теме
Не понял, как в динамическом списке использовать отдельные картинки, а не индексы. Типо помещать их во временное хранилище, и выводить адрес хранилища в ячейку?
11. Evg-Lylyk 5163 18.07.25 15:19 Сейчас в теме
(9) Думаю как и в дереве поле с типом картинка
12. Evg-Lylyk 5163 18.07.25 15:20 Сейчас в теме
(9) Заполнить при получении данных
10. coollerinc 198 18.07.25 14:36 Сейчас в теме
Даже не знал, что табличный документ подгружается отдельно.

Кстати Таблица значений передается с клиента на сервер и обратно, не вся, а только измененные строки. Думаю с деревом значений такой же принцип отрабатывает. У вас правда пример с сортировкой, где изменены сразу все строки.
13. Evg-Lylyk 5163 18.07.25 15:22 Сейчас в теме
(10) Да непонятно как-то.
У меня сценарий был к уже большому дереву добавить к примеру 50 строк и отсортировать большая часть дерева не изменится
14. van_za 302 19.07.25 17:03 Сейчас в теме
"У всех профессии крутые
Квартиры, жёны молодые
Ну а я вот парикмахер
Никому не нужен...
"
Вспомнил песню:)
15. n_mezentsev 61 21.07.25 10:53 Сейчас в теме
А вот если мы возьмем консоль запросов, которая доступна на сайте 1С
, то ее давно пора выложить на github и принимать правки/заявки, пусть даже без значительного расширения. Редко хожу на управляемые формы, но уже успел заметить, что она, например, даже не поддерживает выбор группы справочника в параметрах. Мелочь, а приходится держать свою консоль, лол, вообще
Evg-Lylyk; +1 Ответить
16. Viktor_Ermakov 385 22.07.25 12:59 Сейчас в теме
Спасибо за статью, она отличная.
Оптимизация метода «Присоединить» - раздел и описание не совсем понятное, хотелось бы раскрыть эту тему.
17. Evg-Lylyk 5163 22.07.25 13:02 Сейчас в теме
(16) На примере консоли запросов. Выводится таблица в которой 100 строк и 10 колонок это цикл 1000 повторений (метод присоединить) и это намного медленнее чем собрать область-строку из 10 колонок и за раз вывести (100 повторений), естественно сбор области происходит не в цикле.
Viktor_Ermakov; +1 Ответить
18. Viktor_Ermakov 385 23.07.25 08:15 Сейчас в теме
(17)
повторений (метод присоединить) и это намного медленнее чем собрать область-строку из 10 колонок и за раз вывести (100 повторений), естественно сбор области происходит не в цикле.

Спасибо! А где посмотреть можно пример сборки областей строк не в цикле?
19. Evg-Lylyk 5163 23.07.25 09:47 Сейчас в теме
(18) Код обрывочный из Infostart Toolkit аналогичный скорее всего будет в Управляемая консоль отчетов
// Подготовка областей вывода
Области = ПодготовитьОбластиВыводаРезультата(РезультатВыполнения.Колонки, ОформлятьОсобыеЗначенияВРезультате, Настройки["ЧередованиеЦветовСтрокВРезультате"]);

Подготовка областей:
Функция ПодготовитьОбластиВыводаРезультата(Колонки, ОформлятьОсобыеЗначения, ЧередованиеЦветовСтрок)
	
	Макет = Обработки.ИТК_КонсольРазработчика.ПолучитьМакет("ИТК_РезультатЗапроса");

	ОбластьШапкаЗапроса = Макет.ПолучитьОбласть(1, 1); // ШапкаЗапроса
	ОбластьШапкаПоля = Макет.ПолучитьОбласть(2, 1); // ШапкаПоля
	ОбластьЗначениеПоля1 = Макет.ПолучитьОбласть(3, 1); // ЗначениеПоля1
	ОбластьЗначениеПоля2 = Макет.ПолучитьОбласть(4, 1); // ЗначениеПоля2
	
	ШапкаТаблицы = Новый ТабличныйДокумент;
	СтрокаЗапроса1 = Новый ТабличныйДокумент;
	СтрокаЗапроса2 = Новый ТабличныйДокумент;
	Для Каждого Колонка Из Колонки Цикл 
		
		ОбластьШапкаПоля.Параметры.ИмяПоля = Колонка.Имя;
		ОблШапкаПоля = ШапкаТаблицы.Присоединить(ОбластьШапкаПоля, 1);
		ОблШапкаПоля.Примечание.Текст = ИТК_Типы.ПодсказкаОписания(Колонка.Имя, Колонка.ТипЗначения);
		ОблШапкаПоля.Картинка = ИТК_Типы.КартинкаОписания(Колонка.ТипЗначения);
		
		ОблЗначениеПоля1 = СтрокаЗапроса1.Присоединить(ОбластьЗначениеПоля1);
		ОблЗначениеПоля2 = СтрокаЗапроса2.Присоединить(ОбластьЗначениеПоля2);
		
		ЗаполнениеОбластиЗначения(ОблЗначениеПоля1, Колонка, ОформлятьОсобыеЗначения);
		ЗаполнениеОбластиЗначения(ОблЗначениеПоля2, Колонка, ОформлятьОсобыеЗначения);
		
	КонецЦикла;
	
	Области = Новый Структура;
	Области.Вставить("ЗаголовокЗапроса", ОбластьШапкаЗапроса);
	Области.Вставить("ШапкаТаблицы", ШапкаТаблицы);
	Области.Вставить("Строка1", СтрокаЗапроса1);
	
	Если ЧередованиеЦветовСтрок Тогда
		СтрокаЧередованияСтрок = СтрокаЗапроса2;
	Иначе 
		СтрокаЧередованияСтрок = СтрокаЗапроса1;
	КонецЕсли;
	
	Области.Вставить("Строка2", СтрокаЧередованияСтрок);
	
	Возврат Области;
	
КонецФункции

Процедура ЗаполнениеОбластиЗначения(Область, Колонка, ОформлятьОсобыеЗначения)
	
	Формат = "";
	Если Колонка.ТипЗначения.СодержитТип(Тип("Дата")) Тогда
		КвалификаторыДатыЧастиДаты = Колонка.ТипЗначения.КвалификаторыДаты.ЧастиДаты;
		Если КвалификаторыДатыЧастиДаты = ЧастиДаты.ДатаВремя Тогда
			Формат = "ДЛФ=DT";
		ИначеЕсли КвалификаторыДатыЧастиДаты = ЧастиДаты.Дата Тогда
			Формат = "ДЛФ=D";
		ИначеЕсли КвалификаторыДатыЧастиДаты = ЧастиДаты.Время Тогда
			Формат = "ДЛФ=T";
		КонецЕсли;
	КонецЕсли;
	
	Область.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
	
	Параметр = Колонка.Имя;
	Если Колонка.ТипЗначения.СодержитТип(Тип("РезультатЗапроса")) Тогда
		Параметр = "";
	КонецЕсли;
	
	ПараметрРасшифровки = Колонка.Имя;
	Если Не (ОформлятьОсобыеЗначения
			 ИЛИ ТребуетсяРасшифровкаКолонкиРезультата(Колонка.ТипЗначения)) Тогда
		ПараметрРасшифровки = "";
	КонецЕсли;
	
	Область.Параметр = Параметр;
	Область.ПараметрРасшифровки = ПараметрРасшифровки;
	
	Если ЗначениеЗаполнено(Формат) Тогда
		Область.Формат = Формат;
	КонецЕсли;
	
КонецПроцедуры
Показать


Вывод:
Функция ВывестиСтрокиВыборки(Выборка, ДокументВывода, Области, СИерархией, НомерСтроки, МаксимумСтрок)
	
	ВыведеныВсе = Истина;

	ВыборкаСтроки = Выборка.Выбрать();
	КоличествоСтрок = ВыборкаСтроки.Количество();
	Пока ВыборкаСтроки.Следующий() Цикл 
		
		Если НомерСтроки = МаксимумСтрок Тогда
			ВыведеныВсе = Ложь;
			Прервать;
		КонецЕсли;
		
		НомерСтроки = НомерСтроки + 1;
		
		Если НомерСтроки % 2 Тогда
			ОбластьВыводаСтрока = Области.Строка2;
		Иначе
			ОбластьВыводаСтрока = Области.Строка1;
		КонецЕсли;
		ОбластьВыводаСтрока.Параметры.Заполнить(ВыборкаСтроки);
		ДокументВывода.Вывести(ОбластьВыводаСтрока, ВыборкаСтроки.Уровень() + 1);
		
		Если СИерархией Тогда
			ВывестиСтрокиВыборки(ВыборкаСтроки, ДокументВывода, Области, СИерархией, НомерСтроки, МаксимумСтрок);
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат Новый Структура("ВыведеныВсе, КоличествоСтрок", ВыведеныВсе, КоличествоСтрок);
	
КонецФункции
Показать
Прикрепленные файлы:
20. Viktor_Ermakov 385 23.07.25 10:23 Сейчас в теме
(19)
Код обрывочный из Infostart Toolkit аналогичный скорее всего будет в Управляемая консоль отчетов


Спасибо большое за пример. Что бы понять как это работает надо поотлаживаться будет)))
21. Cyberhawk 136 25.07.25 14:13 Сейчас в теме
На закладке «Параметры» можно задать значения параметров, которые будут передаваться в форму. При этом будут приводиться типы к этим значениям, и на входе они будут обязательны
Что это означает?
22. Evg-Lylyk 5163 27.07.25 18:30 Сейчас в теме
(21) На входе они будут обязательно. Т. е. проверять на наличие не нужно. Можно просто использовать.
23. Farpost 117 30.07.25 12:24 Сейчас в теме
Вот кто ответит мне, зачем нужно было отказываться от простых форм. чтобы поиметь такой геморрой в разработке и быстродействии?
Который раз убеждаюсь - для 1С клиент-серверная ориентация в том виде, в каком она реализована, это костыль на костыле костылем погоняет...
24. Evg-Lylyk 5163 30.07.25 12:29 Сейчас в теме
(23) Разработка на упр. формах ИМХО легче. В обычных формах есть ворох своих недостатков к примеру привязки.
Представленные подходы позволяют сделать быстрее (использовать не обязательно) и большинство имеет смысл и в обычных формах (в них я делал практически тоже самое).
25. Farpost 117 30.07.25 12:40 Сейчас в теме
(24) Вот все у кого спрашивал видят один только недостаток -- привязки...
Да ёлы-палы, привязки сделать проще, чем корячится со сложной формой в УФ распределяя элементы по группам и подгруппам... а потом ещё корячиться распределить так, что бы на экране форма не скакала вверх вниз, вправо влево...
Как мне, так я лучше с привязками повожусь, но буду уверен, что на экране форма вести себя будет так, как я сделал.
А уж разработка в УФ, это вообще гемор конкретный...
Я уже молчу, что для работы приложухи на УФ нужен сервак на порядок быстрее чем на обычных - ибо ресурсы жрут эти УФ как бегемот веники... А самое главное, ради чего это всё затеяно? А оказывается, что бы был web-клиент и возможность работать на смартфоне... Мля, а какой процент юзеров этим пользуются посчитали? Ноль целых хрен десятых...
Про "юзабилити" (не люблю это слово, лучше уж междумородие) - худшего междумордия я ещё не видел. в классическом междумордии по крайней мере интуитивно понятно, что где лежит, при необходимости нужный элемент можно вывести в любом месте или сделать интерфейс заточенный для конкретного юзера... а в УФ - черт ногу сломит...
Вывих мысли дизигнера (разработчика) почему то решившего, что должно быть так и никак иначе...
pisarevEV; +1 Ответить
36. Sashares 33 14.08.25 14:45 Сейчас в теме
(25) Вот в 25 году еще ныть про обычные формы. Куча пользователей работает через браузер. Если вы этим не пользуетесь, не надо за всех говорить.
Evg-Lylyk; +1 Ответить
37. Farpost 117 14.08.25 19:01 Сейчас в теме
(36) Если кучу народа загнали пинками в браузер, это не значит, что это лучший вариант! Чем вам тот же РДП не угодил?
38. Sashares 33 14.08.25 19:28 Сейчас в теме
(37) При чем тут я?
Если браузер используют пользователи, значит платформа должна его поддерживать. Это требуются клиентам, заказчикам. Требует рынок.
Лучший это вариант или нет, он есть, он используется.
Нашего мнения тут не спрашивают.

Если вы не умеете в УФ, ну, учитесь. Все приходит с опытом.
Обратно фарш не провернуть, и от нытья никакого проку не будет. Это просто не продуктивно.
Типовые конфигурации за оооочень редким исключением на УФ.
УФ появились уже 16 лет как, как бы поздновато заново обсуждать, когда обычный интерфейс по сути мертв.
Вот в 8.5 иной интерфейс - вот его актуально обсуждать, какая в нем дичь, и как все стало неудобно =)
И может быть разработчики платформы прислушаются к сообществу и что-то в нем допилят, чтобы стало хотя бы приемлемо.

А обычные формы сейчас это тупик.
Evg-Lylyk; +1 Ответить
26. Evg-Lylyk 5163 30.07.25 12:51 Сейчас в теме
(25) Обычные формы это устаревшая технология они не будут ее развивать, нравится используйте если там все так прекрасно. Мне гораздо удобнее работать с управляемыми формами, уже давно не попадаются конфиги на обычных.
27. Farpost 117 30.07.25 12:53 Сейчас в теме
А почему устаревшая?
А чего такого нового в УФ?
Можете пояснить?
28. Evg-Lylyk 5163 30.07.25 12:55 Сейчас в теме
(27) У меня нет на это времени. Этот вопрос лучше задавать 1С, свое мнение уже выразил и чуток пояснил.
29. Farpost 117 30.07.25 12:58 Сейчас в теме
Ну вот как всегда - как спрашивать начинаю конкретику, так сразу слив... Вопросы 1С задавать бессмысленно - они общаются исключительно своими утверждениями из рекламных буклетов.
pisarevEV; +1 Ответить
30. Evg-Lylyk 5163 30.07.25 13:00 Сейчас в теме
(29) Ну так вам пишешь что полезно вы говорите не то. Сами описываете обесцениваете то полезное что есть.
Тут же нельзя взять что-то полезное и его сложить с новым. Нужно принимать технологию в целом.
31. Evg-Lylyk 5163 30.07.25 13:01 Сейчас в теме
(29) Более 10 лет проработал у обычными формами и следовательно со старыми конфигами. Вообще не жалею что теперь этого не использую, доволен.
Sashares; +1 Ответить
32. Farpost 117 30.07.25 13:04 Сейчас в теме
Ваш выбор, но понять его не могу, мучаюсь с этими гребанными УФ, второй год и ностальгирую по обычным...
Больше всего достаёт постоянно повторяющиеся вызовы процедур и функций... Какой то бред, а уж отказ от модальных форм... не понимаю, в инженерии сделать сложное простым, это высший пилотаж, а тут с точностью до наоборот - сделать простое и понятное настолько замороченным... это надо уметь..
33. Evg-Lylyk 5163 30.07.25 13:09 Сейчас в теме
(32) Есть моменты действительно неудобные, но в целом лучше конечно нужно привыкать.

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

Где то более структурированно получается в ОФ всегда был более каша-код. Чуть спасает если есть возможноть использовать Асинх, Ждать.
34. Farpost 117 30.07.25 13:24 Сейчас в теме
На мой взгляд, удобств нет совсем, постоянно надо держать в голове что оставит на клиенте, а что выполнять на сервере, куча ненужных процедур из-за БСП, отсутствие модальных окон - значит изгаляйся с методом остановки процесса, когда нужно дождаться ответа или выбора юзера...
Вот вообще не вижу ни одного преимущества. Если 77 была настолько понятная, что простые бухгалтера не только самостоятельно осваивали бухгалтерию, а товароведы торговлю, но и ещё осваивали простейшее программирование, в 8 на обычных формах в принципе несколько более сложная структура появилась, но и она была интуитивно понятна, то с переходом на УФ, уже без внешней помощи освоить просто работу в программе стало невозможным...
И это грустно.
Я вспоминаю начало службы - на срочке столкнулся с гидроакустикой и радиолокацией - благодаря техническому описанию, освоил ремонт и наладку сей техники за месяц самостоятельно... В ЖКК же освоить самостоятельно 1С - дохлое дело.
То есть вход в профессию стал настолько завышен, что простому пользователю уже не освоить...
Для отправки сообщения требуется регистрация/авторизация