Почему зависает пункт «Заказы поставщикам» при вводе на основании в 1С:Управлении торговлей?

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

При работе в конфигурациях «1С:Управление торговлей 11» (УТ 11) или «1С:Комплексная автоматизация» (КА) пользователи часто сталкиваются с неприятной проблемой. При попытке создать документ на основании Заказа клиента в списке выбора команд «Создать на основании» они видят два похожих пункта: «Заказ поставщику» (в единственном числе) и «Заказы поставщикам» (во множественном числе). При нажатии на второй пункт программа зависает без видимых сообщений об ошибках, вынуждая пользователей аварийно завершать сеанс 1С.

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

Разберем разницу: «Заказ поставщику» и «Заказы поставщикам»

Для начала давайте поймем логику работы конфигураций УТ 11 и КА. Наличие двух похожих пунктов меню — это не ошибка интерфейса, а абсолютно разный функционал:

  1. «Заказ поставщику» (в единственном числе) — это стандартная команда ввода на основании. При её вызове система берет текущий Заказ клиента, копирует из него товары в новый документ Заказ поставщику и подставляет одного конкретного поставщика. Если поставщик не определен, пользователю просто предлагается выбрать его вручную в созданном черновике документа.
  2. «Заказы поставщикам» (во множественном числе) — это вызов специализированной обработки-помощника. Задача этого мастера — проанализировать все строки табличной части «Товары», у которых установлено действие «К обеспечению» или «Обеспечивать обособленно». Помощник пытается автоматически распределить товары по различным поставщикам (на основе зарегистрированных цен поставщиков, основных партнеров в карточке номенклатуры и истории прошлых закупок) и сформировать сразу несколько документов под разных контрагентов.

Если в исходном Заказе клиента нет товаров со статусом «К обеспечению» (например, все товары стоят в статусе «Отгрузить» или «Резервировать»), система мгновенно выдает сообщение: «Нет товаров, доступных для заполнения». Но если такие товары есть, программа запускает сложный аналитический алгоритм.

Выясним причину «зависания» системы

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

Пользователи обычно не дожидаются окончания процесса (который может занимать от 2 до 15 минут в зависимости от производительности сервера и объема данных) и принудительно закрывают программу через диспетчер задач Windows.

Как локализовать команду в конфигураторе

Если вы хотите детально изучить алгоритм или отключить этот функционал, нам потребуется найти место вызова формы в конфигурации. В современных версиях УТ 11/КА список «Создать на основании» формируется динамически с использованием Библиотеки стандартных подсистем (БСП).

Посмотрим по шагам, как найти эту команду в конфигураторе:

  1. Откроем конфигуратор и найдем документ ЗаказПоставщику.
  2. Обратим внимание на форму документа с именем СозданиеЗаказовПоставщикамНаОсновании. У нее есть параметр ДокументОснование с типом ссылки на ЗаказКлиента.
  3. Ввод на основании в БСП регистрируется программно. Откроем Модуль менеджера документа ЗаказПоставщику. Нам нужно найти экспортную процедуру, отвечающую за регистрацию команд создания на основании. Обычно она называется:
    
    Процедура ДобавитьКомандыСозданияНаОсновании(КомандыСозданияНаОсновании) Экспорт
        // Здесь регистрируется вызов формы создания заказов поставщикам
    КонецПроцедуры
    
  4. Также регистрация может находиться в процедуре ПриОпределенииКомандПодключенныхКОбъекту модуля менеджера документа-отправителя (ЗаказКлиента) или получателя.

Для того чтобы точно определить, какая именно процедура выполняется при нажатии на злополучную кнопку «Заказы поставщикам», мы рекомендуем использовать встроенный инструмент платформы — Замер производительности:

  1. В конфигураторе выберите меню Отладка -> Замер производительности (кнопка включения замера).
  2. В режиме «1С:Предприятие» откройте Заказ клиента и нажмите кнопку «Заказы поставщикам».
  3. Подождите 10-15 секунд (чтобы алгоритм успел начать работу) и в конфигураторе отключите замер производительности.
  4. В открывшейся таблице замера отсортируйте строки по колонке «Время» или «Количество строк». Вы сразу увидите стек вызовов процедур и тяжелый запрос, на котором программа проводит больше всего времени.

Как убрать пункт «Заказы поставщикам» без изменения типовой конфигурации

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

Рассмотрим по шагам, как реализовать это решение:

  1. Создайте новое расширение в конфигураторе (меню Конфигурация -> Расширения конфигурации -> Добавить).
  2. Перенесите в созданное расширение модуль менеджера документа ЗаказПоставщику (или ЗаказКлиента, в зависимости от того, где регистрируется команда создания на основании в вашей версии УТ/КА).
  3. В расширении перехватите процедуру регистрации команд (например, ПриОпределенииКомандПодключенныхКОбъекту) с помощью аннотации &После или &Вместо.
  4. Вставьте код, который удалит команду вызова формы создания заказов поставщикам из таблицы подключенных команд. Примерный шаблон программного удаления команды выглядит следующим образом:

&После("ПриОпределенииКомандПодключенныхКОбъекту")
Процедура Расш_ПриОпределенииКомандПодключенныхКОбъекту(НастройкиПодключенныхКоманд, ПараметрыВывода)
    
    // Перебираем зарегистрированные команды и удаляем ненужную
    Индекс = 0;
    Пока Индекс < НастройкиПодключенныхКоманд.Команды.Количество() Цикл
        СтрокаКоманды = НастройкиПодключенныхКоманд.Команды[Индекс];
        
        // Ищем команду по ее имени, синониму или имени формы вызова
        Если СтрокаКоманды.Имя = "СоздатьЗаказыПоставщикам" 
           Или Найти(СтрокаКоманды.ИмяСобытия, "СозданиеЗаказовПоставщикамНаОсновании") > 0 Тогда
            
            НастройкиПодключенныхКоманд.Команды.Удалить(СтрокаКоманды);
            // Индекс не увеличиваем, так как строка удалена
            Продолжить;
            
        КонецЕсли;
        
        Индекс = Индекс + 1;
    КонецЦикла;
    
КонецПроцедуры

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

Дополнительные рекомендации по оптимизации СУБД

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

← На главную