Как программно рассчитать итоги 1с

Обновлено: 04.07.2024

Приветствую, коллеги! В данной статье мы подробно рассмотрим системную утилиту «Тестирование и исправление информационной базы» в 1С 8.3 и особенности её использования.

Рисунок 1 Режимы тестирования и исправления информационной базы Рисунок 1 Режимы тестирования и исправления информационной базы

Режим тестирования и исправления вызывается в конфигураторе системы 1С 8.3 выбором меню «Администрирование → Тестирование и исправление».

Если у Вас возникла необходимость провести процедуру тестирования и исправления информационной базы 1С:

· во-первых, следует создать копию базы данных (если это возможно, т.к. иногда структура базы становится настолько «покалечена», что отсутствует даже возможность создать резервную копию).

· во-вторых, после создания резервной копии следует открыть «Конфигуратор → Администрирование → Тестирование и исправление…»

Проверки и режимы

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

Процедура позволяет выбрать проверки и режимы, которые должны быть выполнены для текущей информационной базы.

· Реиндексация таблиц – это перестроение индексов таблиц, направленное на повышение быстродействия работы базы.

· Проверка логической целостности – это целое множество проверок логики базы данных

· Проверка ссылочной целостности – это подмножество проверки логической целостности базы данных, существующее для отдельной работы с «битыми» ссылками. Конкретнее будет объяснено ниже по тексту.

· Пересчет итогов – расчет итогов таблиц регистров накопления.

· Сжатие таблиц информационной базы – данный пункт отвечает за уменьшение размера базы после тестирования. Объяснить уменьшение размера базы можно, например, так: когда из базы удаляется объект, он, по сути, остается в базе внутри, но невидимым для конечного пользователя. Сделано это для того, чтобы объект все-таки можно было восстановить уже после полного удаления из базы (хотя мы с таким не сталкивались). А сжатие таблиц убирает информацию об удаленных уже объектах из базы данных. От этого таблицы становятся меньше (это всего лишь один пример, как работает сжатие). Действие «Сжатие таблиц информационной базы» доступно только для файлового варианта. Остальные варианты работают и в файловом и в серверном режиме.

· Реструктуризация таблиц – пример можно привести такой: берется таблица № 1, создается копия ее структуры, например, Таблица № 2, и данные из таблицы № 1 копируются порциями в таблицу № 2.

Имеется возможность выполнять только тестирование или тестирование с исправлением.

Пункты настроек по обработке ошибок базы становятся доступными для выбора при варианте обработки «Тестирование и исправление», а также режиме «Проверка ссылочной целостности информационной базы».

Использование произвольных выражений в итогах языка запроса

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

Произвольные выражения в итогах

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

  • в выражениях для расчета итогов нельзя использовать операции В и В ИЕРАРХИИ со вложенными запросами.
  • в выражениях для расчета итогов результат функции Представление() может быть использован в другом выражении.

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

ИТОГИ
100 * Сумма(Прибыль) / СУММА(Оборот) КАК ПроцентПрибыли

В данном примере результате выражения будет помещаться в поле "ПроцентПрибыли". Заметим, что поле "ПроцентПрибыли" должно присутствовать в списке выборки запроса.

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

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

ИТОГИ
Номенклатура КАК Номенклатура,// Правильно, т.к. поле присутствует в списке группировок итогов
СуммаОборот КАК СуммаОборот, // Неправильно, т.к. поле отсутствует в списке группировок итогов
Сумма(КоличествоОборот) КАК КоличествоОборот // Правильно, т.к. поле используется в агрегатной функции
ПО
Номенклатура,
Контрагент

В случае если поле - группировка используется в итоговом выражении, и по данному полю еще не было получена группировка - значение поля будет равняться NULL .

Примеры использования

Расчет выражений от агрегатных функций

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

ВЫБРАТЬ
Номенклатура,
СуммаОборот КАК Оборот,
СуммаПрибыль КАК Прибыль,
100 * СуммаПрибыль / СуммаОборот КАК ПроцентПрибыли
ИЗ
РегистрНакопления.УчетПрибыли.Обороты
ИТОГИ
СУММА(Оборот),
СУММА(Прибыль),
100 * СУММА(Прибыль) / СУММА(Оборот) КАК ПроцентПрибыли
ПО
Номенклатура ИЕРАРХИЯ

