Регистры бухгалтерии. Виртуальная таблица остатков

24.08.20

Разработка - Механизмы типовых конфигураций

Принцип работы виртуальной таблицы остатков. А также некоторые особенности.

Еще одна таблица

Регистры бухгалтерии - один из самых сложных объектов платформы 1С, как уже говорилось ранее. В прошлой статье мы говорили о таблице оборотов ДТ / КТ и продолжили серию публикаций об этом виде регистров.

Сегодня мы рассмотрим одну из двух оставшихся виртуальных таблиц - таблицу "Остатки" и некоторые нюансы формируемых запросов к базе данных.

Также мы коснемся некоторых вопросов производительности таких запросов и сформируем общие рекомендации по их использованию.

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

На практике виртуальная таблица остатков используются очень часто. В той же типовой конфигурации "Бухгалтерия предприятия 3.0" ее использование можно встретить в таких отчетах как:

  • Карточка счета
  • Карточка субконто
  • Остатки товаров
  • Остатки денежных средств
  • Задолженность поставщикам
  • Задолженность покупателей
  • Движение товаров
  • И многие другие.

В общем, эта виртуальная таблица используется очень часто как в отчетах бухгалтерского учета, так и в алгоритмах. Итак, поехали дальше!

Просто получаем остатки

Начнем с простого запроса - получим остаток по конкретному счету с отбором по организации. Вот так этот запрос выглядит на языке запросов 1С.

ВЫБРАТЬ
	ХозрасчетныйОстатки.Организация КАК Организация,
	ХозрасчетныйОстатки.Счет КАК Счет,
	ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток,
	ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаОстатокДт,
	ХозрасчетныйОстатки.СуммаОстатокКт КАК СуммаОстатокКт
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет = &Счет, , Организация = &Организация) КАК ХозрасчетныйОстатки

Как и в предыдущих публикациях, здесь мы видим один маленький запрос 1С, но очень большой SQL-запрос к базе данных.

 
 Получение остатков по счету

Текст сформированного SQL-запроса очень большой, но принцип работы его очень простой:

  1. Мы не указали параметр "Период" виртуальной таблицы, поэтому платформа 1С попытается получить данные на максимальную дату - 3999 год, 1 ноября. (Дата конца света по календарю 1С). Т.к. в базе SQL Server, на которой мы рассматриваем все примеры, даты хранятся со смещением в 2000 лет, то на стороне базы данных это дата '5999-11-01 00:00:00'. 
  2. Для регистра бухгалтерии имеются рассчитанные итоги - как по месяцам, так и текущие итоги. Т.к. текущие итоги рассчитаны и включены, то платформа получает остаток из них.
  3. В примере мы не выбирали аналитику субконто, поэтому остатки можно получить из итогов по счетам - таблицы "ИтогиПоСчетам" на дату '5999-11-01 00:00:00'.
  4. Получение данных из таблицы итогов "ИтогиПоСчетам" отбираются с учетом фильтра по дате '5999-11-01 00:00:00', организации и счету.
  5. Для исключения излишних данных из результата исключаются записи с пустой суммой.

В тексте самого запроса оставил комментарии, чтобы проще было разобраться. Подобные запросы работают максимально эффективно как из-за рассчитанных итогов, так и из-за относительно небольшого размета таблицы "ИтогиПоСчетам". Даже если информационная система функционирует несколько лет, в этой таблице редко бывает больше миллиона записей, но не всегда конечно. Ранее мы уже рассматривали вопрос с итогами и пример проблем обслуживания таблиц итогов:

Но давайте усложним текст запроса и рассмотрим что сделает платформа.

Остатки на период

Сделаем простое изменение - просто добавим отбор по периоду. Например, поставим период как 10.05.2019. При этом запомним, что итоги по регистру бухгалтерии рассчитаны с 01.01.2019 по 31.08.2020.

ВЫБРАТЬ
	ХозрасчетныйОстатки.Организация КАК Организация,
	ХозрасчетныйОстатки.Счет КАК Счет,
	ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток,
	ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаОстатокДт,
	ХозрасчетныйОстатки.СуммаОстатокКт КАК СуммаОстатокКт
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , Организация = &Организация) КАК ХозрасчетныйОстатки

