В процессе работы с конфигурацией 1С:Управление торговлей (УТ) 11, особенно в версиях линейки 11.3 и 11.4, пользователи часто сталкиваются со специфической проблемой: форма подбора номенклатуры открывается корректно, позволяет выбрать товар в корзину, но при нажатии кнопки "Перенести в документ" программа полностью зависает ("белый экран" или "программа не отвечает").
Интересной особенностью данной ошибки является ее избирательность. В некоторых документах (например, в Заказе клиента) подбор может работать идеально, а в документе Поступление товаров и услуг вызывать критический сбой. Проанализируем причины этого поведения и разберем по шагам методы диагностики и решения.
Рассмотрим ситуацию, когда стандартные методы обслуживания базы данных, такие как ЧДБФЛ (chdbfl.exe), тестирование и исправление (ТиИ) через Конфигуратор, чистка кэша и даже перезапуск на разных версиях платформы 1С не приносят результата. Проанализируем ключевой симптом, выявленный опытным путем: зависание происходит только в том случае, если в документе предварительно выбран Поставщик. Если поле "Поставщик" оставить пустым, подбор и перенос позиций проходят мгновенно.
При попытке отладки выясняется следующее: выполнение кода замирает сразу после завершения процедуры ПередЗакрытием в модуле формы обработки ПодборТоваровВДокументЗакупки. Отладчик (F11) просто перестает реагировать, так как управление передается платформенным механизмам или фоновым процессам, которые входят в состояние бесконечного ожидания или взаимной блокировки.
Посмотрим на типовой код, который выполняется в момент инициации закрытия формы подбора. Рассмотрим фрагмент модуля формы ПодборТоваровВДокументЗакупки:
Процедура ПередЗакрытием(Отказ, ЗавершениеРаботы, ТекстПредупреждения, СтандартнаяОбработка)
Если ЗавершениеРаботы И Объект.Корзина.Количество() > 0 Тогда
Отказ = Истина;
ТекстПредупреждения = НСтр("ru = 'Данные были изменены. Все изменения будут потеряны.'");
Возврат;
КонецЕсли;
// Вызов общего модуля для обработки параметров подбора
ПодборТоваровКлиент.ПередЗакрытиемФормыПодбораТоваров(ЭтаФорма, Объект, Отказ);
// Проверка заполнения данных перед переносом
Если ПеренестиВДокумент И ПроверятьЗаполнение И Не ПроверитьЗаполнение() И НЕ ВыполняетсяЗакрытие Тогда
ПеренестиВДокумент = Ложь;
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Заметим, что сама процедура не содержит тяжелых вычислений. Однако после ее завершения срабатывает механизм ОповеститьОВыборе или стандартный обработчик ОбработкаВыбора в самой форме документа. Именно там кроется причина зависания при наличии заполненного контрагента.
Выясним причину, почему наличие поставщика так критично влияет на производительность:
ЦеныНоменклатурыПоставщиков. Если база содержит сотни тысяч записей в этом регистре или нарушены индексы, запрос может выполняться крайне долго.ВременноеХранилище из формы подбора в форму документа.Рассмотрим несколько способов устранения данной проблемы, от простых к радикальным.
Как показывает практика и опыт обсуждения на форумах, данная проблема чаще всего является следствием программной ошибки в конкретном релизе УТ 11. Разработчики 1С исправляют подобные "фризы" в последующих патчах и обновлениях. Если ваша версия (например, 11.3.4.228) ведет себя подобным образом, первым делом необходимо обновить конфигурацию до актуального релиза текущей ветки (например, перейти на 11.4 или актуальный 11.5). Обновление заменяет проблемные общие модули ПодборТоваровКлиентСервер и механизмы работы с соглашениями на оптимизированные.
Если быстрое обновление невозможно, проанализируем настройки базы:
Для того чтобы точно определить "виновную" строку кода, когда отладчик бессилен, создадим временное расширение. Попробуем заменить процедуру ОбработкаВыбора в документе ПоступлениеТоваровУслуг на пустую или добавить в нее логирование через ЗаписьЖурналаРегистрации. Это позволит выяснить: зависает программа до попадания данных в документ или уже внутри логики самого документа.
Типичный код для логирования в расширении:
&После("ОбработкаВыбора")
Процедура ИН_ОбработкаВыбораПосле(ВыбранноеЗначение, ИсточникВыбора)
ЗаписьЖурналаРегистрации("ДиагностикаПодбора", УровеньЖурналаРегистрации.Информация, , , "Начало обработки выбора");
// Здесь будет выполняться стандартный код,
// если зависнет до этого момента - проблема в платформе/форме подбора
КонецПроцедуры
Если база работает в файловом режиме и ее объем превышает несколько гигабайт, механизмы УТ 11 (особенно тяжелые запросы в подборе) могут просто не укладываться в лимиты файловой СУБД. Переход на MS SQL или PostgreSQL часто решает проблему зависаний, так как серверные СУБД гораздо эффективнее справляются с конкурентными запросами к регистрам цен и остатков.
Подведем итог: если вы столкнулись с тем, что подбор в УТ 11 зависает именно при наличии поставщика, скорее всего, вы столкнулись с программной ошибкой релиза в части обработки цен и соглашений. Самым надежным и быстрым способом исправления ситуации является плановое обновление конфигурации до актуального состояния.