Автоматическое резервирование в УТ 11 по приходу

21.11.16

Учетные задачи - Оптовая торговля

В конфигурации УТ 11 нет возможности настроить автоматическое резервирование товара, при его поступлении на склад. Но, как говорится, если очень хочется - то можно.

Скачать исходный код

Наименование Файл Версия Размер
ПрограммныйКод
.cf 12,05Kb
29
.cf 12,05Kb 29 Скачать

Предистория.

Внедряли пару лет назад УТ 11.1 (11.1.9.70) на складе. Не обошлось и без заказов клиента. Когда речь зашла о резервировани, выяснили, что проставить резерв можно исключительно руками. Ну и хорошо, подумали мы, программисты. Непозволительно! - воскликнули они, пользователи.

Как говорил наш генеральный - "нужно чуть-чуть поднастроить, программу и всё заработает", при этом, слегка жестикулируя правой рукой. Разве можно отказать генеральному, который исправно платит тебе оклад? Конечно нет, принимая во внимание, что УТ работала в жесткой связке с управленческой базой на 1с 7, и часть бизнес процессов должна была быть идентична в обеих базах.

Постановка задачи.

При поступлении товара на склад, необходимо зарезервировать его в первых (по дате) заказах клиента.

Решение.

Основная идея была такая. Раз в заказе клиента есть кнопка, которая позволяет зарезервировать все товары заказа имеющиеся в свободном остатке, следовательно, есть и механизм на программном уровне, который можно использовать.

Однако все оказалось не так уж радужно. Как выяснилось, этот механизм работает с ФОРМОЙ документа, и работает только с одним документом. Он не документирован, сложен, и черт ногу в нем сломит.

Однако путем проб и ошибок его удалось приспособить под собственные нужды.

В целом работает это всё следующим образом. При интерактивном проведении приходного ордера (при желании можно переделать и под поступление), вызывается процедура, которая выбирает все заказы с такиме же товарами в статусе "к обеспечению", применяет к ним последовательность штатных процедур по резервированию, резервирует товар, и отражает результат в регистре сведений.

Ниже приведен листинг используемых процедур и функций.

Во вложенном файле все тоже самое, но в формате 1С.

Напоминаю, что механизм разрабатывался под конфигурацию 11.1.9.70.  Не исключено, что подойдет и для других версий.


#Область  ОбработчикиСобытий

// Программный код процедуры необходимо добавить в модуль формы документа Приходный Ордер, в процедуру ПослеЗаписиНаСервере
Процедура ПослеЗаписиНаСервере(Форма, ТекущийОбъект, ПараметрыЗаписи) Экспорт
    
    Если Форма.ИмяФормы = "Документ.ПриходныйОрдерНаТовары.Форма.ФормаДокумента" Тогда 
        РезервированиеАвтоматическое(Форма, ТекущийОбъект, ПараметрыЗаписи);
    КонецЕсли;
        
КонецПроцедуры    

#КонецОбласти

#Область  РезервированиеАвтоматическое

