Как массово заменить номенклатуру в ресурсных спецификациях 1С:ERP

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

В процессе жизненного цикла изделия часто возникает ситуация, когда один материал (например, определенный тип гайки или болта) необходимо заменить на другой во всех выпускаемых изделиях. В 1С:ERP Управление предприятием 2 ресурсные спецификации являются «фундаментом» производственного учета, и некорректное внесение изменений в них может привести к искажению себестоимости и проблемам в закрытии месяца. Рассмотрим подробно, как решить задачу замены номенклатуры, сохранив при этом историческую достоверность данных.

Методологический подход: замена через создание новых версий

Прежде чем приступать к массовым корректировкам, разберем базовый принцип работы 1С:ERP. Спецификации имеют жизненный цикл, определяемый статусами: В разработке, Действует и Закрыта. По правилам системы, нельзя просто зайти в действующую спецификацию и поменять в ней состав, так как на её основании уже могут быть сформированы заказы на производство.

Правильный путь — создание новой версии спецификации. Рассмотрим этот алгоритм:

  1. Создаем копию текущей спецификации.
  2. В новой версии производим замену Номенклатуры (например, «Гайка 1» на «Гайка 2»).
  3. Устанавливаем новой спецификации статус Действует, а старой — статус Закрыта.

Этот способ идеален, если спецификаций немного. Если же их сотни, как упоминается в обсуждении, ручной метод становится трудозатратным, и нам потребуются инструменты автоматизации.

Использование механизма «Разрешение на замену материалов»

Проанализируем ситуацию, когда замена номенклатуры носит временный характер или вызвана отсутствием конкретной позиции на складе. В этом случае менять саму спецификацию не обязательно. Для этого в системе предусмотрен объект Разрешение на замену материалов.

Этот механизм позволяет:

  1. Указать основную номенклатуру и её аналог (заменитель).
  2. Ограничить действие замены конкретным периодом или конкретным изделием (характеристикой).
  3. Автоматически подставлять аналог в документы Этап производства при нехватке основного материала.

Важный момент: использование разрешений позволяет бухгалтерии видеть отклонения — в нормативах будет числиться «Гайка 1», а по факту списана «Гайка 2», что полезно для план-фактного анализа.

Программный метод массовой замены номенклатуры

Если решение о замене окончательное и спецификаций слишком много, воспользуемся программным кодом. Разберем пример обработки, которая находит все спецификации в статусе Действует и заменяет в их табличной части МатериалыИУслуги одну позицию на другую.

Ниже приведен пример функции, которая выполняет поиск и замену:


&НаСервере
Процедура ЗаменитьНовойНаСервере()
    // Запрос для поиска спецификаций, содержащих нужную номенклатуру
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |    РесурсныеСпецификацииМатериалыИУслуги.Ссылка КАК Ссылка
    |ИЗ
    |    Справочник.РесурсныеСпецификации.МатериалыИУслуги КАК РесурсныеСпецификацииМатериалыИУслуги
    |ГДЕ
    |    НЕ РесурсныеСпецификацииМатериалыИУслуги.Ссылка.ПометкаУдаления
    |    И РесурсныеСпецификацииМатериалыИУслуги.Номенклатура = &НоменклатураПоиска
    |    И РесурсныеСпецификацииМатериалыИУслуги.Ссылка.Статус = ЗНАЧЕНИЕ(Перечисление.СтатусыСпецификаций.Действует)";
    
    Запрос.УстановитьПараметр("НоменклатураПоиска", НоменклатураПоиска);
    Выборка = Запрос.Выполнить().Выбрать();

    Пока Выборка.Следующий() Цикл
        ОбъектСпецификации = Выборка.Ссылка.ПолучитьОбъект();
        
        // Поиск строк в табличной части по старой номенклатуре
        ПараметрыОтбора = Новый Структура("Номенклатура", НоменклатураПоиска);
        НайденныеСтроки = ОбъектСпецификации.МатериалыИУслуги.НайтиСтроки(ПараметрыОтбора);
        
        Для Каждого СтрокаМатериал Из НайденныеСтроки Цикл
            СтрокаМатериал.Номенклатура = НоваяНоменклатура;
        КонецЦикла;
        
        // Использование ОбменДанными.Загрузка позволяет избежать лишних проверок,
        // если мы уверены в корректности данных
        ОбъектСпецификации.ОбменДанными.Загрузка = Истина;
        
        Попытка
            ОбъектСпецификации.Записать();
        Исключение
            Сообщить("Не удалось записать спецификацию: " + ОбъектСпецификации.Ссылка);
        КонецПопытки;
    КонецЦикла;
    
    Сообщить("Массовая замена завершена.");
КонецПроцедуры

Рассмотрим нюансы данного кода. Применение ОбменДанными.Загрузка = Истина — это «обоюдоострый меч». С одной стороны, это позволяет быстро записать объект, игнорируя проверки статусов и заполнения обязательных реквизитов. С другой — вы можете нарушить логическую целостность, если новая номенклатура требует других единиц измерения или имеет иную статью калькуляции. Поэтому перед запуском такой обработки обязательно проверьте соответствие характеристик обеих позиций номенклатуры.

Использование обработки «Групповое изменение реквизитов»

Выясним, можно ли обойтись без написания кода. В типовых конфигурациях на базе БСП (Библиотека стандартных подсистем), к которым относится и 1С:ERP, есть мощный инструмент — Групповое изменение реквизитов. Он находится в разделе Администрирование — Обслуживание — Корректировка данных.

Для замены номенклатуры в спецификациях выполним следующие шаги:

  1. Выберем объект Ресурсные спецификации.
  2. Настроим отбор: Статус Равно "Действует".
  3. В списке изменяемых реквизитов найдем табличную часть Материалы и услуги.
  4. Для выполнения замены в табличных частях в настройках (кнопка «Дополнительные параметры») необходимо включить флаг Изменять вложенные табличные части.
  5. В колонке «Номенклатура» укажем новое значение. Внимание: без детального отбора по конкретной старой номенклатуре этот метод заменит ВСЕ материалы в выбранных спецификациях. Будьте предельно осторожны и используйте вкладку «Отбор» максимально детально.

Последствия замены для существующих документов

Проанализируем важный аспект: что произойдет с уже запущенным производством? Важно понимать, что после изменения ресурсной спецификации данные в ранее созданных документах Заказ на производство и Этап производства автоматически не обновятся.

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

Подводя итог, можно сказать, что наиболее безопасным методом является использование Разрешений на замену или создание новых версий спецификаций. Программная замена через ОбменДанными.Загрузка допустима только в экстренных случаях при полном понимании структуры данных и наличии свежей резервной копии базы данных.

← На главную