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