Выход релиза 1С:Управление торговлей 11.5.7 (а также аналогичных версий ERP 2.5.7 и КА 2.5.7) принес радикальные изменения в архитектуру товарного учета. Фирма 1С отказалась от использования целого ряда привычных регистров накопления, что привело к неработоспособности многих внешних отчетов, обработок и доработок. В этой статье мы подробно разберем, что именно изменилось, как теперь устроена логика хранения данных и как адаптировать свои запросы под новую структуру. При переходе на новую редакцию из устаревших систем можно использовать перенос остатков и документов из УТ 10.3 в УТ 11.
Проанализируем ситуацию: в новой версии были полностью исключены или переведены в разряд неиспользуемых семь ключевых товарных регистров накопления. Больше нет данных в регистрах:
СвободныеОстаткиГрафикиДвиженияТоваровОбеспечениеЗаказовЗапасыИПотребностиЗаказыНаПоступлениеРазмещениеЗаказовНаПоступлениеРаспределениеЗапасов (старая реализация)Вместо этой «каши» из регистров теперь используется единый независимый регистр сведений РаспределениеЗапасов. Рассмотрим подробнее, зачем это было сделано. Главная цель — повышение производительности. Ранее при проведении одного документа система блокировала до десяти таблиц. Теперь запись идет в одну таблицу, что значительно ускоряет работу в многопользовательском режиме. Однако для программиста это означает полную переработку всех механизмов получения остатков.
Выясним причину, по которой стандартные методы больше не работают. Новый регистр РаспределениеЗапасов является независимым и непериодическим. Это означает, что его записи не привязаны к регистратору классическим способом через коллекцию Движения. Записи формируются программно в модулях менеджеров документов.
Ключевым измерением регистра является Состояние (тип ПеречислениеСсылка.РаспределениеЗапасовСостояния). Именно оно определяет смысл записи. Основные состояния, которые нам понадобятся:
Важный нюанс: записи в этом регистре хранятся в развернутом виде. Чтобы получить привычный «свободный остаток», нам придется суммировать или вычитать данные с разными фильтрами по состояниям. Для этой задачи можно использовать готовый отчет по товарам на складах с расчетом резервов.
Разберем по шагам логику построения запроса. Поскольку регистр один, нам нужно использовать несколько соединений одной и той же таблицы или агрегировать данные по условиям. Рассмотрим пример получения резерва «сейчас» (то, что зарезервировано из текущего наличия).
Для получения резерва проанализируем фрагмент запроса:
ВЫБОР КОГДА Таблица.ДоступноСейчас > 0 ТОГДА
- ВЫБОР КОГДА Таблица.ДоступноСейчас > ЕСТЬNULL(ТаблицаНеобеспеченные.НеОбеспечено, 0) + ЕСТЬNULL(ТаблицаСлужебныеЗаписи.НеОбеспечено, 0) ТОГДА
- (ЕСТЬNULL(ТаблицаНеобеспеченные.НеОбеспечено, 0) + ЕСТЬNULL(ТаблицаСлужебныеЗаписи.НеОбеспечено, 0))
ИНАЧЕ
- Таблица.ДоступноСейчас
КОНЕЦ
ИНАЧЕ
0
КОНЕЦ КАК ВРезервеСейчас
Теперь посмотрим, как вычислить Доступно сейчас. Логика усложнилась, так как система теперь учитывает так называемые «служебные записи» и необеспеченные потребности внутри одного механизма:
ВЫБОР КОГДА Таблица.ДоступноСейчас > 0 ТОГДА
ВЫБОР КОГДА Таблица.ДоступноСейчас > ЕСТЬNULL(ТаблицаНеобеспеченные.НеОбеспечено, 0) + ЕСТЬNULL(ТаблицаСлужебныеЗаписи.НеОбеспечено, 0) ТОГДА
- (ЕСТЬNULL(ТаблицаНеобеспеченные.НеОбеспечено, 0) + ЕСТЬNULL(ТаблицаСлужебныеЗаписи.НеОбеспечено, 0))
ИНАЧЕ
- Таблица.ДоступноСейчас
КОНЕЦ
ИНАЧЕ
0
КОНЕЦ КАК ДоступноСейчас
Проанализируем еще одну важную деталь: при проведении документов данные могут попадать в регистр не мгновенно. В системе реализован механизм отложенного обновления распределения запасов. Изменения сначала фиксируются в регистре накопления РаспределениеЗапасовДвижения, а затем специальное фоновое задание пересчитывает итоговый регистр сведений РаспределениеЗапасов.
Если вам нужно получить максимально актуальные данные, учитывающие еще не обсчитанные фоновым заданием документы, рекомендуется обращаться к виртуальным таблицам регистра накопления ТоварыКОтгрузке или использовать программный интерфейс (API), предоставляемый самой конфигурацией.
Чтобы успешно перейти на версию 11.5.7 и выше, выполним следующие шаги, включая предварительное архивирование и тестирование баз 1С перед внесением структурных изменений:
РегистрНакопления.СвободныеОстатки.Остатки(), теперь будут выдавать пустой результат или ошибку.ЗапасыСервер. Это позволит вам не переписывать запросы каждый раз, когда логика состояний будет дополняться новыми перечислениями.РегистрСведений.РаспределениеЗапасов с фильтром по конкретной номенклатуре. Обратите внимание на поля Доступно, Резерв и ИспользоватьВГрафике.Обновление распределения запасов работает корректно. Если оно зависнет, данные в регистре сведений перестанут быть актуальными, и менеджеры увидят неверные остатки.Подводя итог, можно сказать, что переход на 11.5.7 — это не просто очередное обновление, а серьезная переработка фундамента системы. Хотя трудозатраты на адаптацию разработок будут значительными, новая модель распределения запасов более гибкая и позволяет реализовать сложные схемы резервирования, которые ранее были невозможны в типовом функционале. Для дополнительной оптимизации базы после масштабного перехода можно выполнить многопоточную свёртку 1С:ERP.