Процедура РезервированиеАвтоматическое(Форма, ТекущийОбъект, ПараметрыЗаписи)
            
    Если ПараметрыЗаписи.РежимЗаписи <> РежимЗаписиДокумента.Проведение Тогда
        Возврат;
    КонецЕсли;
    
    ЕстьЗарезервированныеТовары = Ложь;

    // МассивРаспределяемыхТоваров - будет служить для того, чтобы со временем, прекратить распределение
    МассивРаспределяемыхТоваров = ТекущийОбъект.Товары.ВыгрузитьКолонку("Номенклатура");
        
    // Формируем запрос, выбираем незарезервированные (не обеспеченные) заказы
    РезультатЗапросаТоваровЗаказовКлиентовКОбеспечению = ПолучитьРезультатЗапросаТоваровЗаказовКлиентовКОбеспечению(МассивРаспределяемыхТоваров);
    
    // Обходим выборку, начинаем резервировать товар (обеспечивать заказы)
    ВыборкаЗаказы = РезультатЗапросаТоваровЗаказовКлиентовКОбеспечению.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    Пока ВыборкаЗаказы.Следующий() Цикл
        
        ПереченьВариантов = Новый Массив();
        ИндексыСтрок = Новый Массив();
        ТоварыСтрок = Новый Массив();
        
        ВыборкаСтрокиЗаказа = ВыборкаЗаказы.Выбрать();
        Пока ВыборкаСтрокиЗаказа.Следующий() Цикл
            Если ПереченьВариантов.Найти(ВыборкаСтрокиЗаказа.ВариантОбеспечения) = Неопределено Тогда
                ПереченьВариантов.Добавить(ВыборкаСтрокиЗаказа.ВариантОбеспечения);
            КонецЕсли;
            ИндексыСтрок.Добавить(ВыборкаСтрокиЗаказа.НомерСтроки - 1);
            ТоварыСтрок.Добавить(ВыборкаСтрокиЗаказа.Номенклатура);
        КонецЦикла;
        
        Если ПереченьВариантов.Найти(Перечисления.ВариантыОбеспечения.Отгрузить) = Неопределено Тогда
            ПереченьВариантов.Добавить(Перечисления.ВариантыОбеспечения.Отгрузить);
        КонецЕсли;    
        
        ВыполнитьОбеспечениеЗаказа(ВыборкаЗаказы.Ссылка, ИндексыСтрок, ПереченьВариантов,МассивРаспределяемыхТоваров,ТоварыСтрок,ТекущийОбъект,ЕстьЗарезервированныеТовары);
        
        Если МассивРаспределяемыхТоваров.Количество() = 0 Тогда // все распределили
            Прервать;
        КонецЕсли;
        
    КонецЦикла;
    
    Если ЕстьЗарезервированныеТовары Тогда
        // Если возникнет необходимость выводить сообщение, даже при нажатии на кнопку "Провести и закрыть",
        // это можно будет организовать через оповещение, переместив начало процесса резервирования на клиент,
        // в процедуру послезаписи, на клиенте.
        ТекстСообщения = НСтр("ru = 'Документ ""%ДокументОснование%"" зарезервировал товары.'");
        ТекстСообщения = СтрЗаменить(ТекстСообщения, "%ДокументОснование%", ТекущийОбъект);
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения,ТекущийОбъект);
    КонецЕсли;    
    
КонецПроцедуры    

Функция ПолучитьРезультатЗапросаТоваровЗаказовКлиентовКОбеспечению(ОтборТовары)
        
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |    ЗаказКлиентаТовары.Ссылка КАК Ссылка,
    |    ЗаказКлиентаТовары.Ссылка.Дата КАК Дата,
    |    ЗаказКлиентаТовары.НомерСтроки КАК НомерСтроки,
    |    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    |    ЗаказКлиентаТовары.Количество КАК Количество,
    |    ЗаказКлиентаТовары.ВариантОбеспечения
    |ИЗ
    |    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
    |ГДЕ
    |    ЗаказКлиентаТовары.Ссылка.Проведен
    |    И ЗаказКлиентаТовары.Ссылка.Склад = ЗНАЧЕНИЕ(Справочник.Склады.ОптовыйСклад)
    |    И ЗаказКлиентаТовары.Ссылка.Статус В(&ОтборСтатусы)
    |    И ЗаказКлиентаТовары.Номенклатура В(&ОтборТовары)
    |    И ЗаказКлиентаТовары.ВариантОбеспечения В(&ОтборВариантыОбеспечения)
    |
    |УПОРЯДОЧИТЬ ПО
    |    Дата,
    |    НомерСтроки
    |ИТОГИ ПО
    |    Ссылка"
    ;
    
    // можно дополнить ножными статусами
    ОтборСтатусы = Новый Массив;
    ОтборСтатусы.Добавить(Перечисления.СтатусыЗаказовКлиентов.КОбеспечению);
    
    ОтборВариантыОбеспечения = Новый Массив;
    ОтборВариантыОбеспечения.Добавить(Перечисления.ВариантыОбеспечения.Требуется);
    
    Запрос.УстановитьПараметр("ОтборТовары",ОтборТовары);
    Запрос.УстановитьПараметр("ОтборСтатусы",ОтборСтатусы);
    Запрос.УстановитьПараметр("ОтборВариантыОбеспечения",ОтборВариантыОбеспечения);
    
    Возврат Запрос.Выполнить();
    
