Как исправить зависание при открытии подбора номенклатуры в 1С:Управление торговлей 11.3?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Рассмотрим частую и крайне неприятную проблему, с которой сталкиваются пользователи и администраторы систем на базе «1С:Предприятие 8.3» (в частности, в конфигурации «Управление торговлей», редакция 11.3 и 11.4). При попытке открыть форму подбора номенклатуры в документах продажи (например, в «Заказе клиента» или «Реализации товаров и услуг») программа намертво зависает. При этом один поток процесса 1cv8c.exe начинает нагружать процессор на 100%, оперативная память остается практически свободной, а принудительное завершение работы становится единственным выходом.

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

Техническая суть проблемы: бесконечный цикл перерасчета геометрии

Описанное поведение программы — это классический платформенный баг «1С:Предприятие 8.3», проявляющийся на управляемых формах в интерфейсе «Такси». Начиная с версии платформы 8.3.7, система использует так называемый «флюидный» (динамический) алгоритм компоновки интерфейса. Размеры элементов, их отступы и положение рассчитываются на лету в зависимости от разрешения экрана, системного масштаба операционной системы и настроек самой формы.

Форма подбора номенклатуры в «Управлении торговлей 11» является одной из самых сложных в конфигурации. Она содержит огромное количество вложенных групп, табличных частей, динамических списков, фильтров и переключателей. Когда пользователь открывает эту форму при определенном разрешении экрана или при нестандартном масштабе Windows (например, 125% или 150%), математический алгоритм округления координат платформы заходит в тупик.

Как это происходит:

  1. Платформа пытается рассчитать ширину и высоту колонок и полей формы подбора.
  2. Из-за дробного коэффициента масштабирования Windows или особенностей разрешения экрана получается нецелое число пикселей.
  3. Система округляет значение в большую сторону, но тогда элемент перестает помещаться в границы родительской группы.
  4. Платформа тут же пытается уменьшить соседний элемент или перенести его, округляет в меньшую сторону, из-за чего освобождается лишний пиксель.
  5. Алгоритм снова пытается растянуть первый элемент — и процесс возвращается к шагу 1.

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

Выясняем причину: почему зависания происходят избирательно?

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

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

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

Способ №1: Изменение масштаба формы (самый надежный способ)

Этот метод позволяет разорвать математический тупик округления координат за счет принудительного изменения параметров отрисовки интерфейса «Такси». Сделать это можно двумя путями: через конфигуратор или непосредственно в пользовательском режиме (если форма все-таки открывается хотя бы один раз после перезапуска).

Вариант А. Изменение варианта масштаба на «Компактный» в Конфигураторе:

  1. Откроем информационную базу в режиме Конфигуратор.
  2. В дереве конфигурации найдем обработку ПодборТоваровВДокументПродажи.
  3. Развернем ее ветку до раздела Формы и откроем основную форму (как правило, она называется Форма).
  4. В окне свойств формы найдем свойство Вариант масштаба (по умолчанию там установлено значение Авто).
  5. Изменим это значение на Компактный.
  6. Сохраним конфигурацию базы данных и запустим программу в режиме предприятия.

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

Вариант Б. Изменение масштаба на 99% или 101%:

Если «компактный» вид кажется пользователям слишком мелким и нечитаемым, мы можем пойти другим путем — изменить масштаб формы ровно на 1%. Этого минимального сдвига достаточно, чтобы сбить ошибочный шаг сетки округления координат.

  1. В свойствах той же формы ПодборТоваровВДокументПродажи.Форма найдем свойство Масштаб.
  2. Вместо стандартного значения 100 установим значение 99 (или 101).
  3. При этом свойство Вариант масштаба оставляем в значении Авто.
  4. Сохраняем изменения и обновляем базу данных.

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

Способ №2: Сброс настроек окон конкретного пользователя в 1С

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

Выполним следующие шаги в режиме 1С:Предприятие под учетной записью администратора системы:

  1. Перейдем в раздел меню НСИ и администрирование -> Настройки пользователей и прав.
  2. Откроем справочник Пользователи и перейдем в карточку проблемного сотрудника.
  3. На панели навигации карточки пользователя нажмем на ссылку Настройки (или воспользуемся кнопкой Персональные настройки пользователей -> Очистка настроек в общих настройках прав).
  4. В открывшемся окне перейдем на вкладку Внешний вид.
  5. Найдем в списке строчку, соответствующую форме подбора номенклатуры (она будет содержать путь к обработке ПодборТоваровВДокументПродажи).
  6. Выделим эту строку и нажмем кнопку Очистить.

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

Способ №3: Настройка совместимости масштабирования (DPI) в Windows

Очень часто триггером для проявления этого бага 1С становится системное масштабирование экрана в операционной системе Windows (актуально для современных ноутбуков и мониторов высокого разрешения Full HD и Ultra HD / 4K, где по умолчанию стоит масштаб 125% или 150%). Мы можем заставить операционную систему корректно передавать масштаб приложению 1С.

Выполним настройку на локальном компьютере проблемного пользователя:

  1. Закроем все запущенные сеансы «1С:Предприятия».
  2. Нажмем правой кнопкой мыши на ярлык запуска 1С (обычно это ярлык запуска 1cestart.exe) на рабочем столе и выберем пункт Свойства.
  3. Перейдем на вкладку Совместимость.
  4. В нижней части окна нажмем кнопку Изменить параметры высокого DPI.
  5. Установим флажок в пункте Переопределите режим масштабирования высокого разрешения.
  6. В выпадающем списке под этим флагом выберем значение Приложение (или, если не поможет, выберем Система (улучшенная)).
  7. Нажмем ОК и применим изменения.

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

Способ №4: Отключение тяжелых функций и оптимизация динамических списков

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

Проанализируем программный код обработки события активизации строки в форме подбора:


&НаКлиенте
Процедура СписокПриАктивизацииСтроки(Элемент)
    // Отключаем немедленный запрос к серверу
    ПодключитьОбработчикОжидания("ИерархияНоменклатурыПриАктивизацииСтрокиОбработчикОжидания", 0.3, Истина);
КонецПроцедуры

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

  1. В самой форме подбора нажмите кнопку Настройка и временно отключите отображение колонок «Остаток» и «Цена» непосредственно в списке подбора номенклатуры (если бизнес-процесс компании позволяет видеть эти данные только в нижней корзине или в отдельном окне).
  2. В разделе НСИ и администрирование -> Склад и доставка отключите функциональную опцию Использовать расширенную форму подбора количества и вариантов обеспечения, если детальное обеспечение по датам и складам не требуется менеджерам оперативно в момент подбора. Это существенно упростит компоновку формы и снизит нагрузку на графический интерфейс.

Применение описанных выше методик (особенно изменение масштаба формы на 99% или переключение на компактный режим) позволяет полностью и навсегда избавиться от зависаний при подборе номенклатуры в «1С:Управление торговлей 11.3» без ущерба для удобства работы пользователей.

← На главную