В данном примере в поле "ПроцентПрибыли" итоговых записей будет помещено значение суммы по полю "Прибыль" умноженное на 100 и поделенное на значение суммы по полю "Оборот".

Расчет итогов только для уже полученных группировок

Для того, чтобы значение некоторых суммируемых полей рассчитывалось только для группировок, по которым уже получены итоги, в выражении для расчета итога можно воспользоваться тем фактом, что значение полей - группировок для еще не полученных группировок равняется NULL .

ВЫБРАТЬ
ОсновнойОстатки.Счет КАК Счет,
ОсновнойОстатки.Валюта КАК Валюта,
ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
СУММА(СуммаОстаток),
ВЫБОР
КОГДА Валюта ЕСТЬ НЕ NULL
ТОГДА СУММА(ВалютнаяСуммаОстаток)
КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
Счет,
Валюта

В данном примере значение итога для поля "ВалютнаяСуммаОстаток" будет рассчитано только для итоговых записей, в которых уже получена группировка Валюта. Т.е. в итоговых записях для группировки Счет итоги по полю "ВалютнаяСуммаОстаток" будут рассчитывать только тогда, когда итоги по данной группировке будут получаться только внутри группировки Валюта.

Альтернативным способом расчета итога является проверка количества различных значений в группировке и рассчет итога только для итоговых записей, в которых суммируется только одно значение группировки.

ВЫБРАТЬ
ОсновнойОстатки.Счет КАК Счет,
ОсновнойОстатки.Валюта КАК Валюта,
ОсновнойОстатки.СуммаОстаток КАК СуммаОстаток,
ОсновнойОстатки.ВалютнаяСуммаОстаток КАК ВалютнаяСуммаОстаток
ИЗ
РегистрБухгалтерии.Основной.Остатки КАК ОсновнойОстатки
ИТОГИ
СУММА(СуммаОстаток),
ВЫБОР
КОГДА КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Валюта) = 1
ТОГДА СУММА(ВалютнаяСуммаОстаток)
КОНЕЦ КАК ВалютнаяСуммаОстаток
ПО
Счет,
Валюта

В данном примере рассчет итого по полю "ВалютнаяСуммаОстаток" будет производиться только для тех итоговых записей, которые содержат лишь одно значение поля "Валюта".

Переопределение представлений для группировок

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

ВЫБРАТЬ
ПродажиОбороты.Номенклатура КАК Номенклатура,
ПродажиОбороты.Номенклатура.Код КАК НоменклатураКод,
ПРЕДСТАВЛЕНИЕ(ПродажиОбороты.Номенклатура) КАК НоменклатураПредставление,
ПродажиОбороты.КоличествоОборот КАК КоличествоОборот,
ПродажиОбороты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты
ИТОГИ
НоменклатураКод + ") " + НоменклатураПредставление КАК НоменклатураПредставление,
СУММА(КоличествоОборот),
СУММА(СуммаОборот)
ПО
Номенклатура

В данном примере, в качестве представления поля "Номенклатура" в итоговых записях, будет использоваться выражение, состоящее из кода и основного представления.

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

Система компоновки данных 1С 8.3 для начинающих: считаем итоги (ресурсы)

Автор уроков и преподаватель школы: Владимир Милькин

Ставим цель

Целью этого урока будет:

  • Написать отчёт, который выводит список продуктов (справочник Еда), их калорийность и вкус.
  • Сделать группировку продуктов по их цвету.
  • Познакомиться с возможностью подведения итогов (ресурсы) и вычисляемыми полями.

Создаём новый отчёт

Как и на предыдущих уроках открываем базу "Гастроном" в конфигураторе и создаём новый отчёт через меню "Файл"->"Новый. ":

Вид документа - внешний отчёт:

В форме настройки отчёта пишем имя "Урок3" и нажимаем кнопку "Открыть схему компоновки данных":

Оставляем имя схемы по умолчанию и нажимаем кнопку "Готово":

Добавляем запрос через конструктор

