Как массово изменить количество материалов в табличной части ресурсных спецификаций 1С?

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

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

Почему «Групповое изменение реквизитов» часто не справляется с задачей?

Рассмотрим основные причины, по которым попытка изменить данные через произвольный алгоритм внутри этой обработки может быть безуспешной:

  1. Фоновое выполнение: Обработка Групповое изменение реквизитов нередко запускает процесс в фоновом задании. Это означает, что привычные методы Сообщить() или СообщениеПользователю не будут выведены в окно сообщений вашего клиентского сеанса. Вы просто не увидите результат работы кода.
  2. Контекст поиска данных: При работе с ХарактеристикамиНоменклатуры, которые являются подчиненным справочником, важно учитывать владельца. Если вы ищете характеристику по наименованию без указания владельца, система может вернуть пустую ссылку, так как в базе могут существовать одноименные характеристики у разных номенклатурных позиций.
  3. Запись объекта: Даже если вы программно изменили значение в МатериалыИУслуги, объект должен быть корректно записан. Автоматическая запись не всегда срабатывает, если логика работы с табличной частью требует вызова определенных методов конфигурации или специфической обработки данных.

Правильная работа с поиском характеристик

Разберем типичную ошибку при поиске. Если вы используете метод НайтиПоНаименованию без учета владельца, вы рискуете получить неверную ссылку. Правильный подход — сначала определить владельца (номенклатуру), а затем искать характеристику в контексте этой номенклатуры.

Посмотрим на пример корректного поиска:


// Сначала находим номенклатуру-владельца
Номенклатура = Справочники.Номенклатура.НайтиПоКоду("9763");

// Теперь ищем характеристику именно для этой номенклатуры
// Параметры метода: Наименование, ТочноеСоответствие, Родитель, Владелец
Размер = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию("40*1,8", Истина, , Номенклатура);

Если поиск вернул Неопределено или пустую ссылку, ваш код внутри цикла просто не сработает, при этом система не выдаст никакой ошибки, так как логика «Если Элемент.Характеристика == Размер» будет ложной.

Создание собственной внешней обработки — лучшее решение

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

Преимущества создания своей обработки:

  1. Возможность отладки: Вы сможете ставить точки останова и просматривать значения переменных, что невозможно сделать в коде Группового изменения реквизитов.
  2. Визуальный контроль: Вы можете вывести на форму список отобранных для изменения спецификаций. Пользователь сможет убедиться, что выборка верна, прежде чем запускать процесс массовой записи.
  3. Логирование: Вы сможете самостоятельно выводить сообщения о прогрессе выполнения, используя методы формы, что позволит контролировать процесс в реальном времени.
  4. Управление записью: Вы сможете использовать метод Объект.Записать() в явном виде, обеспечивая корректное сохранение всех данных и пересчет итогов.

Рекомендации по реализации алгоритма изменения

Разберем примерную логику, которую следует реализовать в модуле вашей обработки:


// Получаем выборку спецификаций (например, запросом)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.РесурсныеСпецификации";
Результат = Запрос.Выполнить().Выбрать();

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

В процессе работы не забывайте проверять, используете ли вы поле КоличествоУпаковок или Количество. В зависимости от настроек конфигурации, изменение одного из них может требовать пересчета другого через коэффициенты упаковки. Анализируйте структуру вашей ТабличнойЧасти перед написанием кода.

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

← На главную