В процессе работы с конфигурацией «Управление производственным предприятием» (УПП) 1.3 или аналогичными системами на обычных формах часто возникает задача визуально отметить, что документ ПланПроизводства выполнен. Это необходимо для того, чтобы в отчетах или списках документов можно было быстро отфильтровать закрытые позиции и сосредоточиться на актуальных задачах. Рассмотрим подробнее, как реализовать этот механизм — от использования типовых документов до программной доработки системы.
Прежде чем приступать к программированию, проанализируем возможности типовой конфигурации УПП 1.3. В системе существует специализированный документ «Закрытие планов». Его основное назначение — прекращение действия запланированных, но неисполненных потребностей.
Если план выполнен частично или его выполнение более не требуется, именно этот документ «снимает» остатки с регистров планирования. Рассмотрим преимущества этого подхода:
ПланыПроизводства), что напрямую влияет на результаты работы «Помощника планирования».Если ваша задача — исключить старые планы из производственных отчетов, рекомендуется использовать именно этот механизм, не прибегая к изменению кода.
Если же требуется именно визуальная отметка в самом документе (флажок «План выполнен»), разберем по шагам, как это реализовать программно. Выясним причину, почему простая установка флажка в форме может не работать или работать некорректно.
Для начала добавим в документ ПланПроизводства новый реквизит ПланВыполнен с типом Булево. После этого его необходимо вывести на форму документа. Проанализируем типичную ошибку начинающих разработчиков: установка значения реквизита только в модуле формы. Если вы хотите, чтобы признак сохранялся, код должен находиться в модуле объекта.
Рассмотрим ситуацию, когда мы хотим, чтобы система сама проверяла, выполнен ли план, в момент нажатия кнопки «Записать» или «Провести». Для этого нам потребуется написать запрос к регистрам накопления, чтобы сравнить плановые показатели с фактическим выпуском или остатками на складах.
Важное методологическое замечание: Проверка выполнения плана по остаткам на складах (регистр ТоварыНаСкладах) является рискованной. Произведенная продукция может быть сразу отгружена покупателю, и остаток станет нулевым, хотя план фактически был выполнен. Правильнее проверять данные в регистре ВыпускПродукции.
Проанализируем пример кода, который можно разместить в процедуре ПередЗаписью модуля объекта документа:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
// По умолчанию считаем план выполненным, пока не найдем обратное
ПланВыполнен = Истина;
Для Каждого СтрокаПлана Из СоставПлана Цикл
КоличествоВыпущено = ПолучитьФактВыпуска(СтрокаПлана.Номенклатура, Дата);
Если КоличествоВыпущено < СтрокаПлана.Количество Тогда
// Если хотя бы по одной позиции выпуск меньше плана - план не выполнен
ПланВыполнен = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьФактВыпуска(ВыбраннаяНоменклатура, ДатаПланирования)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(ВыпускПродукцииОбороты.КоличествоОборот) КАК КоличествоФакт
|ИЗ
| РегистрНакопления.ВыпускПродукции.Обороты(&НачалоПериода, &КонецПериода, , Номенклатура = &Номенклатура) КАК ВыпускПродукцииОбороты";
// Настраиваем границы периода (например, месяц планирования)
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ДатаПланирования));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ДатаПланирования));
Запрос.УстановитьПараметр("Номенклатура", ВыбраннаяНоменклатура);
Результат = Запрос.Выполнить().Выбрать();
Если Результат.Следующий() Тогда
Возврат ?(Результат.КоличествоФакт = NULL, 0, Результат.КоличествоФакт);
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
В процессе обсуждения на форуме возникла проблема: пользователь ставит галочку, записывает документ, но при повторном открытии она пропадает. Проанализируем ситуацию:
Данными (реквизитом документа), значение не будет сохранено в базе данных.Когда реквизит ПланВыполнен успешно внедрен и заполняется, мы можем легко использовать его в отчетах на базе Системы компоновки данных (СКД). Рассмотрим, как это сделать:
В конструкторе запроса вашего отчета добавьте условие в секцию «ГДЕ» или используйте настройки отбора в пользовательском режиме. Например, чтобы увидеть только активные планы, добавьте отбор: ПланПроизводства.ПланВыполнен Равно Ложь.
Также можно использовать вычисляемые поля прямо в СКД, чтобы не перегружать документ лишними реквизитами. В выражении поля можно прописать логику:
ВЫБОР КОГДА Сумма(КоличествоПлан) <= Сумма(КоличествоФакт) ТОГДА "Выполнен" ИНАЧЕ "В работе" КОНЕЦ
Таким образом, мы рассмотрели несколько путей решения задачи. Выбор между использованием типового документа Закрытие планов и написанием собственного кода в ПередЗаписью зависит от требований к глубине учета и производительности системы. Помните, что запросы в цикле внутри процедуры записи могут замедлить работу при большом количестве строк в документе, поэтому для высоконагруженных баз лучше использовать пакетные запросы вне цикла.