В современных производственных процессах часто возникают ситуации, когда стандартных инструментов 1С:ERP, таких как подбор по свойствам или использование простых формул, недостаточно для автоматического выбора нужного материала или характеристики. Например, если выбор конкретной комплектующей зависит от текущих остатков на складе, срока годности сырья или сложных математических зависимостей от параметров выпускаемого изделия. Для таких случаев в конфигурации предусмотрена опция «определяется по алгоритму».
В этой статье мы подробно разберем, как создать расширение для реализации собственного алгоритма автовыбора, проанализируем структуру необходимых функций и посмотрим на практические примеры кода.
Механизм автовыбора в ресурсных спецификациях позволяет системе автоматически подставлять нужную номенклатуру или характеристику в документы производства (Заказы на производство, Этапы производства). Когда мы устанавливаем флаг «определяется по алгоритму», мы фактически передаем управление системе исполнения кода. Рассмотрим основные сценарии, где это необходимо:
Для реализации алгоритма нам потребуется создать расширение конфигурации. Основная задача — сообщить системе, что у нас есть новая функция, которую можно выбрать в интерфейсе спецификации. Рассмотрим, как это сделать. В ERP 2.4 штатным местом для регистрации подобных алгоритмов является общий модуль ПроизводствоАвтовыборХарактеристикиПереопределяемый (в некоторых версиях может потребоваться расширение модуля УправлениеДаннымиОбИзделиях).
Проанализируем структуру функции, которая отвечает за список доступных алгоритмов. Нам нужно использовать аннотацию &Вместо для функции, возвращающей массив описаний функций автовыбора.
&Вместо("ОписаниеФункцийАвтовыбораХарактеристики")
Функция ОписаниеФункцийАвтовыбораХарактеристикиРасширенный()
МассивФункций = ПродолжитьВызов(); // Получаем стандартные функции, если они есть
СтруктураАвтовыбора = Новый Структура;
// ИмяФункции — это название экспортной функции, которую мы напишем позже
СтруктураАвтовыбора.Вставить("ИмяФункции", "МойАлгоритмПодбораХарактеристики");
// ИмяМодуля — имя общего модуля в расширении, где лежит наша функция
СтруктураАвтовыбора.Вставить("ИмяМодуля", "ПР_ПроизводствоАвтовыборСервер");
// Представление — то, что увидит пользователь в выпадающем списке в спецификации
СтруктураАвтовыбора.Вставить("Представление", "Подбор по остаткам и приоритету");
МассивФункций.Добавить(СтруктураАвтовыбора);
Возврат МассивФункций;
КонецФункции
Теперь создадим в нашем расширении общий модуль (например, с именем ПР_ПроизводствоАвтовыборСервер). Важно, чтобы у модуля стояли флаги «Сервер» и «Вызов сервера». В этом модуле мы опишем саму логику выбора.
Функция должна принимать один параметр — Параметры. Это структура, которую система ERP автоматически заполняет данными о контексте производства. Проанализируем, что обычно содержится в этой структуре:
Номенклатура — ссылка на готовое изделие, которое мы производим.Характеристика — характеристика этого изделия (если используется).Спецификация — ссылка на саму спецификацию, по которой идет расчет.Дата — дата, на которую актуален подбор (например, дата начала этапа).Свойства — коллекция дополнительных реквизитов изделия.Рассмотрим пример функции, которая ищет подходящую характеристику по коду:
Функция МойАлгоритмПодбораХарактеристики(Параметры) Экспорт
// Инициализируем переменную возврата
ХарактеристикаСсылка = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка();
// Пример логики: анализируем номенклатуру выпускаемого изделия
Если Параметры.Номенклатура.ВидНоменклатуры.ИспользоватьХарактеристики Тогда
// Здесь мы можем выполнить запрос к остаткам или свойствам
// Для примера просто найдем характеристику по определенному шаблону
ПоискКода = "Цвет_" + СокрЛП(Параметры.Номенклатура.Код);
ХарактеристикаСсылка = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(ПоискКода);
КонецЕсли;
// Функция ДОЛЖНА вернуть ссылку на характеристику или номенклатуру (в зависимости от задачи)
Возврат ХарактеристикаСсылка;
КонецФункции
После того как мы применили расширение, выполним следующие действия в интерфейсе программы:
Выясним причины, по которым алгоритм может не работать или работать некорректно:
1. Контекст вызова: Помните, что код выполняется в момент разузлования. Это происходит, когда вы нажимаете кнопку «Сформировать этапы» или заполняете материалы в Заказе на производство. В самой спецификации при нажатии кнопки «Проверить» алгоритм может не срабатывать, так как нет контекста конкретного заказа.
2. Производительность: Поскольку производство может включать сотни строк материалов, функция автовыбора будет вызываться для каждой строки. Крайне не рекомендуется выполнять тяжелые запросы внутри функции без кэширования. Проанализируем ситуацию: если у вас 100 материалов и для каждого идет запрос к остаткам, формирование этапов замедлится в разы. Используйте ПараметрыСеанса или временные таблицы для предварительного получения данных.
3. Возвращаемое значение: Если ваша функция возвращает Неопределено, система может выдать ошибку при проведении производственных документов, так как обязательное поле останется незаполненным. Всегда предусматривайте «значение по умолчанию».
4. Версии ERP: Начиная с версии 2.5, архитектура модулей производства изменилась. Если вы переходите на 2.5, ищите точки расширения в модулях с префиксом ПроизводствоАвтовыбор.... Однако общий принцип с регистрацией через массив структур остается прежним.
Таким образом, использование алгоритмов в расширении — это самый гибкий способ настройки 1С:ERP под уникальные требования предприятия, позволяющий автоматизировать даже самые сложные правила подбора ТМЦ.