На закладке "Набор данных" нажимаем зелёный плюсик и выбираем пункт "Добавить набор данных - запрос":

Вместо того, чтобы писать текст запроса вручную, вновь запускаем конструктор запроса:

На вкладке "Таблицы" перетягиваем таблицу "Еда" из первой колонки во вторую:

Выбираем из таблицы "Еда" поля, которые будем запрашивать. Для этого перетаскиваем поля "Наименование", "Вкус", "Цвет" и "Калорийность" из второй колонки в третью:

Получилось вот так:

Нажимаем кнопку "ОК" - текст запроса сформировался автоматически:

Формируем настройки представления отчёта

Переходим на закладку "Настройки" и нажимаем на волшебную палочку, чтобы вызвать конструктор настроек:

Выбираем вид отчета "Список. " и нажимаем кнопку "Далее":

Перетаскиваем из левой колонки в правую поля, которые будут отображаться в списке и нажимаем "Далее":

Перетаскиваем из левой колонки в правую поле "Цвет" - по нему будет происходить группировка строк в отчёте. Нажимаем "ОК":

А вот и результат работы конструктора. Иерархия нашего отчёта:

  • отчёт в целом
  • группировка "Цвет"
  • детальные записи - строки с названиями еды

Сохраним отчёт (кнопка дискета) и не закрывая конфигуратора тут же откроем его в режиме пользователя. Получилось вот так:

Меняем порядок колонок

Но давайте поменяем порядок колонок (стрелки вверх-вниз), чтобы он был таким как на рисунке ниже:

Сохраним отчёт и вновь откроем в режиме пользователя:

Отлично, так гораздо лучше.

Подводим итог (сумму) по калорийности

Было бы неплохо выводить итог калорийности продуктов по группам. Чтобы видеть сумму калорийности всех продуктов, скажем, белого или жёлтого цвета. Или узнать общую калорийность вообще всех продуктов в базе.

Для этого существует механизм вычисления ресурсов.

Переходим на вкладку "Ресурсы" и перетаскиваем поле "Калорийность" (мы же по нему собираемся итог подводить) из левой колонки в правую.

При этом в поле выражение выбираем из выпадающего списка "Сумма(Калорийность)", так как итогом будет являться сумма всех входящих в итог элементов:

Сохраняем и формируем отчёт:

У нас появились итоги по каждой из групп и по отчёту в целом.

Подводим итог (среднее) по калорийности

Теперь давайте сделаем так, чтобы в ещё одной колонке выводилась средняя калорийность продуктов по группам и в целом по отчёту.

Трогать уже имеющуюся колонку "Калорийность" нельзя - в неё уже выводится итог-сумма, поэтому заведём ещё одно поле, которое будет являться точной копией поля "Калорийность".

Чтобы завести такое "виртуальное" поле воспользуемся механизмом вычисляемых полей.

Переходим на закладку "Вычисляемые поля" и нажимаем зелёный плюсик:

В колонке "Путь к данным" пишем имя нового поля (слитно, без пробелов). Пусть оно будет называться "СредняяКалорийность", а в колонке "Выражение" пишем имя уже существующего поля, на основании которого будет рассчитываться новое поле. Пишем туда "Калорийность". Колонка "Заголовок" заполнится автоматически.

Мы добавили новое поле ("СредняяКалорийность"), но в отчёте оно само по себе не появится - нужно или вновь вызывать конструктор настроек ("волшебная палочка") или добавить это поле вручную.

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

Получилось вот так:

Сохраняем и формируем отчет:

Поле появилось и мы видим, что его значениями являются значения поля "Калорийность". Отлично!

Но мы помним, что конечная цель - посчитать среднюю калорийность по группам и в целом по отчёту.

Для этого вновь воспользуемся уже знакомым нам механизмом ресурсов (подведение итогов). Переходим на закладку "Ресурсы" и перетаскиваем поле "СредняяКалорийность" из левой колонки в правую:

При этом в колонке "Выражение" выбираем "Среднее(СредняяКалорийность)":

Сохраняем и формируем отчёт:

