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