КонецФункции

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

Функция ПолучитьЗарезервированныеТовары(ТаблицаОбеспечения,МассивРаспределяемыхТоваров,ТоварыСтрок,ТоварыДокументаДоОбеспечения)
    
    Отбор = Новый Структура();
    Отбор.Вставить("ВариантОбеспечения",Перечисления.ВариантыОбеспечения.Отгрузить);
    Строки = ТаблицаОбеспечения.НайтиСтроки(Отбор);
    ТаблицаЗарезервированныхТоваров = ТаблицаОбеспечения.Скопировать(Строки,"Идентификатор,Количество");
    ТаблицаЗарезервированныхТоваров.Колонки.Добавить("Номенклатура",Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
        
    Для Каждого Строка ИЗ ТаблицаЗарезервированныхТоваров Цикл
        СтрокаДокумента = ТоварыДокументаДоОбеспечения.Найти(Строка.Идентификатор+1,"НомерСтроки");
        Строка.Номенклатура = СтрокаДокумента.Номенклатура;    
    КонецЦикла;
    
    ТаблицаЗарезервированныхТоваров.Колонки.Удалить("Идентификатор");
    
    Для Каждого Товар ИЗ ТоварыСтрок Цикл
        СтрокаТаблицаЗарезервированныхТоваров = ТаблицаЗарезервированныхТоваров.Найти(Товар,"Номенклатура");
        Если СтрокаТаблицаЗарезервированныхТоваров = Неопределено Тогда // этого товара уже нет больше в свободном остатке
            ИндексЭлемента = МассивРаспределяемыхТоваров.Найти(Товар);
            Если ИндексЭлемента <> Неопределено Тогда
                МассивРаспределяемыхТоваров.Удалить(ИндексЭлемента);
            КонецЕсли;    
        КонецЕсли;
    КонецЦикла;    
    
    Возврат ТаблицаЗарезервированныхТоваров;
    
КонецФункции

Процедура ВернутьПрежнююДатуОтгрузки(ТаблицаОбеспечения,ТоварыДокументаДоОбеспечения,Документ)
    
    Для Каждого Строка ИЗ ТаблицаОбеспечения Цикл
        СтрокаДокумента = ТоварыДокументаДоОбеспечения.Найти(Строка.Идентификатор+1,"НомерСтроки");
        Строка.ДатаОтгрузки = СтрокаДокумента.ДатаОтгрузки;
    КонецЦикла;    
    Документ.ДополнительныеСвойства.Вставить("АвтоматическоеРезервирование",Истина);
    
КонецПроцедуры    

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

    Документ = Заказ.ПолучитьОбъект();
    
    Попытка
        Документ.Заблокировать();
    Исключение
        ЗаписьРегистраСведений(Перечисления.РезервированиеАвтоматическоеДействия.НеУдалосьЗарезервировать,Заказ,ТекущийОбъект);
        Возврат;
    КонецПопытки;
    
    ТоварыДокументаДоОбеспечения = Документ.Товары.Выгрузить(,"НомерСтроки,Номенклатура,ДатаОтгрузки");

    ПараметрыЗаполнения = МенеджерДокумента.ПараметрыВыбораОбеспечения(Документ.Статус);
    
    ТаблицаОбеспечения = ОбеспечениеСервер.ТаблицаЗаполнениеОбеспеченияДокумента(Документ, ПереченьВариантов, ПараметрыЗаполнения, ИндексыСтрок);
    
    ВернутьПрежнююДатуОтгрузки(ТаблицаОбеспечения,ТоварыДокументаДоОбеспечения,Документ);

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

#КонецОбласти

Автоматическое резервирование Управление торговлей Резервирование

См. также

Автоматический заказ поставщику в 1С: загрузка прайсов и анализ цен поставщиков для УТ 10.3, УТ 11, КА2, УНФ, УПП, ERP, Розница 2

Бюджетирование и планирование Оптовая торговля Розничная торговля Логистика, склад и ТМЦ Анализ продаж Платформа 1С v7.7 Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Беларусь Украина Россия Казахстан Управленческий учет Платные (руб)

Система управления запасами для 1С помогает работать с запасами правильно: автоматически рассчитывает потребность и делает заказ поставщику, загружает прайсы, перемещает товары по филиалам, анализирует продажи и позволяет управлять ассортиментом.

28500 руб.

21.04.2017    90837    108    40    

197

ЕГАИС++. Опт, производство, импорт

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Полнофункциональное расширение (ранее известное как Модуль 1С-ЕГАИС) для взаимодействия типовых конфигураций 1С и ЕГАИС, предоставляющее максимум возможностей по работе с УТМ. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

8970 руб.

15.12.2015    166345    701    362    

389

Обмен с системой ЦРПТ (Универсальная конфигурация ХамелеонЦРПТ + маркировка табака, обуви, одежды, лекарств, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин)

Оптовая торговля Розничная торговля Обмен с ГосИС Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Данная публикация создана для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Смело задавайте нам вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, мы накопили достаточно большую базу знаний по данным темам и готовы ответить на все Ваши вопросы.

104000 руб.

18.03.2019    110611    34    114    

178

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11 / КА 2 / ERP 2. Переносятся документы, справочники и остатки

Обмен между базами 1C Взаиморасчеты Оптовая торговля Логистика, склад и ТМЦ Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Управленческий учет Платные (руб)

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос в продаже с 2015г., и мы постоянно работаем над его развитием. Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

50722 45650 руб.

24.04.2015    190675    270    239    

269

Обмен с системой Меркурий через Web + Ветис.API для любых конфигураций (универсальная конфигурация Хамелеон Меркурий)

Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Обмен с ГосИС Платформа 1С v8.3 Конфигурации 1cv8 Сельское хозяйство и рыболовство Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Пищевая промышленность Россия Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий(тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.

104000 руб.

08.11.2017    121047    295    140    

394
Отзывы
1. A-tomic 20.11.16 21:12 Сейчас в теме
Отлично сработало на УТ 11.3.1, спасибо.

Было внесено несколько правок: проверка назначения (товар оприходуется под конкретный заказ клиента), ориентация на склад, как реквизит табличной части (используется поступление / реализация с нескольких складов).

Сколько всего времени заняло создание этого кода в днях, если не секрет?
+
Остальные комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. A-tomic 20.11.16 21:12 Сейчас в теме
Отлично сработало на УТ 11.3.1, спасибо.

Было внесено несколько правок: проверка назначения (товар оприходуется под конкретный заказ клиента), ориентация на склад, как реквизит табличной части (используется поступление / реализация с нескольких складов).

Сколько всего времени заняло создание этого кода в днях, если не секрет?
+
2. hiduk 124 21.11.16 09:27 Сейчас в теме
Около 3 дней. Всего задача отняла пару недель - с постановкой задачи, поиском способа реализации, попытками разобраться в типовом механизме резервирования (дыбом волосы стояли), и внедрением. 2 недели, учитывая то что с УТ 11 ковырялся уже год...
+
3. user1329243 14.10.21 17:52 Сейчас в теме
Добрый вечер, hiduk. Можно с Вами пообщаться в личке?
+
4. ketr 125 22.02.22 08:07 Сейчас в теме
Все супер, только не понял зачем нужен регистр сведений. Просто для записи информации по резервированию?
+
5. hiduk 124 25.02.22 17:58 Сейчас в теме
(4) Да, для записи и последующего анализа.
+
Внимание! Тема сдана в архив