Многие пользователи при расширении бизнеса сталкиваются с тем, что автоматизация, которая идеально работала для одного склада, начинает «капризничать» при вводе второго. В случае с интеграцией СБИС и 1С:Управление торговлей (УТ 11) часто возникает ситуация, когда документы ПриобретениеТоваровУслуг создаются с пустым полем Склад. Давайте вместе разберемся, где «прячется» проблема и как ее можно диагностировать и устранить.
Первым делом проанализируем, как именно внешняя обработка пытается определить склад по умолчанию. В большинстве случаев код обработки содержит функцию наподобие СкладПоУмолчанию. Внимательно изучим логику, представленную в модуле:
Функция СкладПоУмолчанию(УчитыватьГруппыСкладов = Ложь, ИсключитьГруппыДоступныеВЗаказах = Ложь) Экспорт
Если УчитыватьГруппыСкладов Тогда
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2 Склад ИЗ Справочник.Склады КАК Таблица ГДЕ...");
Иначе
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ ПЕРВЫЕ 2 Склад ИЗ Справочник.Склады КАК Таблица ГДЕ НЕ Таблица.ЭтоГруппа");
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() И Выборка.Количество() = 1 Тогда
Склад = Выборка.Склад;
Иначе
Склад = Справочники.Склады.ПустаяСсылка();
КонецЕсли;
Возврат Склад;
КонецФункции
В чем здесь подвох? Обратите внимание на условие Выборка.Количество() = 1. Разработчик логики намеренно заложил жесткое ограничение: если в базе найдено более одного склада (или если запрос возвращает два и более элемента), система не пытается «угадать» нужный, а сознательно возвращает ПустаяСсылка. Когда склад был один, условие выполнялось, и всё работало. Как только складов стало два, условие перестало выполняться, и обработка «сдается», оставляя поле пустым.
Рассмотрим методы, которые обработка использует для поиска настроек пользователя. В коде часто встречаются вызовы, рассчитанные на устаревшие конфигурации:
сбисОписаниеОбъекта.Значение = Вычислить("УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной(""глТекущийПользователь""),""ОсновнойСклад"")");
Проблема заключается в том, что в УТ 11 архитектура хранилища настроек полностью переработана. Методы старых подсистем (таких как УправлениеПользователями) в текущей версии конфигурации либо отсутствуют, либо не содержат данных о складах, так как современная УТ 11 использует РегистрСведений.НастройкиПользователей или механизмы БСП (Библиотеки стандартных подсистем).
Для решения задачи предлагаем пройтись по следующим этапам:
ПолучитьСклад таким образом, чтобы она обращалась к актуальному хранилищу настроек. Вместо использования Вычислить с устаревшими методами, используйте прямой запрос к регистру сведений настроек пользователей вашей конфигурации.СкладПоУмолчанию так, чтобы она всегда возвращала конкретный Склад, если его Наименование совпадает с заданным, либо брать Первый из списка, убрав ограничение Количество() = 1. Однако помните, что это решение «в лоб», которое может быть неудобным, если склад меняется часто.МестныйКэш и метод сбисЗакэшироватьЗначениеРассчитанногоОбъекта. Если вы внесли правки в код, обязательно перезапустите сеанс работы с 1С или очистите кэш данных обработки, иначе система продолжит использовать старое, «запомненное» значение пустой ссылки.Чтобы точно увидеть, на каком этапе «отваливается» определение склада, рекомендуем поставить точку останова в функции ПолучитьСклад(Контекст). Запустите загрузку документа и пошагово пройдите выполнение кода. Если вы увидите, что сбисОписаниеОбъекта.Значение становится Неопределено, значит, обработка не находит настроек и, следовательно, не может заполнить реквизит документа. Это будет прямым сигналом к тому, что нужно либо настроить пользователя, либо переписать алгоритм поиска на более актуальный для УТ 11.