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

21.11.16

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
ПрограммныйКод
.cf 12,05Kb
30
30 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

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

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

Решение.

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

См. также

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

Автоматизация учета ЕГАИС в 1С для оптовой торговли, производства и импорта. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

828 руб.

15.12.2015    172564    863    370    

406

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

Автоматический обмен данными с системой ФГИС Меркурий из 1С через ВетИС API: загрузка данных по хозяйствующим субъектам, предприятиям; типов, групп, видов, наименований продукции, сопоставление данных и запись их в базу данных; создание на основании расходных документов транспортных партий, отправка на сервер, печать полученных ветеринарных свидетельств, запрос остатков складского журнала, проведение инвентаризаций, оформление производственных партий.

11500 руб.

08.12.2017    105890    291    110    

147

SALE! 15%

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

Универсальная обработка для загрузки документов из Excel в 1С. Забудьте о ручном вводе: загружайте документы из Excel в 1С за секунды! Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С.

6000 руб.

09.11.2016    241698    1113    906    

1042

Оптовая торговля Розничная торговля Пользователь Платформа 1С v8.3 Оперативный учет Управляемые формы 1С:Управление торговлей 10 1С:Розница 2 Россия Управленческий учет Платные (руб)

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

30000 руб.

02.11.2015    113606    104    88    

186

SALE! 10%

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

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

55778 50200 руб.

24.04.2015    197251    157    244    

287

Оптовая торговля Розничная торговля WEB-интеграция 1С:Управление торговлей 10 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Платные (руб)

Онлайн-заказ - это решение для автоматизации процесса оформления заказов на сайте в торговых организациях. Продукт обеспечивает легкое взаимодействие между компанией и клиентами через веб-интерфейс, интегрированный с 1С:Предприятие. Система позволяет снизить операционные расходы, повысить лояльность клиентов и оптимизировать работу отдела продаж.

57600 руб.

26.11.2024    2260    2    1    

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

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

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

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

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