Видим, что по группам, то есть по каждому цвету, и по отчёту в целом совершенно верно посчиталось среднее значение. Но присутствуют лишние записи по отдельным продуктам (не по группам), которые хотелось бы убрать из отчёта.

Знаете почему они появились (значения не по группам)? Потому что, когда мы добавляли поле "СредняяКалорийность" в настройки отчёта, на втором шаге мы выделили весь отчёт в целом и это новое поле попало в элемент "Детальные записи".

Исправим ошибку. Для этого вернёмся на закладку "Настройки", выберем "Детальные записи" сначала сверху (шаг 2), а затем "Детальные записи" снизу (шаг 3), перейдём на закладку "Выбранные поля" и увидим в её правой колонке элемент "Авто".

Элемент "Авто" - это не одно поле. Это несколько полей, которые попадают сюда автоматически на основании вышестоящих настроек.

Чтобы увидеть, что это за поля - нажмём на элемент "Авто" правой кнопкой и выберем пункт "Развернуть":

Элемент "Авто" раскрылся в следующие поля:

А вот и наше поле "СредняяКалорийность", которое попало сюда из пункта "Отчет", когда мы его туда перетаскивали. Просто снимем галку рядом с этим полем, чтобы убрать его вывода:

Сохраним и сформируем отчёт:

То, что надо! Значения "СредняяКалорийность" остались только в группах (цвет) и в итоге по отчёту в целом.

Подводим итог (количество) по вкусам

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

Ну, например, для белого цвета, это значение будет равно 2 (всего два вкуса "Кислый" и "Сладкий"), а для жёлтого 3 ("Сладкий", "Солёный" и "Кислый").

Переходим на закладку "Ресурсы" и перетаскиваем поле "Вкус" из левой колонки в правую:

В качестве выражения выбираем "Количество(Различные Вкус)":

Сохраняем и формируем отчёт:

Эталонная обработка, после выполнения всех шагов этого урока

Войдите на сайт как ученик

Для учеников

Прибегайте к изучению эталонного варианта только после самостоятельного выполнения всех шагов.

На вопросы учеников — отвечаю по почте, но прежде загляните в ЧАВО (ссылка) .


Например, был начислен оклад, который составил 20 000. Затем была рассчитана премия в размере 10% от оклада, которая составила 2 000. Если сейчас изменить сумму оклада, то запись с премией станет не актуальной, ее нужно будет пересчитать. Для автоматического отслеживания таких ситуаций и предназначен перерасчет.

Перерасчет создается как подчиненный объект регистра расчета и может хранить записи только для текущего регистра расчета:

Перерасчет

У одного регистра расчета может быть несколько перерасчетов. Для каждого перерасчета создается своя таблица в базе данных со следующими колонками:

Объект перерасчетаВид расчета

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

Для каждого измерения перерасчета будет добавлена еще одна колонка:

Объект перерасчетаВид расчетаСотрудник

Измерения нужны, чтобы при изменении оклада Иванова пересчитывать только премию Иванова, а не всех сотрудников.

В свойствах измерения нужно указать связь текущего и ведущих регистров:

Связь измерений перерасчета

В свойстве Измерение регистра нужно указать измерение текущего регистра расчета, на которое будет установлен отбор при создании записей перерасчета.

Если после расчета премии Иванова изменить оклад Иванова, то в таблице перерасчета появится следующая запись:

Объект перерасчетаВид расчетаСотрудник
Начисление ЗП №3ПремияИванов

То есть нужно пересчитать премию Иванова из документа №3.

Посмотреть таблицу перерасчета можно с помощью запроса:

Перерасчет1.ОбъектПерерасчета КАК ОбъектПерерасчета , РегистрРасчета.РегистрРасчета1.Перерасчет1 КАК Перерасчет1

Записи перерасчета

Записи перерасчета носят рекомендательный характер. Автоматический перерасчет не выполняется, его нужно выполнить вручную.

Условия возникновения перерасчета

Автоматическое формирование записей перерасчета выполняется при записи в регистр расчета.

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