SQL-запрос в результате стал еще больше, т.к. платформа 1С получает данные не только из таблиц итогов "ИтогиПоСчетам", но и из основных таблиц регистра.

 
 Запрос стал еще больше

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

Тот же принцип работает и для регистра накопления. Подробнее эту тему мы рассматривали в публикации Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты".

Вот какие шаги выполняются при получении данных в этом случае:

  1. Сначала платформа 1С получает остаток из таблицы итогов "ИтогиПоСчетам" на 01.06.2019, т.к. это ближайшие рассчитанные итоги на указанное значение периода в виртуальной таблице - 10.05.2019. Этот же шаг выполнялся в первом примере.
  2. Затем платформа выполняет два запроса к основной таблице регистра с учетом периода с 10.05.2019 до 01.06.2019: первый запрос по счету ДТ, второй по счету КТ. Посмотрите в тексте запроса, что часть с ДТ делает сумму отрицательной.
  3. В заключении данные итогов из шага 1 корректируются данными из основных таблиц регистра (из шага 2) и мы получаем рассчитанное значение остатка.
  4. Профит!

Этот запрос уже значительно "тяжелее" для выполнения, т.к. платформе 1С приходится "заглянуть" в основные таблицы регистра. Даже с учетом отборов по счету и организации данных для обработки может быть очень много. Отбор может быть просто неселективным и на уровне СУБД будет выполнено сканирование таблицы.

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

Добавим немного субконто

Пойдем дальше и добавим в наш запрос аналитику субконто и ресурс "Количество". В примере делал отбор по счету с 2 субконто, поэтому и в запросе выведено только два поля.

ВЫБРАТЬ
	ХозрасчетныйОстатки.Организация КАК Организация,
	ХозрасчетныйОстатки.Счет КАК Счет,
	ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
	ХозрасчетныйОстатки.Субконто2 КАК Субконто2,
	ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток,
	ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаОстатокДт,
	ХозрасчетныйОстатки.СуммаОстатокКт КАК СуммаОстатокКт,
	ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоОстаток,
	ХозрасчетныйОстатки.КоличествоОстатокДт КАК КоличествоОстатокДт,
	ХозрасчетныйОстатки.КоличествоОстатокКт КАК КоличествоОстатокКт
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, , Организация = &Организация) КАК ХозрасчетныйОстатки

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

 
 Служебные данные по счетам и их настройки

Основной запрос в этот раз также значительно вырос в объеме.

 
 Основной запрос к данным

Итоги по счетам теперь уже не используются, т.к. в них нет аналитики субконто. Вместо этого мы используем таблицу итогов "ИтогиПоСчетамССубконто2", т.к. в параметрах виртуальной таблицы используется счет с 2 субконто. Принцип работы запроса теперь такой:

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

На последнем этапе платформа 1С "подчищает" за собой служебные временные таблицы.

 
 Очистка временных таблиц

Интересными моментами в примере могут быть следующие:

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

ELSE 
    CASE 
        WHEN CAST(NULL AS BINARY(1)) IS NOT NULL 
        THEN 0x00000000 
    END 
END AS Value1_RTRef, -- Тип ссылки субконто 1

* Для расчета показателей по ДТ или КТ в запросе явно присутствует условие по виду счета (активный, пассивный или активно-пассивный), которое комбинируется с проверкой значения ресурса (положительное или отрицательное). Вот так, например, выглядит расчет суммы остатка по ДТ и КТ:

CASE 
    WHEN CAST(SUM(T2.Fld790Balance_) AS NUMERIC(27, 2)) IS NULL 
    THEN 0.0 
    ELSE CAST(SUM(T2.Fld790Balance_) AS NUMERIC(27, 2)) 
END AS Fld790Balance_, -- СуммаОстаток
CASE 
    WHEN CAST(SUM(T2.Fld790Balance_) AS NUMERIC(27, 2)) IS NULL 
    THEN 0.0 WHEN MAX(T17._Kind) = 0.0 OR MAX(T17._Kind) = 2.0 AND CAST(SUM(T2.Fld790Balance_) AS NUMERIC(27, 2)) > 0.0 
    THEN CAST(SUM(T2.Fld790Balance_) AS NUMERIC(27, 2)) 
    ELSE 0.0 END 
