5 шагов по изменению резервирования товаров в УТ 11.4

19.03.20

Задачи пользователя - Адаптация типовых решений

Планируйте, меняйте подходы, делайте качественно и регулярно, и получите результат.

Практика использования существующего типового функционала резервирования товаров в УТ 11 выявила недостатки:

  • отсутствие механизма по контролю за резервами ответственными (нет сводного отчета).
  • отсутствие временных лимитов по резервам и как следствие образование неликвидов (зависшие товары) или недоступность резервирования по актуальным заказам клиентов.
  • два вида резервирования «СоСклада» и «ИзЗаказов» одинаково «минусуют» складской остаток.

Я подумал и пошёл ...шагами.

Шаг 1 - Составление.

Приняты решения:

  • Установить временной лимит для хранения статуса резерва товара (10 дней).
  • По истечении лимита отменять резервирование товаров, как по неактуальным (автоматически).
  • Создать возможность пролонгирования резервов  товаров по заказам (ответственным).
  • Создать отчет для мониторинга остатков сроков по резервам.
  • Разделить доступность остатков при резервировании из наличия и резервирования к дате (СоСклада и ИзЗаказов).


Шаг 2 – Создание скелета.

Созданы объекты:

Регистр сведений «ООО_ПролонгацияРезервов» , где
   измерения: ДатаУстановкиРезерва, ЗаказКлиента, Номенклатура, Склад, ДатаОкончанияРезерва, Ответственный;
   ресурсы: Количество;
   реквизиты: ПричинаПродленияРезерва.

Роль ООО_ ПролонгацияРезервов(для просмотра и изменения менеджерами).

Внешняя обработка «Продлить резервы по заказу»  - Необходима для создания записей в новом регистре сведений «ООО_ПролонгацияРезервов» из формы заказа клиента без вмешательства в типовой код формы документа.

Шаг 3 – Визуализация.

Мониторинг менеджерами и руководством  сроков резервов по созданному внешнему отчету.

Например:

 


 

Ищем сроки резервов запросом по табличным частям «Товары» документов «Заказ клиента», соединяя с  новым регистром сведений («ООО_Пролонгация Резервов»).  Если в регистре данных по срокам нет (не делали продления), то срок равен дата заказа + количество временного лимита (10 дней).

Ответственные мониторят сроки своих резервов, прорабатывают с клиентами актуальность заказанных позиций и при необходимости проваливаются в заказ, актуализируют данные в заказе и жмут кнопку "Продлить резервы по заказу". Дополнительная, но нужная работа (пользователям удобно).

В отчете пытался сделать фишку по сворачиванию группировки с «Номенклатурой».

Удалось через условное оформление – через ограничение максимальной высоты и включением/выключением через параметр «Подробно»(Да/НЕТ).  

Но такой вариант резко теряет красоту при наличии заказов с большим  разнообразием номенклатуры (на каждую номенклатуру по одной минимальной строчке болотного оттенка).

Если возможны варианты с несложной реализацией – буду рад прочитать в комментариях!

Шаг 4 – Автоматизация (или механизация).

Создан код по удалению «просроченных» резервов,  где поиск данных осуществлен аналогично алгоритму в отчете, после по данным с «просрочкой» (относительно текущей даты) в табличной части «Товары» (документов «Заказ клиента»)  изменяется действие обеспечения с «Резервировать на складе» на «Не обеспечивать» (возможно нужно использовать «Отменено») и заказы перепроводятся.

В идеале (автоматизация) код помещается в общий модуль (не типовой) и выполняется регламентированным заданием.

Для отладки и выявления исключений предлагаю использовать сперва внешнюю обработку (механизация).

Пример обработки приведен на рисунке.

 

Пример запроса:

