Вводные
1. Требуется при загрузке из внешней системы поставить товар в резерв
2. В лоб заполнить все строки "В резерв" и провести документ через "попытка Исключение" не подходит потому что специфика клиента разрешает частичный резерв при создании заказа из внешней системы.
3. Процедуры распределения на уровне объекта нет, вызывается из формы и используются реквизиты формы.
Порядок работы
Работа от формы документа заказ клиента
При нажатии на кнопку "Заполнить обеспечение"
1. Проверяется корректность заполнения табличной части (ТЧ) с помощью ОбеспечениеКлиент.ПроверитьЗаполнение(...)
2. Открывается форма "ИсполнениеЗаказа" в которой выбирается порядок обеспечения
3. Форма возвращает структуру
ПереченьВариантов = Новый Массив();
...
Результат = Новый Структура("ПереченьВариантов, ЗаполнятьЦелымиУпаковками");
Результат.ПереченьВариантов = ПереченьВариантов;
Результат.ЗаполнятьЦелымиУпаковками = ЗаполнятьЦелымиУпаковками;
4. В форме заказа данные поступают в ОбработкаВыбора() и перенаправляются в процедуру ЗаполнитьОбеспечениеВУстановленномПорядке()
5. Формируется таблица распределения с помощью Таблица = ОбеспечениеСервер.ТаблицаЗаполнениеОбеспечения()
6. Данные таблицы переносятся в табличную часть документа с помощью Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения()
Проблема в том что процедуры используют "Элементы.Товары.ВыделенныеСтроки" и реквизиты которые находятся только на форме, список в ЗависимыеРеквизиты().
Подготовка данных
ТЗ ТаблицаЗаполнениеОбеспечения
1. Создается по описанию ОбеспечениеСервер.ПутиКДаннымПоУмолчанию() с добавлением колонки "Упаковка", как и структура "Хранилище" которая используется для предварительной загрузки и проверки данных.
2. Получает данные из ТаблицаТовары.НайтиПоИдентификатору(Идентификатор);
3. Заполняет добавленную строку через ОбеспечениеКлиентСервер.ЗаполнитьЗначенияСвойствСРазличиемИмен()
4. Дополняет поле Идентификатор = СтрокаТовары.ПолучитьИдентификатор(), если его не заполнить свернет с строки при обработке.
ТЗ "ОтборОформлено" создается по паре "Ссылка, КодСтроки", заполняется выделенными строками, количество в выделенных строках обнуляется.
ТЗ "ОформитьПоНакладным" - Таблица с полями "Ссылка", "КодСтроки", "Количество". Для каждой пары Заказ-КодСтроки содержит оформленное накладными количество.
ТЗ ТаблицаНевыделенныеСтроки так же переносится из табличной части с конвертацией с фильтром НЕ Количество = 0, а для выделенных строк оно было обнулено выше.
После этого перебирая ТаблицаВыделенныеСтроки восстанавливают количество в основной таблице, странно при том что можно было в один заход распределить по двум таблицам.
Обработка
После подготовки данные передаются в ОбеспечениеСервер.ТаблицаЗаполнениеОбеспеченияУниверсальный(), результатом работы которого является "ТаблицаЗначений - таблица, с полями Идентификатор, ВариантОбеспечения, ДатаОтгрузки, Количество, Склад. Содержит варианты обеспечения для заполнения."
Подготовка данных и обработка в обработке "Состояние обеспечения"
ПараметрыЗаполнения = МенеджерДокумента.ПараметрыВыбораОбеспечения(Документ.Статус);
ТаблицаОбеспечения = ОбеспечениеСервер.ТаблицаЗаполнениеОбеспеченияДокумента(
Документ, ПереченьВариантов, ПараметрыЗаполнения, ИндексыСтрок);
где
ИндексыСтрок.Добавить(СтрокаТовары.НомерСтроки - 1);
ПереченьВариантов = Новый Массив();
Если ИспользоватьСоСклада Тогда
ПереченьВариантов.Добавить(Перечисления.ВариантыОбеспечения.СоСклада);
КонецЕсли;
Перенос результатов в документ
Выполняется Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения()
При вызове из формы вызывается с указанием формы.
ТекстОповещения = Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения(
Объект, ЭтаФорма, "СтрокиТовары", Таблица, ПараметрыУказанияСерий, ЗависимыеРеквизиты());
при вызове из обработки СостояниеОбеспечения вызывается без указания формы.
МенеджерДокумента.ЗаполнитьВариантОбеспечения(Документ, Неопределено, "ИндексыСтрок", ТаблицаОбеспечения);
Документ.ДополнительныеСвойства.Вставить("КонтролироватьОбеспечение", Ложь);
Попытка
Документ.Записать(РежимЗаписиДокумента.Проведение);
Пост обработка на уровне формы
Вызывается
СкладыСервер.ПриИзмененииСкладаВТабличнойЧасти(Объект.Товары, ТаблицаСкладов, СкладГруппа);
РассчитатьИтоговыеПоказателиЗаказа(ЭтаФорма);
Итог
Если пользоваться глобальным поиском и обращать внимание на флаги используемые в общих модулях, то можно найти решение проблемы.
Начав "раскапывать" со стороны формы и думая как переписывать код исполняющийся на клиенте нашел решение которое можно запустить на сервере.
С уважением к разработчикам типовых решений.
Благодарю за внимание.