AS Fld790BalanceDt_, -- СуммаОстатокДт
CASE 
    WHEN CAST(SUM(T2.Fld790Balance_) AS NUMERIC(27, 2)) IS NULL 
    THEN 0.0 WHEN MAX(T17._Kind) = 1.0 OR MAX(T17._Kind) = 2.0 AND CAST(SUM(T2.Fld790Balance_) AS NUMERIC(27, 2)) < 0.0 
    THEN -CAST(SUM(T2.Fld790Balance_) AS NUMERIC(27, 2)) 
    ELSE 0.0 
END AS Fld790BalanceCt_, -- СуммаОстатокКт

Поле "_Kind" может принимать следующие значения:

  • 0 - активный
  • 1 - пассивный
  • 2 - активно-пассивный

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

Отбор по виду субконто

Рассмотрим еще один пример. Добавим в наш запрос указание вида субконто в параметр виртуальной таблицы.

ВЫБРАТЬ
	ХозрасчетныйОстатки.Организация КАК Организация,
	ХозрасчетныйОстатки.Валюта КАК Валюта,
	ХозрасчетныйОстатки.Подразделение КАК Подразделение,
	ХозрасчетныйОстатки.Счет КАК Счет,
	ХозрасчетныйОстатки.Субконто1 КАК Субконто1,
	ХозрасчетныйОстатки.СуммаОстаток КАК СуммаОстаток,
	ХозрасчетныйОстатки.СуммаОстатокДт КАК СуммаОстатокДт,
	ХозрасчетныйОстатки.СуммаОстатокКт КАК СуммаОстатокКт,
	ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоОстаток,
	ХозрасчетныйОстатки.КоличествоОстатокДт КАК КоличествоОстатокДт,
	ХозрасчетныйОстатки.КоличествоОстатокКт КАК КоличествоОстатокКт
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Остатки(&Период, Счет = &Счет, &СубконтоНоменклатура, Организация = &Организация) КАК ХозрасчетныйОстатки

На самом деле SQL-запросы платформы будут не сильно отличаться от предыдущего примера. Единственное отличие - это появление дополнительных отборов по виду субконто в служебных запросах.

SELECT
    T1._Acc22_IDRRef,
    T1._Fld782,
    T1._Fld780,
    T1._TurnoverOnly
FROM dbo._Acc22_ExtDim779 T1
WHERE ((T1._Fld774 = @P1))
    -- !!! Новый отбор по виду субконто
    AND ((T1._DimKindRRef = @P2)
    AND ((T1._Acc22_IDRRef = @P3)))

INSERT INTO #tt18 WITH(TABLOCK)
    (_IDRRef, _LineNo1, _Cnt)
SELECT
    T1._IDRRef,
    T2._LineNo,
    CAST(COUNT_BIG(T3._Acc22_IDRRef) AS NUMERIC(12))
FROM dbo._Acc22 T1
    INNER JOIN dbo._Acc22_ExtDim779 T2
    ON T2._Acc22_IDRRef = T1._IDRRef
        -- !!! Новый отбор по виду субконто
        AND T2._DimKindRRef = @P1
        AND T2._Fld774 = T1._Fld774
    LEFT OUTER JOIN dbo._Acc22_ExtDim779 T3
    ON T3._Acc22_IDRRef = T1._IDRRef AND T3._Fld774 = T1._Fld774
WHERE ((T1._Fld774 = @P2)) AND ((T1._IDRRef = @P3))
GROUP BY 
    T1._IDRRef,
    T2._LineNo

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

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

Что нужно учитывать

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

  • Наличие рассчитанных итогов и их период. А также использование текущих итогов. Не забывайте их обслуживать :)
  • Количество субконто у счетов, а также максимально допустимое количество субконто для основного плана счетов регистра.
  • Настройка хранения итогов "Только обороты", которая влияет на хранение значений итогов в таблицах. Подробнее об этом рассказывалось здесь.

Но общий принцип работы виртуальной таблицы будет тот же, что и в примерах выше.

Вместо заключения

Пока что все в части работы виртуальной таблицы "Остатки" регистра бухгалтерии. Остается еще пару тем, которые будут затронуты в будущих публикациях:

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

Ссылки на предыдущие статьи по регистру бухгалтерии даны в конце.

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

На этом все. Удачи и до связи!

Другие ссылки

Авторские разработки

 
 Другие разработки (бесплатные и за $m)