Запрос.Текст = "ВЫБРАТЬ
	               |	ООО_ПролонгацияРезервов.ЗаказКлиента КАК ЗаказКлиента,
	               |	ООО_ПролонгацияРезервов.Номенклатура КАК Номенклатура,
	               |	ООО_ПролонгацияРезервов.Склад КАК Склад,
	               |	МАКСИМУМ ООО_ПролонгацияРезервов.ДатаУстановкиРезерва) КАК ДатаУстановкиРезерва
	               |ПОМЕСТИТЬ ВТ_Пролонгации
	               |ИЗ
	               |	РегистрСведений. ООО_ПролонгацияРезервов КАК ООО_ПролонгацияРезервов
	               |
	               |СГРУППИРОВАТЬ ПО
	               |	ООО_ПролонгацияРезервов.ЗаказКлиента,
	               |	ООО_ПролонгацияРезервов.Номенклатура,
	               |	ООО_ПролонгацияРезервов.Склад
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ
	               |	СвободныеОстаткиОстатки.Номенклатура КАК Номенклатура,
	               |	СвободныеОстаткиОстатки.ВРезервеСоСкладаОстаток КАК ВРезервеСоСкладаОстаток,
	               |	СвободныеОстаткиОстатки.ВРезервеПодЗаказОстаток КАК ВРезервеПодЗаказОстаток,
	               |	СвободныеОстаткиОстатки.Склад КАК Склад
	               |ПОМЕСТИТЬ ВТОстатки
	               |ИЗ
	               |	РегистрНакопления.СвободныеОстатки.Остатки(&ТекущаяДата, ) КАК СвободныеОстаткиОстатки
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ
	               |	СвободныеОстатки.Регистратор КАК Регистратор,
	               |	СвободныеОстатки.Период КАК Период,
	               |	СвободныеОстатки.Номенклатура КАК Номенклатура,
	               |	СвободныеОстатки.Склад КАК Склад,
	               |	СвободныеОстатки.ВРезервеСоСклада КАК ВРезервеСоСклада,
	               |	ЕСТЬNULL(ВТ_Пролонгации.ДатаУстановкиРезерва, СвободныеОстатки.Регистратор.Дата) КАК ДатаУстановки,
	               |	РАЗНОСТЬДАТ(ЕСТЬNULL(ВТ_Пролонгации.ДатаУстановкиРезерва, СвободныеОстатки.Регистратор.Дата), &ДатаАктуальности, ДЕНЬ) КАК РазностьКоличество
	               |ПОМЕСТИТЬ ВТПриходы
	               |ИЗ
	               |	РегистрНакопления.СвободныеОстатки КАК СвободныеОстатки
	               |		ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Пролонгации КАК ВТ_Пролонгации
	               |		ПО СвободныеОстатки.Регистратор = ВТ_Пролонгации.ЗаказКлиента
	               |			И СвободныеОстатки.Номенклатура = ВТ_Пролонгации.Номенклатура
	               |			И СвободныеОстатки.Склад = ВТ_Пролонгации.Склад
	               |ГДЕ
	               |	СвободныеОстатки.ВидДвижения = &ВидДвижения
	               |	И СвободныеОстатки.ВРезервеСоСклада > 0
	               |	И РАЗНОСТЬДАТ(ЕСТЬNULL(ВТ_Пролонгации.ДатаУстановкиРезерва, СвободныеОстатки.Регистратор.Дата), &ДатаАктуальности, ДЕНЬ) > 0
	               |;
	               |
	               |////////////////////////////////////////////////////////////////////////////////
	               |ВЫБРАТЬ
	               |	ВТОстатки.Номенклатура КАК Номенклатура,
	               |	ВТОстатки.ВРезервеСоСкладаОстаток КАК ВРезервеСоСкладаОстаток,
	               |	ВТОстатки.ВРезервеПодЗаказОстаток КАК ВРезервеПодЗаказОстаток,
	               |	ВТОстатки.Склад КАК Склад,
	               |	ВТПриходы.Регистратор КАК Регистратор,
	               |	ВТПриходы.ВРезервеСоСклада КАК ВРезервеСоСклада,
	               |	ВТПриходы.Период КАК Период,
	               |	ЕСТЬNULL(ВТПриходы.Регистратор.Менеджер, &ПустойПользователь) КАК Менеджер,
	               |	ЕСТЬNULL(ВТПриходы.Регистратор.Контрагент, &ПустойКонтрагент) КАК Контрагент,
	               |	ВТПриходы.ДатаУстановки КАК ДатаУстановки,
	               |	ДОБАВИТЬКДАТЕ(ВТПриходы.ДатаУстановки, ДЕНЬ, 10) КАК ДатаСрока
	               |ИЗ
	               |	ВТОстатки КАК ВТОстатки
	               |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПриходы КАК ВТПриходы
	               |		ПО ВТОстатки.Номенклатура = ВТПриходы.Номенклатура
	               |			И ВТОстатки.Склад = ВТПриходы.Склад
	               |
	               |УПОРЯДОЧИТЬ ПО
	               |	Регистратор,
	               |	Номенклатура,
	               |	Период УБЫВ";
	Запрос.УстановитьПараметр("ДатаАктуальности", ТекущаяДата() - 3600 * 24 * Объект.КоличествоДнейАктуальностиРезервов );
	Запрос.УстановитьПараметр("ВидДвижения", ВидДвиженияНакопления.Приход);
	Запрос.УстановитьПараметр("ПустойПользователь", Справочники.Пользователи.ПустаяСсылка());
	Запрос.УстановитьПараметр("ПустойКонтрагент", Справочники.Контрагенты.ПустаяСсылка());
	Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());

