Адресное хранение в 1С — учет, в котором у товара на складе есть адрес: стеллаж, ярус, ячейка. Задача возникает, когда склад вырос: товар ищут по памяти, отбор идет медленно, растет пересорт. В 1С адресное хранение товаров устроено по-разному: в УТ 11, КА 2 и ERP это ячейки с остатками, правила размещения и задания для ТСД, в УНФ — ячейка как разрез остатков.
| УТ 11, КА 2, ERP 2 | УНФ 3.0 | |
|---|---|---|
| Включение | Карточка склада, вкладка «Ордерная схема и структура», поле «Ячейки» | «Настройки» → «Еще больше возможностей» → «Склад» → «Ячеистые склады» |
| Условие | Ордерная схема при поступлении, отгрузке и отражении излишков | Нет |
| Ячейки | Адрес-код, тип, типоразмер, область хранения, участок | Дерево любой глубины |
| Остатки | Регистр «Товары в ячейках» | Измерение «Ячейка» регистра «Запасы на складах» |
| Куда класть | Правила размещения, области хранения | Ячейка по умолчанию в карточке товара |
| Кладовщик | Задания на отбор и размещение, пересчеты, блокировки | «Перемещение по ячейкам» |
| ТСД | Мобильные рабочие места, веб-сервис, пакетный обмен | Пакетный обмен |
Адресное хранение 1С ERP устроено так же, как в УТ 11: складская подсистема общая. Особенность ERP — кладовые цехов: у склада с флажком «Кладовая цеха» ордерная схема выключается, а с ней и ячейки с остатками.
Флажок «Ордерные склады» — «НСИ и администрирование» → «Настройка НСИ и разделов» → «Склад и доставка». Поле «Ячейки» в карточке склада (вкладка «Ордерная схема и структура», блок «Структура склада»):
Дата «с» рядом с полем — начало учета по ячейкам. Остальные настройки карточки — в статье о складах в УТ 11.
Справочник «Складские ячейки» подчинен складу. Адрес — код ячейки до 19 символов, им ячейка и показывается в документах. У ячейки есть область хранения, рабочий участок, типоразмер, порядок обхода и тип: «Хранение», «Приемка», «Отгрузка» или «Архив», куда новый товар не кладут. В КА 2.5 «Отгрузка» делится на варианты без учета и с учетом остатков.
Ячейки создает обработка «Генерация топологии склада» по диапазонам секций, линий, стеллажей, ярусов и позиций — адрес вида A-01-03-2-05. В штрихкоде типовой этикетки («Печать этикеток» в списке ячеек) не адрес, а уникальный идентификатор ячейки длинным числом: после повторной генерации ячеек этикетки печатают заново. Свой штрихкод с адресом делайте из латиницы и цифр — Code 128 кириллицу не кодирует.
Куда класть принятый товар, решает регистр «Правила размещения товаров»: сочетание «складская группа номенклатуры + складская группа упаковок» ведет в область хранения склада с приоритетом. Группа номенклатуры — в карточке номенклатуры, группа упаковок — в карточке упаковки, у товара без упаковки она пустая. Область хранения задает приоритеты размещения и отбора: свободные, монотоварные, смешанные ячейки, отбор «под остаток». Правила и типоразмеры ячеек — «Склад и доставка» → «Настройки и справочники».
Работу кладовщика описывает документ «Отбор (размещение) товаров» с видом операции «Размещение», «Отбор» или «Перемещение» и статусами «Подготовлено» → «В работе» → «Выполнено без ошибок» или «Выполнено с ошибками».
Приходный ордер в статусе «Принят» кладет товар в ячейку зоны приемки, дальше — «Склад и доставка» → «Приемка товаров на склад», закладка «Размещение в ячейки», «Создать задания на размещение». Для отгрузки: расходный ордер «К отбору» → «Отгрузка товаров со склада», закладка «Отбор из ячеек», «Создать задания на отбор».
Остатки ведет регистр «Товары в ячейках», количество в нем — в упаковке строки. Задание «Подготовлено» или «В работе» резервирует товар в ресурсе «К отбору», выполненное двигает «В наличии». Отчеты — «Товары в ячейках», «Размещение товаров на адресном складе», «Отчет по заблокированным ячейкам» («Склад и доставка» → «Отчеты по складу»).
Адресное хранение в 1С УНФ — это ячейка как разрез остатков. Флажок «Ячеистые склады» — «Настройки» → «Еще больше возможностей» → «Склад». Справочник «Ячейки склада» подчинен складу и открывается из его карточки, вложенность любая. Ячейку указывают в накладных, перемещениях, ордерах, оприходовании, списании и инвентаризации, внутри склада товар двигает «Перемещение по ячейкам». Ячейка из карточки номенклатуры подставляется в документы по умолчанию.
Остатки — регистр «Запасы на складах» с измерением «Ячейка» и отчет «Склад», вариант «Остатки по ячейкам». Правил, заданий и блокировок нет, ТСД — пакетно («Склад» → «Сервис» → «Выгрузка товаров в ТСД»). Для заданий и контроля сборки нужны УТ, КА, ERP или отдельная WMS.
Первый запрос показывает, в каких ячейках товар и сколько можно отобрать; проверить его можно в бесплатной консоли запросов.
// УТ 11, КА 2, ERP 2: в каких ячейках склада лежит товар и сколько можно отобрать.
// Параметры: &Склад, &Номенклатура. Регистр хранит количество в упаковке строки,
// поэтому свободный остаток дополнительно переведен в единицы хранения.
ВЫБРАТЬ
Остатки.Ячейка КАК Ячейка,
Остатки.Ячейка.ТипСкладскойЯчейки КАК ТипЯчейки,
Остатки.Ячейка.ОбластьХранения КАК ОбластьХранения,
Остатки.Характеристика КАК Характеристика,
Остатки.Серия КАК Серия,
Остатки.Упаковка КАК Упаковка,
Остатки.ВНаличииОстаток КАК ВНаличии,
Остатки.КОтборуОстаток КАК ПодЗаданиями,
Остатки.ВНаличииОстаток - Остатки.КОтборуОстаток КАК Свободно,
(Остатки.ВНаличииОстаток - Остатки.КОтборуОстаток) * ВЫБОР
КОГДА Остатки.Упаковка = ЗНАЧЕНИЕ(Справочник.УпаковкиЕдиницыИзмерения.ПустаяСсылка)
ТОГДА 1
КОГДА ЕСТЬNULL(Остатки.Упаковка.Знаменатель, 0) = 0
ТОГДА 1
ИНАЧЕ Остатки.Упаковка.Числитель / Остатки.Упаковка.Знаменатель
КОНЕЦ КАК СвободноВЕдиницах,
ЕСТЬNULL(Блокировки.ТипБлокировки, ЗНАЧЕНИЕ(Перечисление.ТипыБлокировокСкладскихЯчеек.ПустаяСсылка)) КАК Блокировка
ИЗ
РегистрНакопления.ТоварыВЯчейках.Остатки(
,
Ячейка.Владелец = &Склад
И Номенклатура = &Номенклатура) КАК Остатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.БлокировкиСкладскихЯчеек КАК Блокировки
ПО Остатки.Ячейка = Блокировки.Ячейка
ГДЕ
Остатки.ВНаличииОстаток > 0
УПОРЯДОЧИТЬ ПО
Остатки.Ячейка.ПорядокОбхода,
Остатки.Ячейка.Код
Вторая проверка — перед запуском и после больших приемок: что лежит в зоне приемки без задания и не разместится без правила, сразу списком.
// УТ 11, КА 2, ERP 2. Серверный общий модуль расширения или модуль объекта обработки.
// Товар, который лежит в зоне приемки без задания и не разместится: для его сочетания
// «складская группа номенклатуры + складская группа упаковок» на складе нет правила.
// Помещение - пустая ссылка, если склад не разбит на помещения.
Функция ТоварыБезПравилРазмещения(Склад, Помещение) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Помещение", Помещение);
Запрос.Текст =
"ВЫБРАТЬ
| Остатки.Номенклатура КАК Номенклатура,
| Остатки.Упаковка КАК Упаковка,
| Остатки.Номенклатура.СкладскаяГруппа КАК ГруппаНоменклатуры,
| ЕСТЬNULL(Остатки.Упаковка.СкладскаяГруппа,
| ЗНАЧЕНИЕ(Справочник.СкладскиеГруппыУпаковок.ПустаяСсылка)) КАК ГруппаУпаковок,
| Остатки.ВНаличииОстаток - Остатки.КОтборуОстаток КАК БезЗадания
|ПОМЕСТИТЬ ВтЗонаПриемки
|ИЗ
| РегистрНакопления.ТоварыВЯчейках.Остатки(
| ,
| Ячейка.Владелец = &Склад
| И Ячейка.Помещение = &Помещение
| И Ячейка.ТипСкладскойЯчейки = ЗНАЧЕНИЕ(Перечисление.ТипыСкладскихЯчеек.Приемка)) КАК Остатки
|ГДЕ
| Остатки.ВНаличииОстаток - Остатки.КОтборуОстаток > 0
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура КАК Номенклатура,
| Товары.Упаковка КАК Упаковка,
| Товары.ГруппаНоменклатуры КАК ГруппаНоменклатуры,
| Товары.ГруппаУпаковок КАК ГруппаУпаковок,
| СУММА(Товары.БезЗадания) КАК Количество
|ИЗ
| ВтЗонаПриемки КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПравилаРазмещенияТоваровВЯчейках КАК Правила
| ПО (Правила.Склад = &Склад)
| И (Правила.Помещение = &Помещение)
| И Товары.ГруппаНоменклатуры = Правила.СкладскаяГруппаНоменклатуры
| И Товары.ГруппаУпаковок = Правила.СкладскаяГруппаУпаковок
|ГДЕ
| Правила.ОбластьХранения ЕСТЬ NULL
|
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура,
| Товары.Упаковка,
| Товары.ГруппаНоменклатуры,
| Товары.ГруппаУпаковок
|
|УПОРЯДОЧИТЬ ПО
| ГруппаНоменклатуры,
| Номенклатура";
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
В УНФ сначала ищут остатки без ячейки:
// УНФ 3.0: остатки склада по ячейкам. Строки с пустой ячейкой - товар, который
// пришел до включения «Ячеистых складов» или оформлен без ячейки. Параметр: &Склад.
ВЫБРАТЬ
Остатки.Организация КАК Организация,
Остатки.Ячейка КАК Ячейка,
Остатки.Номенклатура КАК Номенклатура,
Остатки.Характеристика КАК Характеристика,
Остатки.КоличествоОстаток КАК Количество,
Остатки.Номенклатура.Ячейка КАК ЯчейкаПоУмолчанию,
ВЫБОР
КОГДА Остатки.Ячейка = ЗНАЧЕНИЕ(Справочник.Ячейки.ПустаяСсылка)
ТОГДА ИСТИНА
ИНАЧЕ ЛОЖЬ
КОНЕЦ КАК БезЯчейки
ИЗ
РегистрНакопления.ЗапасыНаСкладах.Остатки(, СтруктурнаяЕдиница = &Склад) КАК Остатки
ГДЕ
Остатки.КоличествоОстаток <> 0
УПОРЯДОЧИТЬ ПО
БезЯчейки УБЫВ,
Ячейка,
Номенклатура
Обзор типовых вариантов — в статье о ТСД в 1С. В УТ 11.5, КА 2.5 и ERP 2.5 есть «Мобильное рабочее место кладовщика» для мобильного клиента 1С: приемка, размещение, отбор, перемещение, пересчет, блокировки. В УТ 11.4 его нет — там «Рабочее место работника склада» с формами под экраны от 240×320 до 480×640 и SOAP-сервис WMSMobileClientExchange.
Свой код нужен, когда на складе работает приложение ТСД стороннего разработчика или своя WMS. Схема — HTTP-сервис в расширении поверх документа «Отбор (размещение) товаров». Ниже — функции общего модуля расширения СкладТСД и модуль сервиса; создание и публикация — в статье об HTTP-сервисе 1С.
// УТ 11, КА 2, ERP 2. Общий модуль расширения СкладТСД, флажок «Сервер».
// Ячейка по данным со сканера ТСД: штрихкод типовой этикетки (длинное число -
// уникальный идентификатор ячейки) или адрес, набранный вручную.
// ДляОтбора: Истина - из ячейки берут товар, Ложь - кладут.
// Возвращает структуру: Ячейка, Адрес, ТипЯчейки, ТипБлокировки, Ошибка ("" - ячейка годится).
Функция ЯчейкаПоДаннымСканера(Склад, Знач Помещение, Знач ДанныеСканера, ДляОтбора = Ложь) Экспорт
Результат = Новый Структура("Ячейка, Адрес, ТипЯчейки, ТипБлокировки, Ошибка");
Результат.Ошибка = "";
ДанныеСканера = СокрЛП(ДанныеСканера);
Если ПустаяСтрока(ДанныеСканера) Тогда
Результат.Ошибка = НСтр("ru = 'Пустой штрихкод.'");
Возврат Результат;
КонецЕсли;
Если Не ЗначениеЗаполнено(Помещение) Тогда
Помещение = Справочники.СкладскиеПомещения.ПустаяСсылка();
КонецЕсли;
// Для штрихкода этикетки типовая функция вернет ссылку, для адреса - пустой массив.
Менеджеры = Новый Массив;
Менеджеры.Добавить(Справочники.СкладскиеЯчейки.ПустаяСсылка());
ПоШтрихкоду = ШтрихкодированиеПечатныхФорм.ПолучитьСсылкуПоШтрихкодуТабличногоДокумента(
ДанныеСканера, Менеджеры);
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ссылки", ПоШтрихкоду);
Запрос.УстановитьПараметр("Адрес", ДанныеСканера);
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Ячейки.Ссылка КАК Ячейка,
| Ячейки.Код КАК Адрес,
| Ячейки.ТипСкладскойЯчейки КАК ТипЯчейки,
| Ячейки.Владелец КАК Склад,
| Ячейки.Помещение КАК Помещение,
| Ячейки.ЭтоГруппа КАК ЭтоГруппа,
| Ячейки.ПометкаУдаления КАК ПометкаУдаления,
| ЕСТЬNULL(Блокировки.ТипБлокировки,
| ЗНАЧЕНИЕ(Перечисление.ТипыБлокировокСкладскихЯчеек.ПустаяСсылка)) КАК ТипБлокировки,
| ВЫБОР
| КОГДА Ячейки.Ссылка В (&Ссылки)
| ТОГДА 0
| ИНАЧЕ 1
| КОНЕЦ КАК Порядок
|ИЗ
| Справочник.СкладскиеЯчейки КАК Ячейки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.БлокировкиСкладскихЯчеек КАК Блокировки
| ПО Ячейки.Ссылка = Блокировки.Ячейка
|ГДЕ
| (Ячейки.Ссылка В (&Ссылки)
| ИЛИ Ячейки.Владелец = &Склад
| И Ячейки.Код = &Адрес)
|
|УПОРЯДОЧИТЬ ПО
| Порядок";
Выборка = Запрос.Выполнить().Выбрать();
Если Не Выборка.Следующий() Тогда
Результат.Ошибка = СтрШаблон(НСтр("ru = 'Ячейка ""%1"" не найдена.'"), ДанныеСканера);
Возврат Результат;
КонецЕсли;
ЗаполнитьЗначенияСвойств(Результат, Выборка, "Ячейка, Адрес, ТипЯчейки, ТипБлокировки");
Блокировки = Перечисления.ТипыБлокировокСкладскихЯчеек;
Если Выборка.ЭтоГруппа Или Выборка.ПометкаУдаления Тогда
Результат.Ошибка = СтрШаблон(НСтр("ru = '%1 - группа ячеек или ячейка помечена на удаление.'"), Выборка.Адрес);
ИначеЕсли Выборка.Склад <> Склад Или Выборка.Помещение <> Помещение Тогда
Результат.Ошибка = СтрШаблон(НСтр("ru = 'Ячейка %1 с другого склада или помещения.'"), Выборка.Адрес);
ИначеЕсли Выборка.ТипБлокировки = Блокировки.Полная
Или ДляОтбора И Выборка.ТипБлокировки = Блокировки.Отбор
Или Не ДляОтбора И Выборка.ТипБлокировки = Блокировки.Размещение Тогда
Результат.Ошибка = СтрШаблон(НСтр("ru = 'Ячейка %1 заблокирована: %2.'"), Выборка.Адрес, Выборка.ТипБлокировки);
ИначеЕсли Не ДляОтбора И Выборка.ТипЯчейки = Перечисления.ТипыСкладскихЯчеек.Архив Тогда
Результат.Ошибка = СтрШаблон(НСтр("ru = 'Ячейка %1 архивная, класть в нее нельзя.'"), Выборка.Адрес);
КонецЕсли;
Возврат Результат;
КонецФункции
// Общий модуль СкладТСД, продолжение.
// Задания склада (помещения) в статусе «Подготовлено»: назначенные исполнителю и ничьи.
// Возвращает массив структур из строк, чисел и булевых значений - его можно сразу
// записать в JSON. Типовой список еще отбирает задания по рабочим участкам
// исполнителя - добавьте такое условие, если участки на складе используются.
Функция ЗаданияДляТСД(Склад, Помещение, Исполнитель) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Помещение", Помещение);
Запрос.УстановитьПараметр("Исполнитель", Исполнитель);
Запрос.Текст =
"ВЫБРАТЬ
| Задания.Ссылка КАК Ссылка,
| Задания.Номер КАК Номер,
| Задания.Дата КАК Дата,
| Задания.ВидОперации КАК ВидОперации,
| ПРЕДСТАВЛЕНИЕ(Задания.РабочийУчасток) КАК РабочийУчасток,
| ВЫБОР
| КОГДА Задания.Исполнитель = &Исполнитель
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК Мое,
| ВЫБОР
| КОГДА Задания.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОперацийОтбораРазмещенияТоваров.Размещение)
| ТОГДА Задания.ВесРазмещение
| ИНАЧЕ Задания.ВесОтбор
| КОНЕЦ КАК Вес
|ИЗ
| Документ.ОтборРазмещениеТоваров КАК Задания
|ГДЕ
| Задания.Проведен
| И Задания.Склад = &Склад
| И Задания.Помещение = &Помещение
| И Задания.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыОтборовРазмещенийТоваров.Подготовлено)
| И Задания.Исполнитель В (&Исполнитель, ЗНАЧЕНИЕ(Справочник.Пользователи.ПустаяСсылка))
|
|УПОРЯДОЧИТЬ ПО
| Мое УБЫВ,
| Дата";
Задания = Новый Массив;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Задание = Новый Структура;
Задание.Вставить("id", XMLСтрока(Выборка.Ссылка));
Задание.Вставить("number", Выборка.Номер);
Задание.Вставить("date", XMLСтрока(Выборка.Дата));
Задание.Вставить("operation", XMLСтрока(Выборка.ВидОперации));
Задание.Вставить("area", Выборка.РабочийУчасток);
Задание.Вставить("mine", Выборка.Мое);
Задание.Вставить("weight", Выборка.Вес);
Задания.Добавить(Задание);
КонецЦикла;
Возврат Задания;
КонецФункции
// Берет задание в работу так же, как типовое рабочее место: исполнитель, статус
// «В работе», дата начала, проведение. Блокировка и повторная проверка статуса
// не дают двум кладовщикам взять одно задание. Возвращает текст ошибки или "".
Функция ВзятьЗаданиеВРаботу(Задание, Исполнитель) Экспорт
Ошибка = "";
НачатьТранзакцию();
Попытка
Блокировка = Новый БлокировкаДанных;
ЭлементБлокировки = Блокировка.Добавить("Документ.ОтборРазмещениеТоваров");
ЭлементБлокировки.УстановитьЗначение("Ссылка", Задание);
Блокировка.Заблокировать();
ЗаданиеОбъект = Задание.ПолучитьОбъект();
Если ЗаданиеОбъект = Неопределено Тогда
Ошибка = НСтр("ru = 'Задание не найдено.'");
ИначеЕсли Не ЗаданиеОбъект.Проведен Тогда
Ошибка = СтрШаблон(НСтр("ru = 'Задание %1 не проведено.'"), ЗаданиеОбъект.Номер);
ИначеЕсли ЗаданиеОбъект.Статус <> Перечисления.СтатусыОтборовРазмещенийТоваров.Подготовлено Тогда
Ошибка = СтрШаблон(НСтр("ru = 'Задание %1 уже в работе или выполнено.'"), ЗаданиеОбъект.Номер);
ИначеЕсли ЗначениеЗаполнено(ЗаданиеОбъект.Исполнитель) И ЗаданиеОбъект.Исполнитель <> Исполнитель Тогда
Ошибка = СтрШаблон(НСтр("ru = 'Задание %1 назначено другому работнику.'"), ЗаданиеОбъект.Номер);
Иначе
ЗаданиеОбъект.Исполнитель = Исполнитель;
ЗаданиеОбъект.Статус = Перечисления.СтатусыОтборовРазмещенийТоваров.ВРаботе;
ЗаданиеОбъект.ДатаНачалаВыполнения = ТекущаяДатаСеанса();
ЗаданиеОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Ошибка = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации("ТСД.ВзятьЗаданиеВРаботу", УровеньЖурналаРегистрации.Ошибка,
Метаданные.Документы.ОтборРазмещениеТоваров, Задание, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Возврат Ошибка;
КонецФункции
// Модуль HTTP-сервиса расширения. Шаблоны URL:
// /tasks/{warehouse} - GET, список заданий; помещение - параметр ?room=<идентификатор>;
// /task/{id}/take - POST, взять задание в работу.
// ТСД подключается своим пользователем 1С - он и становится исполнителем.
Функция ЗаданияGET(Запрос)
Попытка
Склад = Справочники.Склады.ПолучитьСсылку(
Новый УникальныйИдентификатор(Запрос.ПараметрыURL["warehouse"]));
Помещение = Справочники.СкладскиеПомещения.ПустаяСсылка();
ИдентификаторПомещения = Запрос.ПараметрыЗапроса.Получить("room");
Если ЗначениеЗаполнено(ИдентификаторПомещения) Тогда
Помещение = Справочники.СкладскиеПомещения.ПолучитьСсылку(
Новый УникальныйИдентификатор(ИдентификаторПомещения));
КонецЕсли;
Исключение
Возврат ОтветJSON(400, Новый Структура("error", "Ожидается идентификатор склада и помещения."));
КонецПопытки;
Задания = СкладТСД.ЗаданияДляТСД(Склад, Помещение, Пользователи.ТекущийПользователь());
Возврат ОтветJSON(200, Задания);
КонецФункции
Функция ЗаданиеВзятьPOST(Запрос)
Попытка
Задание = Документы.ОтборРазмещениеТоваров.ПолучитьСсылку(
Новый УникальныйИдентификатор(Запрос.ПараметрыURL["id"]));
Исключение
Возврат ОтветJSON(400, Новый Структура("error", "Ожидается идентификатор задания."));
КонецПопытки;
Ошибка = СкладТСД.ВзятьЗаданиеВРаботу(Задание, Пользователи.ТекущийПользователь());
Если ЗначениеЗаполнено(Ошибка) Тогда
Возврат ОтветJSON(409, Новый Структура("error", Ошибка));
КонецЕсли;
Возврат ОтветJSON(200, Новый Структура("result", "ok"));
КонецФункции
Функция ОтветJSON(КодСостояния, Данные)
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();
ЗаписатьJSON(Запись, Данные);
Ответ = Новый HTTPСервисОтвет(КодСостояния);
Ответ.Заголовки.Вставить("Content-Type", "application/json; charset=utf-8");
Ответ.УстановитьТелоИзСтроки(Запись.Закрыть(), КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
Возврат Ответ;
КонецФункции
Завершение задания с фактическими количествами не пишите заново: в 11.4 его делает ЗавершитьВыполнениеСкладскогоЗадания модуля РабочееМестоРаботникаСкладаПрограммныйИнтерфейс, ее же вызывает операция CompleteJob типового веб-сервиса. Сигнатура меняется: в УТ 11.4 — список параметров, в КА 2.5 — одна структура.
Ячейка.Владелец = &Склад — в регистре «Товары в ячейках» нет склада, отбор идет через владельца ячейки.ВНаличииОстаток - КОтборуОстаток — свободный остаток; эту же разность проверяет проведение, когда пишет «Превышен свободный остаток в ячейке».Числитель / Знаменатель — коэффициент упаковки: в регистре упаковка заполнена, только если это упаковка, а не единица измерения.ПолучитьСсылкуПоШтрихкодуТабличногоДокумента превращает число с этикетки в идентификатор, для набранного адреса вернет пустой массив — тогда ищем по коду, он уникален в пределах склада. Склад и помещение сверяются отдельно: по идентификатору найдется ячейка любого склада.ВзятьЗаданиеВРаботу: блокировка и повторная проверка статуса в транзакции не дают двум кладовщикам взять одно задание. Исполнитель — пользователь сеанса: у каждого ТСД свой пользователь 1С.Порядок, в котором адресное хранение на складе в 1С запускают без остановки отгрузок:
Механизм один, отличия дает релиз: в КА 2.5 и ERP 2.5 есть мобильное рабочее место кладовщика и тип ячейки «Отгрузка (с учетом остатков)», в УТ 11.4 их нет.
Можно: задания печатаются, кладовщик работает с листом, оператор отмечает выполнение в «Приемке товаров на склад» и «Отгрузке товаров со склада». ТСД убирает ручной ввод и ловит ошибки при сканировании.
С выбранной даты включите ордерную схему и ячейки, а остатки перенесите документом «Ввод начальных остатков» с типом операции «Переход на использование адресного хранения остатков»: товар окажется в зоне приемки. Задания на отбор берут товар из ячеек хранения, поэтому разместите его до первых отгрузок.
Запуск адресного склада — это десяток справочников, перевод остатков и обучение кладовщиков, а доработка под ТСД затрагивает проведение складских документов. Нужен свой сервис для терминалов или правила отбора под ваш маршрут — опишите задачу в разделе услуг по доработке 1С или разместите задачу: оценка бесплатная, ответ в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.