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];
                СтруктураПоиска = Новый Структура;
                СтруктураПоиска.Вставить("Номенклатура", НоменклатураСтроки);
            
                СтрокиТоваров = ЗаказОбъект.Товары.НайтиСтроки(СтруктураПоиска);

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

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


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

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

 


 

Результаты.

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

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

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

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

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

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

См. также

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

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

7200 руб.

02.08.2023    4172    15    1    

33

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

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

29400 руб.

29.06.2023    6003    14    5    

24

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

Расширение позволяет вывести в табличном документе факсимиле печати и подписей и/или вывести произвольную картинку из прикреплённых файлов организации для 1С УТ 11.5, КА 2.5, ERP 2.5, УНФ 3, Розница 3. Вывод факсимиле возможен в табличные документы УПД, УКД, Счёт-фактура, ТОРГ-12 и другие. Возможно настроить вывод для любых типовых макетов (Акт сверки, М-15, ТТН), для этого потребуется отредактировать макет и разместить на нём картинки с установленными именами. Редактирование осуществляется через типовой механизм в пользовательском интерфейсе.

3000 руб.

07.02.2023    6716    73    10    

30

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

Каждый из нас сталкивается с ситуацией, когда какой-нибудь менеджер показывает свой Excel и рассказывает, как он что-то из 1С копирует в него, снабжает пояснениями, выделяет цветом и т.д. и т.п. Заканчивается все просьбой сделать вот чтобы также было в 1С. И оказывается такой человек (почти с гарантией) либо лучшим продажником, либо каким-то важным, за все отвечающим, - на ком все держится.

2 стартмани

22.04.2024    5270    dimanich70    15    

22

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

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

01.03.2024    6884    dimanich70    9    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. any__uta 19.03.20 10:52 Сейчас в теме
спасибо) тема оказалась полезной)))
2. Igorro82IT 77 19.03.20 11:41 Сейчас в теме
(1) Это радует)
Наздоровье!
any__uta; +1 Ответить
3. andryandry 100 19.03.20 22:08 Сейчас в теме
нужная вещь. вы могли бы реализовать решение в виде расширения конфигурации?
4. Igorro82IT 77 20.03.20 07:17 Сейчас в теме
(3) Я и сделал, только для формы "ИсполнениеЗаказа" перечисления «ВариантыОбеспечения», но в остальных объектах не вижу такой необходимости.
Отчёт и обработки могут часто меняются (зачем их обновлять вместе со всей конфигурацией), в модуле регистра накопления добавлено всего несколько строк.
Это же не было продуктом на продажу..
5. andryandry 100 20.03.20 10:22 Сейчас в теме
(4)выложите расширение и отчеты для скачивания за стартмани, ок?
8. shard 281 23.03.20 13:44 Сейчас в теме
10. Igorro82IT 77 23.03.20 14:47 Сейчас в теме
(8) Ознакомился. Когда искал варианты прошлой осенью -не нашел (может по причине- в наименовании нет резервирования).
По сути реализованы шаги 2 и 4 немного с другим подходом, без использования регистра сведений.
11. shard 281 23.03.20 14:57 Сейчас в теме
(10) отчет по товарам в резерве также имеется и периодически применяется, но публикацию делал исключительно про автозакрытие просроченных заказов. История изменения реквизита срока действия заказа кстати ведется при версионировании заказов, но за все время использования алгоритма (с августа 18го года) ни разу не понадобилась. Отчет по срокам резервов тоже никто ни разу не просил, а вот на какую сумму менеджер резервов держит интересовались.
Igorro82IT; +1 Ответить
6. Igorro82IT 77 20.03.20 11:15 Сейчас в теме
Возможно и соберусь, скомпоную всё в один комплект, но не сегодня.
Чтобы пакет был более универсальным нужно учесть варианты, которые у меня просто не используются (учет по характеристикам и др), иначе будет пакет недоделок, который скачавшим придётся адаптировать, доделывать и.. ругаться на меня).
7. malikov_pro 1324 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) Лень - двигатель прогресса!
Наполнение базы маленькое - что при тестировании, что в работе на быстродействии не сказалось.
Но согласен- ТАК ДЕЛАТЬ НЕЛЬЗЯ!.
Спасибо за замечание -обязательно исправлю!
Оставьте свое сообщение