Как программно заполнить документ Корректировка регистров и его движения

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

Документ Корректировка регистров является универсальным инструментом в типовых конфигурациях 1С (таких как ERP, КА, УТ 11, БП 3.0), позволяющим вносить ручные правки в любые регистры системы (удобно через универсальный инструмент массового изменения записей регистров). Однако при его программном создании разработчики часто сталкиваются с тем, что движения записываются в базу, но не отображаются в форме документа, или документ вовсе остается пустым. В этой статье мы подробно разберем, как правильно заполнить этот документ кодом, чтобы он корректно работал и в базе данных, и в пользовательском интерфейсе.

Постановка задачи

Представим ситуацию: нам необходимо программно создать документ Корректировка регистров и заполнить в нем движения по конкретному регистру накопления (например, РаспределениеЗапасовДвижения) на основании данных некоторого запроса — для этого подойдёт автоматический поиск и исправление отрицательных остатков в регистрах. Мы разберем пошаговый алгоритм решения этой задачи.

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

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


НовыйДок = Документы.КорректировкаРегистров.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДата();
НовыйДок.УстановитьНовыйНомер();
// Указываем, что это ручная корректировка (значение может зависеть от конфигурации)
НовыйДок.Операция = Перечисления.ОперацииКорректировкиРегистров.РучнаяКорректировка;

Шаг 2: Обеспечение видимости регистров в интерфейсе

Это самый важный нюанс, который часто упускают. В документе Корректировка регистров есть служебная табличная часть (обычно называется ТаблицаРегистров), которая хранит список имен регистров, по которым данный документ делает движения. Если вы не добавите туда строку с именем нужного регистра, пользователь, открыв документ, увидит пустую форму без вкладок, даже если движения в базе данных физически существуют.

Проанализируем, как добавить запись в эту таблицу:


НоваяСтрокаТЧ = НовыйДок.ТаблицаРегистров.Добавить();
НоваяСтрокаТЧ.Имя = "РаспределениеЗапасовДвижения"; // Имя регистра, как оно задано в метаданных

Важный момент: если вы планируете корректировать несколько разных регистров в одном документе, для каждого из них нужно добавить отдельную строку в ТаблицаРегистров. Это правило универсально, будь то товарные склады или корректировка регистра "Зарплата к выплате".

Шаг 3: Программное заполнение движений

Теперь перейдем к непосредственному заполнению движений. Мы будем использовать коллекцию Движения объекта документа. Рассмотрим пример заполнения регистра накопления в цикле по результатам выборки запроса.


// Устанавливаем флаг необходимости записи набора
НовыйДок.Движения.РаспределениеЗапасовДвижения.Записывать = Истина;

Пока Выборка.Следующий() Цикл
    // Добавляем новую запись в набор движений
    Движение = НовыйДок.Движения.РаспределениеЗапасовДвижения.Добавить();
    
    // Заполняем обязательные служебные поля
    Движение.Период = НовыйДок.Дата;
    Движение.Активность = Истина;
    
    // Для регистров накопления важно указать ВидДвижения (Приход или Расход)
    Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
    
    // Заполняем измерения регистра (зависят от конкретного регистра)
    Движение.Номенклатура = Выборка.Номенклатура;
    Движение.Склад = Выборка.Склад;
    
    // Если в регистре есть измерения типа "Ключ аналитики", их нужно получить заранее
    // Движение.АналитикаУчетаНоменклатуры = ...;
    
    // Заполняем ресурсы
    Движение.Количество = Выборка.Количество;
    
    // Дополнительные реквизиты (если есть)
    Движение.Сторно = Ложь;
КонецЦикла;

Шаг 4: Запись документа

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


Попытка
    НовыйДок.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Документ успешно создан: " + НовыйДок.Ссылка);
Исключение
    Сообщить("Ошибка при записи документа: " + ОписаниеОшибки());
КонецПопытки;

Оптимизация: использование метода Загрузить()

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

Разберем этот способ:


ТЗ_Движений = Запрос.Выполнить().Выгрузить();
// Важно добавить служебные колонки, если их нет в запросе
Если ТЗ_Движений.Колонки.Найти("Период") = Неопределено Тогда
    ТЗ_Движений.Колонки.Добавить("Период");
    ТЗ_Движений.ЗаполнитьЗначения(НовыйДок.Дата, "Период");
КонецЕсли;

ТЗ_Движений.Колонки.Добавить("Активность");
ТЗ_Движений.ЗаполнитьЗначения(Истина, "Активность");

// Загружаем всю таблицу сразу в набор движений
НовыйДок.Движения.РаспределениеЗапасовДвижения.Загрузить(ТЗ_Движений);
НовыйДок.Движения.РаспределениеЗапасовДвижения.Записывать = Истина;

Рекомендации и технические тонкости

  1. Аналитика учета номенклатуры: В современных конфигурациях (ERP 2, УТ 11) во многих регистрах вместо прямой ссылки на Номенклатура используется измерение АналитикаУчетаНоменклатуры. Перед заполнением движений убедитесь, что вы получили правильный ключ аналитики, иначе отчеты (например, "Ведомость по товарам") могут показывать некорректные данные, что потребует сравнения регистров "Товары на складах" и "Товары организаций".
  2. Период записи: Период движений в корректировке обычно совпадает с датой документа. Однако, если вы делаете исправления «задним числом», помните, что это может повлиять на итоги в закрытых периодах, как и при автоматической корректировке РБП.
  3. Вид движения: Никогда не забывайте устанавливать ВидДвижения (Приход/Расход) для регистров накопления. По умолчанию он может установиться в Приход, что приведет к ошибкам в учете, если вы планировали списание, и к необходимости устранения расхождений между регистрами в УТ 11 — поможет диагностика регистров и удаление битых ссылок.
  4. Флаг Активность: Всегда устанавливайте Движение.Активность = Истина. Если запись будет неактивной, она сохранится в базе, но не будет учитываться при расчете остатков и оборотов.

Подведем итог: секрет успешного программного заполнения Корректировки регистров кроется в трех составляющих: добавление записи в ТЧ ТаблицаРегистров (для интерфейса), заполнение коллекции Движения (для данных) и установка флага Записывать = Истина (для фиксации изменений в БД). Для решения этой задачи есть обработка программного заполнения документа Корректировка регистров.

← На главную