В коде обработки за основу взята таблица «РегистрНакопления.СвободныеОстатки.Остатки», а не табличная часть «Товары», т.к. регистраторы возможны нескольких типов (теоретически) и для выявления возможных вариантов решил задействовать его. На практике записи с количеством «ВРезервеСоСклада» пишутся только по регистратору «Заказ клиента».
 

Шаг 5 – Разделение доступности остатков.

Первая проблема в типовом функционале УТ: Не удается «резервировать на складе» (недоступен вариант), если остаток на складе ещё есть (с учётом других «резервирований на складе»), но количество в заказах с «резервированием к дате» (по заказам поставщикам) превышает имеющийся складской остаток.

На рисунке (пример типового функционала) показано, как конечный остаток в количестве 7 невозможно зарезерировать (не к дате).

 

 

При выборе варианта обеспечения в заказе покупателя вызывается форма перечисления «ВариантыОбеспечения»  - «ВыборВариантаОбеспечения» и варианты возможно выбрать только, если доступное количество больше нуля (а не конечный остаток).

Второй недостаток типового функционала – обратно позволяет «резервировать» и «отгружать» (устанавливать действие в заказе клиента) в отрицательный остаток, что вводит в заблуждение менеджеров (хорошо, если включен «контроль остатков товаров организаций» и проведение дальнейшей реализации не удается) и затрачивается время на разбирательства и исправление.

Команда «ЗаполнитьОбеспечение»  вызывает форму «ИсполнениеЗаказа" (того-же перечисления «ВариантыОбеспечения») , где присутствуют необязательные флаги «К обеспечению» и «Не обеспечивать», не указав которые можно установить «Отгрузить» и «Резервировать на складе» без контроля остатков.

Решение первого недостатка: покопавшись в коде отладчиком находим функцию «ТаблицаДоступныеОстатки» в модуле менеджера Регистра накопления «ГрафикПоступленияТоваров»,  добавляем пару строк.

Пример изменения типового кода (с комментариями  «Доработка ООО») :

Пока ЕстьЗаписи Цикл

        ЗаполнитьЗначенияСвойств(КлючСтроки, Выборка);
        НарастающийИтог          = Выборка.Остаток;
        МинимальноеЗначение      = НарастающийИтог;
        ИзмениласьЗапись         = Ложь;
        // Цикл по сочетанию номенклатура\характеристика\склад.
        Пока Не ИзмениласьЗапись Цикл
            НарастающийИтог = НарастающийИтог - Выборка.Оборот;
            
            // Доработка ООО
            МинимальноеЗначение_ООО      = НарастающийИтог;   
            // Доработка ООО

            Если МинимальноеЗначение > НарастающийИтог И (Не ТолькоПоложительные Или МинимальноеЗначение > 0) Тогда
                СтрокаТаблицы = ДоступныеОстатки.Добавить();
                ЗаполнитьЗначенияСвойств(СтрокаТаблицы, Выборка);
                СтрокаТаблицы.ДатаДоступности = Выборка.Период; //доступно на дату.
                СтрокаТаблицы.Количество = МинимальноеЗначение;
                МинимальноеЗначение = НарастающийИтог;
            КонецЕсли;
            // Переход к следующей записи.
            ЕстьЗаписи = Выборка.Следующий();
            ИзмениласьЗапись = Не ЕстьЗаписи Или ОбеспечениеКлиентСервер.ИзменилсяКлюч(КлючСтроки, Выборка);
        КонецЦикла;                          
        Если Не ТолькоПоложительные Или МинимальноеЗначение > 0 
            // Доработка ООО
            ИЛИ МинимальноеЗначение_ООО > 0 
            // Доработка ООО
            Тогда
            СтрокаТаблицы = ДоступныеОстатки.Добавить();
            ЗаполнитьЗначенияСвойств(СтрокаТаблицы, КлючСтроки);
            СтрокаТаблицы.ДатаДоступности = '00010101'; //доступно сейчас.
            
            СтрокаТаблицы.Количество = МинимальноеЗначение;
            
            // Доработка ООО
            Если Справочники.итЗначенияПоУмолчанию.ИспользоватьНовоеРезервирование.ОсновноеЗначение = Истина Тогда
                СтрокаТаблицы.Количество = МинимальноеЗначение_ООО;
            КонецЕсли; 
            // Доработка ООО
        КонецЕсли;


