Сравнить непериодическую цену с историей цен и настройками срезов

Учебные задачи

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

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Создайте НОВУЮ пустую файловую базу. В Конфигураторе корню задайте имя Учебная85; не добавляйте учебные регистры в рабочую УТ/КА2/УНФ/БП.

  2. Регистры сведений → Добавить: УчебныеЦены. Режим записи Независимый, периодичность Непериодический. Измерение КодТовара: Строка, длина 50, индексировать. Ресурс Цена: Число, 12 цифр, 2 дробных, неотрицательное.

  3. Проверку заполнения измерения установите Показывать ошибку. Модуль набора записей оставьте ПУСТЫМ; обработчики записи, обмена, фоновые задания и внешние сервисы для урока не создавайте.

  4. Обновите конфигурацию базы данных. Создайте серверный общий модуль УчебныеЗадачи и команду учебной обработки для вызова ВыполнитьПример() Экспорт.

  5. Фрагмент вставьте в тело ВыполнитьПример. Каждую задачу запускайте отдельно. Вымышленные коды не являются справочными ссылками на рабочие товары.

  6. Создайте второй независимый регистр УчебнаяИсторияЦен: периодичность В пределах секунды, измерение КодТовара (Строка 50, индексировать), ресурс Цена (Число 12,2, неотрицательное). Модуль также пустой.

  7. Обновите конфигурацию базы данных. Код первого регистра не заменяйте именем рабочего регистра цен.

  8. У УчебнаяИсторияЦен включите ОсновнойОтборПоПериоду; РазрешитьИтогиСрезПервых и РазрешитьИтогиСрезПоследних выключите. Обновите конфигурацию БД.

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

Описание = Метаданные.РегистрыСведений.Найти("УчебнаяИсторияЦен");
Если Описание = Неопределено Тогда
    ВызватьИсключение "Сначала подготовьте собственный учебный регистр";
КонецЕсли;
Если Описание.РежимЗаписи <> Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.Независимый
    Или Описание.ПериодичностьРегистраСведений <> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Секунда Тогда
    ВызватьИсключение "Настройки учебного регистра не соответствуют подготовке";
КонецЕсли;
Если Описание.Измерения.Количество() <> 1
    Или Описание.Измерения.Найти("КодТовара") = Неопределено
    Или Описание.Ресурсы.Найти("Цена") = Неопределено Тогда
    ВызватьИсключение "Нужны одно измерение КодТовара и ресурс Цена";
КонецЕсли;
Непериодический = Метаданные.РегистрыСведений.Найти("УчебныеЦены");
Если Непериодический = Неопределено Тогда
    ВызватьИсключение "Нужен также собственный непериодический регистр УчебныеЦены";
КонецЕсли;
ЕстьПериодВИстории = Ложь;
Для Каждого Поле Из Описание.СтандартныеРеквизиты Цикл
    Если Поле.Имя = "Период" Тогда ЕстьПериодВИстории = Истина; КонецЕсли;
КонецЦикла;
ЕстьПериодВЦенах = Ложь;
Для Каждого Поле Из Непериодический.СтандартныеРеквизиты Цикл
    Если Поле.Имя = "Период" Тогда ЕстьПериодВЦенах = Истина; КонецЕсли;
КонецЦикла;
Сообщить(ЕстьПериодВИстории);
Сообщить(Не ЕстьПериодВЦенах);
Сообщить(Описание.ОсновнойОтборПоПериоду);
Сообщить(Не Описание.РазрешитьИтогиСрезПервых);
Сообщить(Не Описание.РазрешитьИтогиСрезПоследних);
Сообщить("Режим блокировки: " + Строка(Описание.РежимУправленияБлокировкойДанных));

Разбор по шагам

  1. Защитный блок выбирает УчебнаяИсторияЦен с периодичностью В пределах секунды, а второй объект описывает непериодические УчебныеЦены.

  2. Перебираем стандартные поля каждой схемы и ищем имя Период, не вызывая Найти у ОписанияСтандартныхРеквизитов.

  3. ОсновнойОтборПоПериоду проверяем по подготовке. Это включение поля Период в основной отбор, не конкретное условие даты.

  4. Оба разрешения итогов выключены по подготовке. Код ничего не пересчитывает и не отключает в рабочей базе.

  5. РежимУправленияБлокировкойДанных только читается; никакая блокировка не устанавливается.

Как проверить результат

  1. Пять логических сообщений дают Истина.

  2. Период присутствует в стандартных полях истории, отсутствует у непериодического регистра; КодТовара остаётся измерением обоих.

Ожидаемый результат

Показана связь периодичности со стандартным полем и отделены настройки оптимизации срезов.

На что обратить внимание

  1. СрезПервых/СрезПоследних — операции чтения данных, а эти свойства описывают разрешение специальных таблиц итогов.

  2. Даже разрешённые итоги не всегда используются: влияют условия по полям и ограничения доступа.

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

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.