Проверить, что незаписанные движения не попали в остатки и обороты базы

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

Используем собственный уникальный код и явные списки полей. Остатки и Обороты читают информационную базу, а не существующий объект набора в памяти.

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

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

Подготовка

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

  2. Документы → Добавить: УчебноеДвижение85. Номер: Строка длиной 40, автонумерация выключена. Модули объекта и менеджера оставьте пустыми; не добавляйте обработчики, подписки и обязательные пользовательские реквизиты.

  3. Регистры накопления → Добавить: УчебныеОстатки85. Вид регистра Остатки. Единственное измерение КодТовара: Строка 50, индексировать, проверка заполнения Показывать ошибку. Единственный ресурс Количество: Число 12,3, неотрицательное. Дополнительных реквизитов нет.

  4. В списке регистраторов выберите только собственный документ УчебноеДвижение85. Оставьте модули регистра пустыми, использование итогов включённым. Планы обмена, разделители, историю данных и фоновые задания для урока не создавайте.

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

  6. Первые задачи работают с незаписанными наборами. Только задачи с пометкой «в собственной транзакции» временно записывают два собственных документа и движения, затем обязательно отменяют транзакцию. В рабочей базе этот код не запускайте.

Если Метаданные.Документы.Количество() <> 1
    Или Метаданные.РегистрыНакопления.Количество() <> 1
    Или Метаданные.Документы.Найти("УчебноеДвижение85") = Неопределено Тогда
    ВызватьИсключение "Разрешены только собственный учебный документ и регистр";
КонецЕсли;
Описание = Метаданные.РегистрыНакопления.Найти("УчебныеОстатки85");
Если Описание = Неопределено Тогда
    ВызватьИсключение "Сначала создайте собственный учебный регистр";
КонецЕсли;
Если Описание.ВидРегистра <> Метаданные.СвойстваОбъектов.ВидРегистраНакопления.Остатки
    Или Описание.Измерения.Количество() <> 1
    Или Описание.Ресурсы.Количество() <> 1
    Или Описание.Реквизиты.Количество() <> 0
    Или Описание.Измерения.Найти("КодТовара") = Неопределено
    Или Описание.Ресурсы.Найти("Количество") = Неопределено Тогда
    ВызватьИсключение "Нужен регистр остатков с КодТовара и Количество";
КонецЕсли;
Менеджер = РегистрыНакопления.УчебныеОстатки85;
Код = "TRAIN-" + Строка(Новый УникальныйИдентификатор);
СсылкаНаНесохраненный = Документы.УчебноеДвижение85.ПолучитьСсылку(Новый УникальныйИдентификатор);
Набор = Менеджер.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(СсылкаНаНесохраненный);
Приход = Набор.ДобавитьПриход();
Приход.Период = Дата(2026, 9, 15, 10, 0, 0);
Приход.Регистратор = СсылкаНаНесохраненный;
Приход.Активность = Истина;
Приход.КодТовара = Код;
Приход.Количество = 3;
Расход = Набор.ДобавитьРасход();
Расход.Период = Дата(2026, 9, 15, 11, 0, 0);
Расход.Регистратор = СсылкаНаНесохраненный;
Расход.Активность = Истина;
Расход.КодТовара = Код;
Расход.Количество = 1;
Если Не Менеджер.ПолучитьИспользованиеИтогов() Тогда
    ВызватьИсключение "В учебном регистре должны быть включены итоги";
КонецЕсли;
ОтборТовара = Новый Структура("КодТовара", Код);
ПослеРасхода = Новый Граница(Дата(2026, 9, 15, 11, 0, 0), ВидГраницы.Включая);
ОстаткиБазы = Менеджер.Остатки(ПослеРасхода, ОтборТовара, "КодТовара", "Количество");
ОборотыБазы = Менеджер.Обороты(Дата(2026, 9, 15), Дата(2026, 9, 16), ОтборТовара, "КодТовара", "Количество");
Сообщить(Набор.Количество() = 2);
Сообщить(ОстаткиБазы.Количество() = 0);
Сообщить(ОборотыБазы.Количество() = 0);
Сообщить(ОстаткиБазы.Колонки.Найти("Количество") <> Неопределено);
Сообщить(ОборотыБазы.Колонки.Найти("КоличествоПриход") <> Неопределено);
Сообщить(ОборотыБазы.Колонки.Найти("КоличествоРасход") <> Неопределено);
Сообщить("Два движения существуют только в памяти; итогов для этого кода в базе нет.");

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

  1. Набор с приходом 3 и расходом 1 не записан. Уникальный учебный код исключает чтение чужого товара.

  2. ОтборТовара содержит имя измерения ровно как в метаданных. Явно запрашиваем КодТовара и Количество.

  3. Остатки получает включающую границу после учебного расхода. Возвращённая таблица базы пустая.

  4. Обороты для регистра Остатки создаёт колонки КоличествоПриход и КоличествоРасход, даже если строк для кода нет.

  5. Количество строк собственного набора равно 2, а обе таблицы базы пусты: нахождение объекта в памяти не обновляет итоги.

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

  1. Шесть сравнений Истина. В таблице Остатки колонка ресурса называется Количество, без суффикса Остаток.

  2. В таблице Обороты есть две колонки ресурса; сохранённых данных по собственному коду нет.

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

Различие между набором в памяти и итогами базы доказано отдельным контролируемым чтением.

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

  1. Менеджер.Остатки и виртуальная таблица запроса РегистрНакопления....Остатки имеют разные соглашения по именам колонок.

  2. Для регистра вида Обороты структура ресурсов результата другая; этот урок настроен именно для Остатки.

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

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

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

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

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

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