В типовом решении «1С:Торговля и Склад 7.7» (и аналогичных конфигурациях на платформе 7.7) документ ПереоценкаРозница часто оставляет графу «Сумма» в журнале документов пустой. Это происходит потому, что система воспринимает переоценку как регламентное изменение цен в регистрах, а не как прямую финансовую операцию. Однако для оперативного учета, контроля торговой точки и понимания объема наценки или уценки, видеть итоговую сумму документа просто необходимо.
В этой статье мы подробно разберем, как внести изменения в конфигурацию, чтобы рассчитать сумму переоценки как разницу между новой и старой ценами, умноженную на количество товара, и вывести этот результат в журнал и печатные формы.
Проанализируем ситуацию: в платформе 1С 7.7 отображение суммы в общем журнале документов или специализированных журналах обычно завязано на функцию глСуммаДокументаВЖурнале, которая находится в Глобальном модуле. Если для конкретного вида документа (в нашем случае ПереоценкаРозница) в этой функции не прописан алгоритм расчета, система возвращает пустое значение или ноль. Наша задача — научить систему пробегать по строкам документа, вычислять разницу цен и суммировать её.
Рассмотрим самый популярный способ, который обсуждался экспертами. Он не требует изменения структуры метаданных (добавления новых реквизитов) и подходит для баз с небольшим или средним объемом документов. Нам потребуется отредактировать Глобальный модуль в Конфигураторе.
глСуммаДокументаВЖурнале(Док, ТипВозврата="строка").Если ... ИначеЕсли ..., которая определяет способ получения суммы для каждого вида документа.Посмотрим на пример кода, который необходимо добавить:
Если ВидДок = "ПереоценкаРозница" Тогда
// Создаем объект для работы с данными документа
ДД = СоздатьОбъект("Документ.ПереоценкаРозница");
ДД.НайтиДокумент(Док);
Результат = 0;
// Перебираем строки документа для расчета разницы цен
ДД.ВыбратьСтроки();
Пока ДД.ПолучитьСтроку() = 1 Цикл
// Сумма переоценки = (НоваяЦена - СтараяЦена) * Количество
Результат = Результат + (ДД.ЦенаНовая - ДД.ЦенаСтарая) * ДД.Количество;
КонецЦикла;
Возврат Результат; // Возвращаем итоговое значение в функцию
КонецЕсли;
Важный технический нюанс: Обратите внимание на обращение к реквизитам через префикс ДД.. В контексте глобальной функции мы работаем не с самим документом напрямую, а с его ссылкой, поэтому необходимо создать объект Документ.ПереоценкаРозница и найти его методом НайтиДокумент(Док), прежде чем обращаться к его табличной части.
Проанализируем первый вариант: он заставляет систему пересчитывать сумму документа каждый раз, когда вы прокручиваете журнал или открываете его. Если в документе сотни строк, а в журнале тысячи документов, это может привести к значительным задержкам («тормозам») интерфейса. Для оптимизации работы мы рекомендуем другой подход.
Выясним по шагам, как сделать работу системы мгновенной:
ПереоценкаРозница.СуммаДокумента (тип «Число», точность 2, длина 15).ПриЗаписи() или ОбработкаПроведения(), пропишем расчет этой суммы и запись её в созданный реквизит.Пример кода в модуле документа:
Процедура ПриЗаписи()
СуммаДокумента = 0;
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
СуммаДокумента = СуммаДокумента + (ЦенаНовая - ЦенаСтарая) * Количество;
КонецЦикла;
КонецПроцедуры
В этом случае в Глобальном модуле функция будет выглядеть гораздо проще и работать молниеносно:
ИначеЕсли ВидДок = "ПереоценкаРозница" Тогда
Результат = Док.СуммаДокумента;
Если нам необходимо, чтобы сумма переоценки (общая наценка или уценка по накладной) выводилась на печать, выполним следующие действия:
ПереоценкаРозница.ИтогоСуммаПереоценки.Печать(), добавим расчет этой переменной аналогичным циклом, который мы рассматривали выше, перед вызовом метода Показать().Рассмотрим ситуацию, когда старая цена в документе не заполнена (например, при первом поступлении товара или вводе остатков). В этом случае формула (ЦенаНовая - ЦенаСтарая) может выдать некорректный результат, фактически приравняв всю стоимость товара к наценке. Чтобы этого избежать, мы рекомендуем добавить в код проверку:
Если ДД.ЦенаСтарая > 0 Тогда
Результат = Результат + (ДД.ЦенаНовая - ДД.ЦенаСтарая) * ДД.Количество;
Иначе
// Логика на ваше усмотрение: либо пропускаем, либо считаем от нуля
КонецЕсли;
Мы выяснили, что отсутствие суммы в журнале — это не ошибка, а особенность типовой конфигурации. Исправить это можно двумя путями: быстрым (через Глобальный модуль) или профессиональным (через добавление реквизита). Для большинства пользователей будет достаточно Варианта №1, так как он требует минимальных правок кода и сразу дает наглядный результат в интерфейсе программы, позволяя кладовщику или бухгалтеру видеть реальный объем переоцененного товара прямо в списке документов.