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