Регистры бухгалтерии остатки sql внутреннее устройство

См. также

Расширяем возможности дополнительных обработок и настраиваем их отладку

БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

07.02.2024    2346    YA_418728146    11    

40

Регистры накопления в 1С:КА2 и 1С:ERP для расчета НДФЛ, страховых взносов и взаиморасчетов с сотрудниками на январь 2024 года. Краткое описание

Зарплата Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет НДФЛ Абонемент ($m)

Для расчета зарплаты и соответствующих налогов в конфигурациях 1С:КА2 и 1С:ERP используется 22 регистра накопления, 7 регистров сведений, 1 регистр расчета и бухгалтерские проводки. В таблице приведены названия этих регистров, указаны основные регистраторы и виды движений приход/расход. В описании приводится краткое функциональное назначение регистров в основных зарплатных процессах. Описание регистров родилось из черновиков при написании различных отчетов и обработок при эксплуатации 1С-овских конфигураций и исправлении ошибок по НДФЛ, взаиморасчетов с сотрудниками и прочих. Информация не претендует на полноценное описание работы регистров, скорее это дискуссионный материал. Но, возможно, кому-то пригодится и сократит время при подготовке отчетности за непростой (в плане учета зарплаты) 2023 год. А возможно, кто-то поделится своим опытом.

1 стартмани

10.01.2024    1013    6    2ncom    3    

8

Шаблоны новых объектов 1С для 1С:Бухгалтерии предприятия

Инструментарий разработчика БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Платформа 1С v8.3 1С:Бухгалтерия 3.0 Бесплатно (free)

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

28.12.2023    4822    mrXoxot    11    

99

Ключи аналитик учета в ЕРП, КА, УТ

Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 Россия Управленческий учет Бесплатно (free)

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

08.11.2023    7018    ids79    25    

74

Распределение по базе среднего в ЗИКГУ 3.1

Зарплата Механизмы типовых конфигураций Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 Россия Бюджетный учет Абонемент ($m)

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

1 стартмани

14.09.2023    444    2    Vlx    0    

1

Расширение типового механизма настройки заполнения бухгалтерской отчетности (на примере конфигурации 1С:ERP. Управление холдингом 3.1.8.15)

Механизмы типовых конфигураций Платформа 1С v8.3 1С:Управление холдингом 1С:Франчайзи, автоматизация бизнеса Россия Бесплатно (free)

В статье приведен алгоритм доработок типового механизма настройки заполнения бухгалтерской отчетности на примере конфигурации 1С:ERP. Управление холдингом (3.1.8.15). Цель доработок - сделать процесс настроек более гибким и удобным для пользователей

11.09.2023    1924    ICL-Soft    3    

12

Разбор механизма "Настройки полей формы" в 1С:ERP. Управление холдингом

Механизмы типовых конфигураций Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В данной статье я постараюсь разобрать механизм, который Вам может встретиться на просторах типовой конфигурации 1С:ERP. Управление холдингом. Я не могу гарантировать, что этот механизм не исключат из следующих версий конфигурации (как, собственно, и любой другой). К сожалению, мне не удалось найти его ни в одном модуле конфигурации "Библиотеки стандартных подсистем". Мне он показался интересным, и захотелось более детально во всем этом разобраться.

18.07.2023    2153    it_box    1    

7

Работа с контактной информацией. Часть 2

Механизмы типовых конфигураций Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

05.06.2023    6946    biimmap    4    

41
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. alexey_kurdyukov 155 27.08.20 09:46 Сейчас в теме
Я всегда подозревал регистры бухгалтерии в чем-то таком.
user2021629; Innuil; XANDE; Merkalov; ovasiliev; YPermitin; +6 Ответить
2. aM4Ze 10.08.22 09:43 Сейчас в теме
Спасибо за статью!

- Подготовка служебной таблицы с информацией по счетам
INS ERT INTO #tt7 (_IDRRef,_ED1,_ED2,_RF1,_RF2,_BRF1,_BRF2) VALUES(@P1,@P2,@P3,@P4,@P5,@P6,@P7)


Попробую рассказать, что в служебной таблице.
В таблице находятся следующая информация:
_IDRRef - счет

