Как вывести сумму переоценки в журнале и документе «Переоценка (розница)» в 1С 7.7

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

В типовом решении «1С:Торговля и Склад 7.7» (и аналогичных конфигурациях на платформе 7.7) документ ПереоценкаРозница часто оставляет графу «Сумма» в журнале документов пустой. Это происходит потому, что система воспринимает переоценку как регламентное изменение цен в регистрах, а не как прямую финансовую операцию. Однако для оперативного учета, контроля торговой точки и понимания объема наценки или уценки, видеть итоговую сумму документа просто необходимо.

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

Разберем причину отсутствия суммы

Проанализируем ситуацию: в платформе 1С 7.7 отображение суммы в общем журнале документов или специализированных журналах обычно завязано на функцию глСуммаДокументаВЖурнале, которая находится в Глобальном модуле. Если для конкретного вида документа (в нашем случае ПереоценкаРозница) в этой функции не прописан алгоритм расчета, система возвращает пустое значение или ноль. Наша задача — научить систему пробегать по строкам документа, вычислять разницу цен и суммировать её.

Вариант 1. Изменение функции в Глобальном модуле (Быстрый метод)

Рассмотрим самый популярный способ, который обсуждался экспертами. Он не требует изменения структуры метаданных (добавления новых реквизитов) и подходит для баз с небольшим или средним объемом документов. Нам потребуется отредактировать Глобальный модуль в Конфигураторе.

  1. Откроем Конфигуратор, перейдем в меню «Конфигурация» — «Открыть конфигурацию».
  2. Найдем в дереве объектов (в самом верху) пункт «Глобальный модуль» и откроем его.
  3. Используя поиск (Ctrl+F), найдем функцию глСуммаДокументаВЖурнале(Док, ТипВозврата="строка").
  4. Внутри функции мы увидим длинную конструкцию Если ... ИначеЕсли ..., которая определяет способ получения суммы для каждого вида документа.
  5. Нам нужно вставить блок кода, который будет обрабатывать именно наш документ.

Посмотрим на пример кода, который необходимо добавить:


Если ВидДок = "ПереоценкаРозница" Тогда
    // Создаем объект для работы с данными документа
    ДД = СоздатьОбъект("Документ.ПереоценкаРозница");
    ДД.НайтиДокумент(Док);
    Результат = 0;
    // Перебираем строки документа для расчета разницы цен
    ДД.ВыбратьСтроки();
    Пока ДД.ПолучитьСтроку() = 1 Цикл
        // Сумма переоценки = (НоваяЦена - СтараяЦена) * Количество
        Результат = Результат + (ДД.ЦенаНовая - ДД.ЦенаСтарая) * ДД.Количество;
    КонецЦикла;
    Возврат Результат; // Возвращаем итоговое значение в функцию
КонецЕсли;

Важный технический нюанс: Обратите внимание на обращение к реквизитам через префикс ДД.. В контексте глобальной функции мы работаем не с самим документом напрямую, а с его ссылкой, поэтому необходимо создать объект Документ.ПереоценкаРозница и найти его методом НайтиДокумент(Док), прежде чем обращаться к его табличной части.

Вариант 2. Оптимизация производительности (Для крупных баз)

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

Выясним по шагам, как сделать работу системы мгновенной:

  1. В Конфигураторе найдем документ ПереоценкаРозница.
  2. Добавим в Шапку документа новый реквизит СуммаДокумента (тип «Число», точность 2, длина 15).
  3. В модуле самого документа, в процедуре ПриЗаписи() или ОбработкаПроведения(), пропишем расчет этой суммы и запись её в созданный реквизит.

Пример кода в модуле документа:


Процедура ПриЗаписи()
    СуммаДокумента = 0;
    ВыбратьСтроки();
    Пока ПолучитьСтроку() = 1 Цикл
        СуммаДокумента = СуммаДокумента + (ЦенаНовая - ЦенаСтарая) * Количество;
    КонецЦикла;
КонецПроцедуры

В этом случае в Глобальном модуле функция будет выглядеть гораздо проще и работать молниеносно:


ИначеЕсли ВидДок = "ПереоценкаРозница" Тогда
    Результат = Док.СуммаДокумента;

Вывод суммы в печатную форму

Если нам необходимо, чтобы сумма переоценки (общая наценка или уценка по накладной) выводилась на печать, выполним следующие действия:

  1. Откроем таблицу (шаблон) печатной формы документа ПереоценкаРозница.
  2. В нижней части таблицы (секция «Итого» или «Подвал») добавим новую ячейку.
  3. В свойствах ячейки установим тип «Выражение».
  4. Впишем имя переменной, например, ИтогоСуммаПереоценки.
  5. В модуле документа, в процедуре Печать(), добавим расчет этой переменной аналогичным циклом, который мы рассматривали выше, перед вызовом метода Показать().

Особенности учета «старых» цен

Рассмотрим ситуацию, когда старая цена в документе не заполнена (например, при первом поступлении товара или вводе остатков). В этом случае формула (ЦенаНовая - ЦенаСтарая) может выдать некорректный результат, фактически приравняв всю стоимость товара к наценке. Чтобы этого избежать, мы рекомендуем добавить в код проверку:


Если ДД.ЦенаСтарая > 0 Тогда
    Результат = Результат + (ДД.ЦенаНовая - ДД.ЦенаСтарая) * ДД.Количество;
Иначе
    // Логика на ваше усмотрение: либо пропускаем, либо считаем от нуля
КонецЕсли;

Резюме

Мы выяснили, что отсутствие суммы в журнале — это не ошибка, а особенность типовой конфигурации. Исправить это можно двумя путями: быстрым (через Глобальный модуль) или профессиональным (через добавление реквизита). Для большинства пользователей будет достаточно Варианта №1, так как он требует минимальных правок кода и сразу дает наглядный результат в интерфейсе программы, позволяя кладовщику или бухгалтеру видеть реальный объем переоцененного товара прямо в списке документов.

← На главную