Почему зависает подбор номенклатуры в УТ 11 при переносе товаров в документ Поступление товаров и услуг?

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

В процессе работы с конфигурацией 1С:Управление торговлей (УТ) 11, особенно в версиях линейки 11.3 и 11.4, пользователи часто сталкиваются со специфической проблемой: форма подбора номенклатуры открывается корректно, позволяет выбрать товар в корзину, но при нажатии кнопки "Перенести в документ" программа полностью зависает ("белый экран" или "программа не отвечает").

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

Симптоматика и первичная диагностика

Рассмотрим ситуацию, когда стандартные методы обслуживания базы данных, такие как ЧДБФЛ (chdbfl.exe), тестирование и исправление (ТиИ) через Конфигуратор, чистка кэша и даже перезапуск на разных версиях платформы 1С не приносят результата. Проанализируем ключевой симптом, выявленный опытным путем: зависание происходит только в том случае, если в документе предварительно выбран Поставщик. Если поле "Поставщик" оставить пустым, подбор и перенос позиций проходят мгновенно.

При попытке отладки выясняется следующее: выполнение кода замирает сразу после завершения процедуры ПередЗакрытием в модуле формы обработки ПодборТоваровВДокументЗакупки. Отладчик (F11) просто перестает реагировать, так как управление передается платформенным механизмам или фоновым процессам, которые входят в состояние бесконечного ожидания или взаимной блокировки.

Анализ кода процедуры ПередЗакрытием

Посмотрим на типовой код, который выполняется в момент инициации закрытия формы подбора. Рассмотрим фрагмент модуля формы ПодборТоваровВДокументЗакупки:


Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
    
    Если ЗавершениеРаботы И Объект.Корзина.Количество() > 0 Тогда
        Отказ = Истина;
        ТекстПредупреждения = НСтр("ru = 'Данные были изменены. Все изменения будут потеряны.'");
        Возврат;
    КонецЕсли;
    
    // Вызов общего модуля для обработки параметров подбора
    ПодборТоваровКлиент.ПередЗакрытиемФормыПодбораТоваров(ЭтаФорма, Объект, Отказ);
    
    // Проверка заполнения данных перед переносом
    Если ПеренестиВДокумент И ПроверятьЗаполнение И Не ПроверитьЗаполнение() И НЕ ВыполняетсяЗакрытие Тогда
        ПеренестиВДокумент = Ложь;
        Отказ = Истина;
    КонецЕсли;
    
КонецПроцедуры

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

Разберем основные причины зависания

Выясним причину, почему наличие поставщика так критично влияет на производительность:

  1. Автоматический поиск цен поставщика: В УТ 11 реализован сложный механизм работы с ценами. Когда вы переносите товары в документ, где выбран поставщик, система пытается автоматически заполнить цены, обращаясь к регистру сведений ЦеныНоменклатурыПоставщиков. Если база содержит сотни тысяч записей в этом регистре или нарушены индексы, запрос может выполняться крайне долго.
  2. Проверка условий соглашений: Если с поставщиком ведется работа по Соглашениям, при добавлении каждой строки система проверяет, входит ли товар в сегмент, указанный в соглашении, и соответствуют ли условия закупки установленным правилам. В старых релизах (11.3.4.х) алгоритм этой проверки содержал ошибку, приводившую к циклической обработке данных.
  3. Обновление динамических списков: После закрытия формы подбора форма документа обновляет свои данные. Если в документе включено отображение остатков или итогов с учетом фильтров по поставщику, происходит "тяжелый" пересчет интерфейса.
  4. Ошибки платформы 8.3: На определенных релизах платформы (в связке с конкретными версиями конфигурации) наблюдался баг отрисовки управляемых форм при передаче больших структур данных через ВременноеХранилище из формы подбора в форму документа.

Варианты решения проблемы

Рассмотрим несколько способов устранения данной проблемы, от простых к радикальным.

Способ 1. Обновление конфигурации (Рекомендуемое решение)

Как показывает практика и опыт обсуждения на форумах, данная проблема чаще всего является следствием программной ошибки в конкретном релизе УТ 11. Разработчики 1С исправляют подобные "фризы" в последующих патчах и обновлениях. Если ваша версия (например, 11.3.4.228) ведет себя подобным образом, первым делом необходимо обновить конфигурацию до актуального релиза текущей ветки (например, перейти на 11.4 или актуальный 11.5). Обновление заменяет проблемные общие модули ПодборТоваровКлиентСервер и механизмы работы с соглашениями на оптимизированные.

Способ 2. Оптимизация данных поставщика

Если быстрое обновление невозможно, проанализируем настройки базы:

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

Способ 3. Диагностика через расширение (для программистов)

Для того чтобы точно определить "виновную" строку кода, когда отладчик бессилен, создадим временное расширение. Попробуем заменить процедуру ОбработкаВыбора в документе ПоступлениеТоваровУслуг на пустую или добавить в нее логирование через ЗаписьЖурналаРегистрации. Это позволит выяснить: зависает программа до попадания данных в документ или уже внутри логики самого документа.

Типичный код для логирования в расширении:


&После("ОбработкаВыбора")
Процедура ИН_ОбработкаВыбораПосле(ВыбранноеЗначение, ИсточникВыбора)
    ЗаписьЖурналаРегистрации("ДиагностикаПодбора", УровеньЖурналаРегистрации.Информация, , , "Начало обработки выбора");
    // Здесь будет выполняться стандартный код, 
    // если зависнет до этого момента - проблема в платформе/форме подбора
КонецПроцедуры

Способ 4. Переход на серверную модель (SQL)

Если база работает в файловом режиме и ее объем превышает несколько гигабайт, механизмы УТ 11 (особенно тяжелые запросы в подборе) могут просто не укладываться в лимиты файловой СУБД. Переход на MS SQL или PostgreSQL часто решает проблему зависаний, так как серверные СУБД гораздо эффективнее справляются с конкурентными запросами к регистрам цен и остатков.

Подведем итог: если вы столкнулись с тем, что подбор в УТ 11 зависает именно при наличии поставщика, скорее всего, вы столкнулись с программной ошибкой релиза в части обработки цен и соглашений. Самым надежным и быстрым способом исправления ситуации является плановое обновление конфигурации до актуального состояния.

← На главную