_ED[1-n] -где n максимальное количество субконто. Этот флаг определяет в дальнем как будет отображаться данное субконто в таблице итогов значение или NULL) определяется по свойству "ТолькоОбороты". Истина - (ТолькоОбороты=ложь), Ложь - (ТолькоОбороты=Истина) (

_RF[1-n] -где n количество ресурсов. определяет флаг отвечающие за обороты _TurnoverDt, _TurnoverСt каждого ресурса.
_BRF[1-n] - де n количество ресурсов определяет флаг наборов отвечающие за сумму и общий оборот каждого ресурса.


Например, Регистр бухгалтерии, два ресурса (Сумма и Сумма2), максимальное количество субкотно = 3. У нас есть счет 55 с двумя субконто, у второго субконто стоит "ТолькоОбороты"
В таблице будет две строки. Первая будет следующего вида.

Счет_55[_IDRRef], Истина[_ED1], Истина[_ED2], Истина[_ED3],  Истина[_RF1], Истина[_RF2],  ЛОЖЬ[_BRF1], ЛОЖЬ[_BRF2]


Вторая строка:

Счет_55[_IDRRef], Истина[_ED1], ЛОЖЬ[_ED2]("ТолькоОбороты=Истина"), Истина[_ED3], ЛОЖЬ[_RF1], ЛОЖЬ[_RF2],  Истина[_BRF1], Истина[_BRF2]



Судя из логики пересчета Итогов, где:

CASE WHEN T8._ED1 = 0x01 THEN T7._EDValue1_TYPE ELSE CAST(NULL AS BINARY(1)) END AS EDValue1_TYPE,
CASE WHEN T8._ED1 = 0x01 THEN T7._EDValue1_RTRef ELSE CASE WHEN CAST(NULL AS BINARY(1)) IS NOT NULL THEN 0x00000000 END END AS EDValue1_RTRef,
CASE WHEN T8._ED1 = 0x01 THEN T7._EDValue1_RRRef ELSE CASE WHEN CAST(NULL AS BINARY(1)) IS NOT NULL THEN 0x00000000000000000000000000000000 END END AS EDValue1_RRRef,
CASE WHEN T8._ED2 = 0x01 THEN T7._EDValue2_TYPE ELSE CAST(NULL AS BINARY(1)) END AS EDValue2_TYPE,
CASE WHEN T8._ED2 = 0x01 THEN T7._EDValue2_RTRef ELSE CASE WHEN CAST(NULL AS BINARY(1)) IS NOT NULL THEN 0x00000000 END END AS EDValue2_RTRef,
CASE WHEN T8._ED2 = 0x01 THEN T7._EDValue2_RRRef ELSE CASE WHEN CAST(NULL AS BINARY(1)) IS NOT NULL THEN 0x00000000000000000000000000000000 END END AS EDValue2_RRRef,
CASE WHEN T8._ED3 = 0x01 THEN T7._EDValue3_TYPE ELSE CAST(NULL AS BINARY(1)) END AS EDValue3_TYPE,
CASE WHEN T8._ED3 = 0x01 THEN T7._EDValue3_RTRef ELSE CASE WHEN CAST(NULL AS BINARY(1)) IS NOT NULL THEN 0x00000000 END END AS EDValue3_RTRef,
CASE WHEN T8._ED3 = 0x01 THEN T7._EDValue3_RRRef ELSE CASE WHEN CAST(NULL AS BINARY(1)) IS NOT NULL THEN 0x00000000000000000000000000000000 END END AS EDVal ue3_RRRef,
CASE WHEN T8._BRF1 = 0x01 THEN T7.Сумма ELSE CAST(NULL AS NUMERIC(38, 8)) END AS Сумма,
CASE WHEN T8._RF1 = 0x01 THEN T7._TurnoverDtСумма ELSE CAST(NULL AS NUMERIC(38, 8)) END AS _TurnoverDtСумма,
CASE WHEN T8._RF1 = 0x01 THEN T7._TurnoverCtСумма ELSE CAST(NULL AS NUMERIC(38, 8)) END AS _TurnoverCtСумма,
CASE WHEN T8._BRF1 = 0x01 THEN T7._TurnoverСумма ELSE CAST(NULL AS NUMERIC(38, 8)) END AS _TurnoverСумма,
CASE WHEN T8._BRF2 = 0x01 THEN T7.Сумма2 ELSE CAST(NULL AS NUMERIC(38, 8)) END AS Сумма2,
CASE WHEN T8._RF2 = 0x01 THEN T7._TurnoverDtСумма2 ELSE CAST(NULL AS NUMERIC(38, 8)) END AS _TurnoverDtСумма2,
CASE WHEN T8._RF2 = 0x01 THEN T7._TurnoverCtСумма2 ELSE CAST(NULL AS NUMERIC(38, 8)) END AS _TurnoverCtСумма2,
CASE WHEN T8._BRF2 = 0x01 THEN T7._TurnoverСумма2 ELSE CAST(NULL AS NUMERIC(38, 8)) END AS _TurnoverСумма2

Произойдет расщепление на две строки, где одна будет содержать только обороты _TurnoverDtСумма, _TurnoverCtСумма, _TurnoverDtСумма2, _TurnoverCtСумма2
И строку содержащую аналитику по Сумма, _TurnoverСумма для всех субконто, без участия оборотов по дт, кт (_TurnoverDtСумма, _TurnoverCtСумма, _TurnoverDtСумма2, _TurnoverCtСумма2).

Если у счета нет ни одного субконто с флагом "ТолькоОбороты", в служебной таблице будет одна запись и в таблице итогов будет одна строка с аналитикой по всем суммам.
Счет_55[_IDRRef], Истина[_ED1], Истина[_ED2], Истина[_ED3], Истина[_RF1], Истина[_RF2],  Истина[_BRF1], Истина[_BRF2]


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

Счет_55[_IDRRef], Истина[_ED1], Истина[_ED2], 						Истина[_ED3],  Истина[_RF1], Истина[_RF2],   ЛОЖЬ[_BRF1], ЛОЖЬ[_BRF2]  
Счет_55[_IDRRef], Истина[_ED1], ЛОЖЬ[_ED2]("ТолькоОбороты=Истина"), Истина[_ED3],    ЛОЖЬ[_RF1],   ЛОЖЬ[_RF2], Истина[_BRF1], Истина[_BRF2]  
3. Tatoshka_ 20 01.06.23 20:41 Сейчас в теме
добрый день, а подскажите есть маленький запрос в 1с, который отробатывает за 9 сек, выгружает остатки по расчетным счетам организации, при чем тормозит скульник и выполняет он его более 3 минут, как его оптимизировать, или без вариантов?
4. user1973808 13.03.24 14:02 Сейчас в теме
Если еще остался вопрос по назначению колонок _ED[n], _RF[m] и _BRF[m].
_ED[n] - ExternalDimension (внешнее измерение) по отношению к обычным (Период, Организация, Валюта, Подразделение, и прочие) измерениям субконто является внешним и описывает аналитический учет, n - номер субконто. Признак наличия соответствующего субконто по номеру: 1, 2, 3 (максимальное количество субконто).
_RF[m] - ResourseFlag (флаг ресурса 0 или 1), рассчитывать ли ОборотДт и ОборотКт для ресурса за месяц, m - номер ресурса. Например, если ресурс i ВалютнаяСумма отключен признаком учета Валютный для счета, то _RF[i] = 0 и ОборотДт будет Null (как и ОборотКт).
_BRF[m] - BoundaryResourseFlag (флаг граничных значений ресурса), рассчитывать ли Остаток и (ОборотДт - ОборотКт) граничные значения ресурса - входящая сумма из предыдущего месяца и исходящая сумма в следующий месяц, m - номер ресурса. Если включен флаг ТолькоОбороты, то нет смысла рассчитывать входящие и исходящие суммы, там будет Null.
Флаги в приложении MS SQL платформа 1С хранит и оперирует в вычислениях с помощью типа BINARY(1) - массив однобайтовых чисел фиксированного размера 1, то есть всегда 1 байт. Строковые типы в отличие от него просто автоматически преобразуются в символы. Литералы в коде типа BINARY(1) записываются в шестнадцатеричной форме, например 0 == 0x00, 1 == 0x01, 255 == 0xFF. Для хранения флагов лучше подходит тип BIT, но тогда все флаги при создании таблицы CRE ATE TABLE должны идти подряд. При оперировании в вычислениях лучше использовать тип TINYINT (однобайтовый), а для простоты вообще INT (4-х байтовый).
Оставьте свое сообщение