Для базовых видов расчета одновременно должны быть выполнены три условия:

  1. Должна быть настроена связь видов расчета через табличную часть Ведущие виды расчетов:
  1. Измерения регистра расчета должны быть указаны в свойстве Данные ведущих регистров измерения перерасчета:
  1. Ведущая запись должна попадать в базовый период зависимой. Если был изменен оклад за июль 2021, то пересчитать нужно только ту премию, у которой базовый период включает июль 2021.

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

В этом случае есть смысл включить командировку в список ведущих видов расчета для премии. Тогда при изменении командировки в перерасчет будет добавлено сразу две записи: для оклада и для премии.

Удаление записей перерасчета

Автоматическое удаление записей перерасчета происходит при удалении связанной записи регистра расчета. Так как при перепроведении документа сначала выполняется удаление текущих движений, а потом формирование новых, то достаточно просто перепровести документ, чтобы были удалены записи перерасчета.

Программная работа с перерасчетом

Добавление записей перерасчета

Для добавления записей перерасчета нужно создать набор записей, установить отбор по объекту перерасчета, добавить новые записи и записать в базу данных:

Форум

При наличии в системе 1С:Предприятие компоненты «Бухгалтерский учет» система автоматически реализует специальный механизм работы с бухгалтерскими итогами. Данный механизм обеспечивает хранение, динамический пересчет бухгалтерских итогов и их извлечение средствами встроенного языка.

Изменение бухгалтерских итогов может производиться только проводками бухгалтерских операций.

Хранение итогов поддерживается системой с детализацией до месяца. В итогах хранятся остатки и обороты по счетам с детализацией по субконто и обороты между счетами (без детализации по субконто).

Обращение к бухгалтерским итогам выполняется при помощи агрегатного объекта типа «БухгалтерскиеИтоги». Объект может работать в трех режимах:

  • работа с основными итогами,
  • работа с временными итогами,
  • работа в режиме запроса.

Объект типа «БухгалтерскиеИтоги» при создании функцией «СоздатьОбъект()» работает в первом режиме. Переключение в другие режимы производится функциями «Рассчитать()» и «ВыполнитьЗапрос()».

Функции «ИспользоватьПланСчетов()» и «ИспользоватьРазделитель Учета()» позволяют назначить план счетов и разделитель учета по которым будут выдаваться итоги.

В пункте меню «Управление бухгалтерскими итогами» в системе «1С:Предприятие» устанавливается последний рассчитанный период. В режиме работы с основными итогами осуществляется доступ только к итогам по рассчитанный месяц включительно.

Функции работы с итогами:

Параметры: <Cчет> – счет, <ТипСуммы> = 1 – сумма, 2 – валютная сумма, 3 – количество, <Валюта> – значение типа “Справочник.Валюты”, <Субконто1> – значение первого субконто счета, <Субконто2> – значение второго субконто счета и т.д.

ОБ(<СчетДеб>,<СчетКред>,<ТипСуммы>,<Валюта>) – обороты между счетами;

Для получения остатков и оборотов по счетам, имеющим субсчета, используются аналогичные функции: СНДР(), СКДР(), СКДР(), СККР().

Чтобы получить итоги на любую дату нужно выполнять временный расчет (временный, потому что он хранится только во время существования переменной типа «БухгалтерскиеИтоги») с помощью функции

В параметре <ФильтрПоСчетам> можно задать в виде строки список счетов, разделенных запятой или точкой с запятой, по которым будет делаться расчет. Если параметр <ТолькоСинтетика> = 1, то расчет будет делаться только по счетам, иначе по счетам и субконто.

Для получения большего количества итогов (обороты и остатки по разным видам группировок) используется режим запроса.

Перед выполнением запроса устанавливаются различные фильтры:

ВключатьСубсчета() – устанавливать режим отбора по субсчетам.

Затем выполняется сам запрос функцией ВыполнитьЗапрос( <ДатаНач>,<ДатаКон>,<ФильтрПоСчетам>,<ФильтрПоКорСчетам>, <Валюта>,<ТипИтогов>,<Периодичность>,<ТипСуммы>), которая возвращает 1, если запрос выполнился успешно.

Параметр <ТипИтогов> принимает следующие значения: 1 – остатки и обороты по счетам, 2 – обороты между счетами, 3 – и то и другое.

Читайте также: