Как программно заполнить документ «План остатков товаров» в 1С:ERP и УТ 11?

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

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

Функциональное назначение и логика документа

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

Важно различать стратегии заполнения, которые определяются в Виде плана:

  1. Замещающий план: При проведении документа за определенный период все предыдущие плановые данные по этим же измерениям (номенклатура, склад, сценарий) аннулируются. Мы как бы «перезаписываем» план.
  2. Суммирующий план: Новые данные добавляются к уже существующим в регистре.

Проанализируем ситуацию: если мы создаем документ программно, нам необходимо четко понимать, какой ВидПлана и Сценарий используются, так как от них зависит периодичность (день, неделя, месяц) и структура данных. Документ является входящим параметром для обработки «Формирование заказов по потребностям». Если система видит, что плановый остаток выше текущего, она предложит сформировать заказ поставщику.

Техническая реализация заполнения табличной части

Типовой механизм заполнения в ERP реализован через систему компоновки данных (СКД). Когда пользователь нажимает кнопку «Заполнить товары» в форме, система вызывает цепочку процедур, которая в конечном итоге обращается к модулю ПланированиеСлужебный. Рассмотрим по шагам, как повторить это программно.

Главная точка входа для заполнения — это метод ЗаполнитьПоПравилуЗаполнения(). Однако, для его корректной работы нужно подготовить структуру параметров. Выясним причину, почему табличная часть часто остается пустой при простом вызове: системе требуются настроенные Источники данных планирования.

Подготовка параметров заполнения

Для программного вызова нам потребуется инициализировать структуру, которая передаст в механизм заполнения все необходимые отборы и настройки. Рассмотрим примерную логику подготовки данных:


// Создаем объект документа
НовыйДокумент = Документы.ПланОстатков.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.Сценарий = СценарийПланирования; // Ссылка на справочник СценарииТоварногоПланирования
НовыйДокумент.ВидПлана = ВидПлана;             // Ссылка на справочник ВидыПланов
НовыйДокумент.Статус = Перечисления.СтатусыПланов.Утвержден;
НовыйДокумент.ПериодПланирования = НачалоМесяца(ТекущаяДата());
// Заполняем прочие обязательные реквизиты (Склад, Организация)

Теперь разберем самый важный этап — вызов процедуры заполнения. В типовых конфигурациях для этого используется экспортный метод в модуле менеджера или специализированном серверном модуле.

Использование процедуры ЗаполнитьДокумент

Проанализируем метод Документы.ПланОстатков.ЗаполнитьДокумент(). Он принимает параметры, которые определяют, откуда брать данные (из реальных остатков, из планов продаж или по произвольному запросу СКД).


ПараметрыЗаполнения = Новый Структура;
ПараметрыЗаполнения.Вставить("Сценарий", НовыйДокумент.Сценарий);
ПараметрыЗаполнения.Вставить("ВидПлана", НовыйДокумент.ВидПлана);
ПараметрыЗаполнения.Вставить("ПериодПланирования", НовыйДокумент.ПериодПланирования);
ПараметрыЗаполнения.Вставить("Склад", НовыйДокумент.Склад);

// Важно: параметры должны соответствовать ожидаемым в процедуре модуля формы
// Обычно это структура, содержащая правила и отборы.
// В ERP заполнение часто уходит в фоновое задание.

Посмотрим на пример вызова серверной процедуры, которая обходит асинхронные вызовы формы, что критично для регламентных заданий:


// В модуле ПланированиеСлужебный или модуле менеджера документа
// Нам нужно подготовить таблицу товаров согласно правилам СКД
ПараметрыСборки = ПланированиеСлужебный.ПараметрыДляЗаполненияДокумента(НовыйДокумент);
ПланированиеСлужебный.ЗаполнитьТабличнуюЧастьТовары(НовыйДокумент, ПараметрыСборки);

Особенности работы с фоновыми заданиями

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

Нам следует вызывать процедуры напрямую из серверных модулей. Если мы используем метод ЗаполнитьДокумент, который внутри себя запускает фоновое задание, нам необходимо использовать конструкцию ожидания:


// Если используется типовой механизм с фоновым заданием
РезультатФонового = ФоновыеЗадания.Выполнить("ПланированиеСлужебный.СформироватьСоставПлана", Параметры);
РезультатФонового.ОжидатьЗавершения();
// После завершения получаем данные из временного хранилища и загружаем в ТЧ

Работа с источниками данных (СКД)

Если в Виде плана настроено заполнение по правилу (например, «Остатки на складах»), система использует предопределенные схемы компоновки данных. Чтобы программное заполнение сработало, убедитесь, что:

Связь с другими объектами системы

Рассмотрим подробнее, как программно созданный План остатков влияет на систему в целом. После того как документ заполнен и проведен, данные попадают в регистр накопления Планы остатков.

Важно помнить о следующих моментах:

  1. Аналитика «Назначение»: Если на предприятии используется обособленный учет, обязательно заполняйте поле Назначение в табличной части. Без этого план будет «общим» и не подтянется под конкретные заказы.
  2. План-фактный анализ: Для того чтобы отчеты по план-факту работали корректно, дата документа должна строго соответствовать периодичности сценария. Если сценарий помесячный, дата должна быть первым числом месяца.
  3. Производные планы: Часто План остатков создается программно как промежуточное звено. Например, мы рассчитываем целевой остаток на основе прогноза продаж, а затем на разницу между целевым и текущим остатком формируем План закупок.

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

← На главную