Пример кода отмены резервов:

Процедура ОтменитьРезервыНаСервере(МассивСтроки)

                ЗаказРезерва = МассивСтроки[0];
                ЗаказОбъект = ЗаказРезерва.ПолучитьОбъект();

                НоменклатураСтроки = МассивСтроки[1];
                СтруктураПоиска = Новый Структура;
                СтруктураПоиска.Вставить("Номенклатура", НоменклатураСтроки);
            
                СтрокиТоваров = ЗаказОбъект.Товары.НайтиСтроки(СтруктураПоиска);

                Для Каждого СтрокаТоваров Из СтрокиТоваров Цикл

                               Если СтрокаТоваров.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.СоСклада Тогда
                                               СтрокаТоваров.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется;
                                               Попытка
                                                               ЗаказОбъект.Записать(РежимЗаписиДокумента.Проведение);
                                               Исключение
                                                               //ОписаниеОшибки()
                                               КонецПопытки;
                               КонецЕсли;
                КонецЦикла;
КонецПроцедуры


Решение второго недостатка: изменить форму «ИсполнениеЗаказа», установив при открытии «К обеспечению» и ограничив изменение («ТолькоПросмотр»).

Пример на рисунке ниже.

 


 

Результаты.

Первые четыре шага реализованы более полугода назад и оказались рабочим решением в небольшой компании из нескольких организаций.

Жаль, что количественной  (статистической) оценки нет, но зарезервированные и неактуальные завалы товаров прекратились, уменьшилась путаница.

Пятый шаг реализован в этом году и позволил значительно сократить временные затраты при оформлении заказов клиентов.

Послесловие.

Ни на какую гениальность идей не претендую, надеюсь, что кому- то сгодятся вышеизложенные мысли или будут дельные ответные советы по лучшим вариантам.

Обоснованная критика приветствуется.

См. также

Табличная часть в доп. реквизитах и формирование таблиц в шаблоне docx для 1С:ДО 3.0

Адаптация типовых решений Платформа 1С v8.3 1С:Документооборот Россия Платные (руб)

Расширение конфигурации для «1С:Документооборот КОРП», редакция 3.0. позволяет: 1.использовать произвольные табличные части в качестве дополнительных реквизитов к документу; 2 использовать произвольные табличные части в шаблонах в формате docx для автоматического заполнения таблиц.

29400 руб.

29.06.2023    4453    9    4    

18

Расширение для 1С:УНФ. Автоматическое снятие резервов в Заказах покупателей

Логистика, склад и ТМЦ Адаптация типовых решений Платформа 1С v8.3 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 Россия Управленческий учет Платные (руб)

Чтобы не допустить путаницы с обещаниями клиентам и для четкого контроля исполнения заказов мы используем резервирование товаров. Мы доработали УНФ, чтобы она автоматически отменяла старые резервы и не мешала эффективно продавать.

7200 руб.

02.08.2023    2956    4    0    

19

Создать на основании - своя кнопка (БСП). Проблема двух подменю Создать на основании

БСП (Библиотека стандартных подсистем) Адаптация типовых решений Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

Понадобилось в подменю "Создать на основании" добавить свою команду, которая открывает обработку. В процессе доработок появилась проблема двух подменю "Создать на основании". В статье о том, как решились проблемы.

01.03.2024    1282    dimanich70    6    

13

Доработка отчета "Связанные документы" (структура подчиненности) для вывода объектов из любого расширения

Адаптация типовых решений Платформа 1С v8.3 1С:Управление торговлей 11 Россия Абонемент ($m)

Доработка типового отчета "Связанные документы" позволяет просто и быстро расширять состав объектов для построения структуры подчиненности документов, используя объекты основной конфигурации и любых расширений.

1 стартмани

27.10.2023    1995    13    avmartynov    10    

43

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    2071    21    progmaster    7    

