При разработке расширений для типовых конфигураций, таких как Управление торговлей 11, часто возникает необходимость использовать собственные данные для стандартных бизнес-процессов. Одна из таких задач — заполнение обеспечения по количеству, указанному в добавленной колонке КоличествоТСД, вместо стандартной колонки Количество. Разберем, почему типовой механизм не позволяет это сделать «в лоб» и как правильно реализовать такое решение.
Типовые процедуры, отвечающие за расчет обеспечения, такие как ТаблицаЗаполнениеОбеспечения из общего модуля ОбеспечениеСервер, спроектированы для работы с жестко заданной структурой табличной части Товары. Процедура ожидает наличие колонки Количество и выполняет с ней расчеты, учитывая резервы, обособление и остатки на складах. Передать туда произвольные данные невозможно, так как процедура работает непосредственно с объектом документа.
Так как модификация типового кода нежелательна (а зачастую и невозможна без нарушения логики), самым эффективным способом является временная подмена данных. Суть метода заключается в том, чтобы на короткое время подставить значения из КоличествоТСД в Количество, запустить типовой расчет, а затем вернуть исходные значения обратно.
Для реализации этого метода следуйте по шагам:
Товары вспомогательную колонку (например, КоличествоИсходное), если вы не хотите рисковать потерей данных в основной колонке.Количество во вспомогательную колонку или массив.КоличествоТСД в колонку Количество для всех необходимых строк.ОбеспечениеСервер.ТаблицаЗаполнениеОбеспечения.Количество из сохраненного «бэкапа».Рассмотрим структуру кода, который необходимо реализовать внутри вашего расширения:
// 1. Сохраняем исходные данные
Для Каждого СтрокаТовары Из Объект.Товары Цикл
СтрокаТовары.КоличествоИсходное = СтрокаТовары.Количество;
СтрокаТовары.Количество = СтрокаТовары.КоличествоТСД;
КонецЦикла;
// 2. Вызываем типовой механизм
Таблица = ОбеспечениеСервер.ТаблицаЗаполнениеОбеспечения(МассивСтрок, Объект, Объект.Товары, ПараметрыЗаполнения, ПараметрыДокумента);
// 3. Восстанавливаем данные
Для Каждого СтрокаТовары Из Объект.Товары Цикл
СтрокаТовары.Количество = СтрокаТовары.КоличествоИсходное;
КонецЦикла;
При использовании данного подхода важно учитывать следующие аспекты:
ТаблицаЗаполнениеОбеспечения. После того как процедура вернет структуру с расчетами, вы можете программно изменить значения в полученной таблице значений, подставив логику КоличествоТСД, прежде чем передавать ее в Документы.ЗаказКлиента.ЗаполнитьВариантОбеспечения. Этот метод более безопасен с точки зрения влияния на другие алгоритмы (скидки, налоги), так как не меняет сам объект документа до фиксации результата.&Вместо для функции ТаблицаЗаполнениеОбеспечения. Это позволит вам контролировать процесс заполнения, не затрагивая код основного модуля, что облегчит последующие обновления конфигурации 1С.Таким образом, комбинируя методы временной подмены или пост-обработки результата в расширении, вы сможете добиться корректного заполнения обеспечения, опираясь на ваши специализированные данные КоличествоТСД, при этом сохраняя работоспособность всех типовых механизмов Управления торговлей 11.