Каталог решений - Разбор механизма заполнения вариантов обеспечения в документе Заказ клиента конфигурации УТ 11.4

Разбор механизма заполнения вариантов обеспечения в документе Заказ клиента конфигурации УТ 11.4

Разбор механизма заполнения вариантов обеспечения в документе Заказ клиента конфигурации УТ 11.4

В наличии

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

Категория:

Описание

Вводные

1. Требуется при загрузке из внешней системы поставить товар в резерв

2. В лоб заполнить все строки "В резерв" и провести документ через "попытка Исключение" не подходит потому что специфика клиента разрешает частичный резерв при создании заказа из внешней системы.

3. Процедуры распределения на уровне объекта нет, вызывается из формы и используются реквизиты формы.

 

Порядок работы

 

Работа от формы документа заказ клиента

При нажатии на кнопку "Заполнить обеспечение"

1. Проверяется корректность заполнения табличной части (ТЧ) с помощью ОбеспечениеКлиент.ПроверитьЗаполнение(…)

2. Открывается форма "ИсполнениеЗаказа"  в которой выбирается порядок обеспечения

3. Форма возвращает структуру

ПереченьВариантов = Новый Массив();
...
Результат = Новый Структура("ПереченьВариантов, ЗаполнятьЦелымиУпаковками");
Результат.ПереченьВариантов = ПереченьВариантов;
Результат.ЗаполнятьЦелымиУпаковками = ЗаполнятьЦелымиУпаковками;

4. В форме заказа данные поступают в ОбработкаВыбора() и перенаправляются в процедуру ЗаполнитьОбеспечениеВУстановленномПорядке()

5. Формируется таблица распределения с помощью Таблица = ОбеспечениеСервер.ТаблицаЗаполнениеОбеспечения()

6. Данные таблицы переносятся в табличную часть документа с помощью Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения()

Проблема в том что процедуры используют "Элементы.Товары.ВыделенныеСтроки" и реквизиты которые находятся только на форме, список в ЗависимыеРеквизиты().

 

Подготовка данных

ТЗ ТаблицаЗаполнениеОбеспечения

1. Создается по описанию ОбеспечениеСервер.ПутиКДаннымПоУмолчанию() с добавлением колонки "Упаковка", как и структура "Хранилище" которая используется для предварительной загрузки и проверки данных.

2. Получает данные из ТаблицаТовары.НайтиПоИдентификатору(Идентификатор);

3. Заполняет добавленную строку через ОбеспечениеКлиентСервер.ЗаполнитьЗначенияСвойствСРазличиемИмен()

4. Дополняет поле Идентификатор = СтрокаТовары.ПолучитьИдентификатор(), если его не заполнить свернет с строки при обработке.

ТЗ "ОтборОформлено" создается по паре "Ссылка, КодСтроки", заполняется выделенными строками, количество в выделенных строках обнуляется.

ТЗ "ОформитьПоНакладным" — Таблица с полями "Ссылка", "КодСтроки", "Количество". Для каждой пары Заказ-КодСтроки содержит оформленное накладными количество.

ТЗ ТаблицаНевыделенныеСтроки так же переносится из табличной части с конвертацией с фильтром НЕ Количество = 0, а для выделенных строк оно было обнулено выше.

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

 

Обработка

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

 

Подготовка данных и обработка в обработке "Состояние обеспечения"

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

где

ИндексыСтрок.Добавить(СтрокаТовары.НомерСтроки - 1);

ПереченьВариантов = Новый Массив();
Если ИспользоватьСоСклада Тогда
	ПереченьВариантов.Добавить(Перечисления.ВариантыОбеспечения.СоСклада);
КонецЕсли;

 

Перенос результатов в документ

Выполняется Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения()

При вызове из формы вызывается с указанием формы.

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

при вызове из обработки СостояниеОбеспечения вызывается без указания формы.

МенеджерДокумента.ЗаполнитьВариантОбеспечения(Документ, Неопределено, "ИндексыСтрок", ТаблицаОбеспечения);
Документ.ДополнительныеСвойства.Вставить("КонтролироватьОбеспечение", Ложь);
Попытка
	Документ.Записать(РежимЗаписиДокумента.Проведение);

 

Пост обработка на уровне формы

Вызывается
 

СкладыСервер.ПриИзмененииСкладаВТабличнойЧасти(Объект.Товары, ТаблицаСкладов, СкладГруппа);

РассчитатьИтоговыеПоказателиЗаказа(ЭтаФорма);

 

Итог

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

Начав "раскапывать" со стороны формы и думая как переписывать код исполняющийся на клиенте нашел решение которое можно запустить на сервере.

 

С уважением к разработчикам типовых решений.

Благодарю за внимание.

has been added to your cart:
Оформление заказа