3
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. any__uta 19.03.20 10:52 Сейчас в теме
спасибо) тема оказалась полезной)))
2. Igorro82IT 77 19.03.20 11:41 Сейчас в теме
(1) Это радует)
Наздоровье!
any__uta; +1 Ответить
3. andryandry 94 19.03.20 22:08 Сейчас в теме
нужная вещь. вы могли бы реализовать решение в виде расширения конфигурации?
4. Igorro82IT 77 20.03.20 07:17 Сейчас в теме
(3) Я и сделал, только для формы "ИсполнениеЗаказа" перечисления «ВариантыОбеспечения», но в остальных объектах не вижу такой необходимости.
Отчёт и обработки могут часто меняются (зачем их обновлять вместе со всей конфигурацией), в модуле регистра накопления добавлено всего несколько строк.
Это же не было продуктом на продажу..
5. andryandry 94 20.03.20 10:22 Сейчас в теме
(4)выложите расширение и отчеты для скачивания за стартмани, ок?
8. shard 279 23.03.20 13:44 Сейчас в теме
10. Igorro82IT 77 23.03.20 14:47 Сейчас в теме
(8) Ознакомился. Когда искал варианты прошлой осенью -не нашел (может по причине- в наименовании нет резервирования).
По сути реализованы шаги 2 и 4 немного с другим подходом, без использования регистра сведений.
11. shard 279 23.03.20 14:57 Сейчас в теме
(10) отчет по товарам в резерве также имеется и периодически применяется, но публикацию делал исключительно про автозакрытие просроченных заказов. История изменения реквизита срока действия заказа кстати ведется при версионировании заказов, но за все время использования алгоритма (с августа 18го года) ни разу не понадобилась. Отчет по срокам резервов тоже никто ни разу не просил, а вот на какую сумму менеджер резервов держит интересовались.
Igorro82IT; +1 Ответить
6. Igorro82IT 77 20.03.20 11:15 Сейчас в теме
Возможно и соберусь, скомпоную всё в один комплект, но не сегодня.
Чтобы пакет был более универсальным нужно учесть варианты, которые у меня просто не используются (учет по характеристикам и др), иначе будет пакет недоделок, который скачавшим придётся адаптировать, доделывать и.. ругаться на меня).
7. malikov_pro 1292 22.03.20 16:50 Сейчас в теме
Тема актуальна, благодарю что опубликовали свои наработки.
Сам немного раскапывал типовой механизм обеспечения https://infostart.ru/public/1188857/, до проблемы при резервировании к дате не дошел.
По формам отображения, отчет не всегда удобен, вывожу на форму список номенклатуры, при активизации строки ниже вывожу расшифровку.
Если интересно можно собрать проект в git и насыщать его наработками.
В планах перед снятием резерва уведомлять клиента, это стимулирует продажи.
Прикрепленные файлы:
9. Igorro82IT 77 23.03.20 14:43 Сейчас в теме
(7) Ознакомился с Вашей публикацией.
Решение формы обработки интересно и да - удобнее варианта с отчетом.
До "собирания проекта" я не готов (если только участником).
12. Cyberhawk 135 31.03.20 13:16 Сейчас в теме
В отчете пытался сделать фишку по сворачиванию группировки с «Номенклатурой»
А чем не устроило включение-отключение нижнего уровня группировки (номенклатура или детальные записи) в настройках структуры отчета, либо управление сворачиванием группировок через ПоказатьУровеньГруппировокСтрок?
14. Igorro82IT 77 01.04.20 20:45 Сейчас в теме
(12)
"включение-отключение нижнего уровня группировки (номенклатура или детальные записи) в настройках структуры отчета"
Не устраивает только тем, что нажатий больше делать, чем при выборе в шапке "Да/НЕт" (но это все от лени).

Про "управление сворачиванием группировок через ПоказатьУровеньГруппировокСтрок" не совсем понял - (это же не в контекстном меню выбирать уровень?) Есть возможность "разжевать"?
15. Cyberhawk 135 01.04.20 20:50 Сейчас в теме
(14)
нажатий больше делать, чем при выборе в шапке "Да/НЕт" (но это все от лени)
Заходишь в настройку структуры отчета, ПКМ по группировке нижнего уровня (по той, выводом или невыводом которой хочется управлять) - Свойства элемента пользовательских настроек - флажок Группировка - профит
13. пользователь 01.04.20 20:44
Сообщение было скрыто модератором.
...
16. zilot123 05.07.20 17:56 Сейчас в теме
Объясни зачем ты в цикле процедуры ОтменитьРезервыНаСервере записываешь заказ покупателя при каждом изменении строки? Почему не записываешь один раз после редактирования ТЧ
17. Igorro82IT 77 06.07.20 08:31 Сейчас в теме
(16) Лень - двигатель прогресса!
Наполнение базы маленькое - что при тестировании, что в работе на быстродействии не сказалось.
Но согласен- ТАК ДЕЛАТЬ НЕЛЬЗЯ!.
Спасибо за замечание -обязательно исправлю!
Оставьте свое сообщение