Как правильно оформить списание и оприходование товаров в одном документе 1С?

Программист 1С v8.3 (Управляемые формы) Управленческий учет IT и автоматизация бизнеса
← На главную

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

Разбор типичной ошибки

Основная сложность заключается в неверном использовании метода Очистить(). Когда вы используете конструктор движений для каждой табличной части отдельно, он по умолчанию вставляет в код команды очистки и установки флага записи. Если в процедуре ОбработкаПроведения вы дважды вызываете Движения.ИмяРегистра.Очистить(), то вторым вызовом вы просто удаляете те записи, которые создали в первой части кода.

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

Пошаговое решение задачи

Чтобы реализовать одновременное проведение списания и оприходования товаров, выполним следующие действия:

  1. Подготовим набор записей регистра, вызвав очистку один раз в самом начале процедуры.
  2. Установим флаг Записывать = Истина, чтобы платформа поняла, что набор записей нужно сохранить после завершения процедуры.
  3. Последовательно пройдем циклом по первой табличной части, создавая движения с видом Расход.
  4. Затем пройдем циклом по второй табличной части, создавая движения с видом Приход в тот же самый набор записей.

Пример правильной реализации кода

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


Процедура ОбработкаПроведения(Отказ, Режим)
    
    // Подготавливаем регистр один раз для всех операций
    Движения.ТоварыНаСкладах.Записывать = Истина;
    Движения.ТоварыНаСкладах.Очистить();
    
    // Блок 1: Обработка списания (Расход)
    Для Каждого ТекСтрокаМатериалы Из Материалы Цикл
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Склад = Склад;
        Движение.Номенклатура = ТекСтрокаМатериалы.Номенклатура;
        Движение.ХарактеристикаНоменклатуры = ТекСтрокаМатериалы.ХарактеристикаНоменклатуры;
        Движение.Количество = ТекСтрокаМатериалы.Количество;
    КонецЦикла;
    
    // Блок 2: Обработка оприходования (Приход)
    Для Каждого ТекСтрокаОприходование Из ОприходованиеПроводов Цикл
        Движение = Движения.ТоварыНаСкладах.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Склад = СкладПриход;
        Движение.Номенклатура = ТекСтрокаОприходование.Номенклатура;
        Движение.ХарактеристикаНоменклатуры = ТекСтрокаОприходование.ХарактеристикаНоменклатуры;
        Движение.Количество = ТекСтрокаОприходование.Количество;
    КонецЦикла;

КонецПроцедуры

Ключевые рекомендации для программиста

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

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

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

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

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

← На главную