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

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

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

Пошаговый алгоритм решения задачи

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

  1. Создать сам объект документа и заполнить его основные реквизиты (организация, дата, содержание).
  2. Сформировать движения по нужным нам регистрам.
  3. Заполнить специальные служебные табличные части документа, которые отвечают за отображение вкладок регистров в форме.

Рассмотрим каждый этап подробнее на практических примерах.

Шаг 1. Создание документа и заполнение шапки

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


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

Важно помнить: для документа ОперацияБух обычно используется РежимЗаписиДокумента.Запись, так как он не имеет стандартной процедуры проведения. Все движения записываются непосредственно вместе с документом.

Шаг 2. Заполнение движений по регистру

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

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


// Работаем с коллекцией движений конкретного документа
ЗаписьРегистра = НовыйДок.Движения.ПараметрыАмортизацииОСБухгалтерскийУчет.Добавить();
ЗаписьРегистра.Период = НовыйДок.Дата;
ЗаписьРегистра.Регистратор = СсылкаНаДок;
ЗаписьРегистра.Организация = НовыйДок.Организация;
// Заполняем остальные реквизиты и измерения
ЗаписьРегистра.ОсновноеСредство = НайденнаяНоменклатура;
ЗаписьРегистра.СтоимостьДляВычисленияАмортизации = 100000;

// Обязательно устанавливаем флаг записи для этого набора движений
НовыйДок.Движения.ПараметрыАмортизацииОСБухгалтерскийУчет.Записывать = Истина;

Если вы предпочитаете использовать НаборЗаписей (как обсуждалось в сообщениях форума), код будет выглядеть так:


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

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Регистратор = СсылкаНаДок;
НоваяЗапись.Период = НовыйДок.Дата;
// Заполнение данных...
ЗаполнитьЗначенияСвойств(НоваяЗапись, ИсточникДанных); 

НаборЗаписей.Записать();

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

Шаг 3. Подключение закладок в интерфейсе (ТаблицаРегистров)

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

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


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

// Если нужно добавить регистр накопления
НоваяСтрокаНакопления = НовыйДок.ТаблицаРегистровНакопления.Добавить();
НоваяСтрокаНакопления.Имя = "НДСПредъявленный";

После заполнения этих таблиц система при открытии формы документа «поймет», какие вкладки нужно отрисовать на экране. Без этого шага данные останутся «невидимыми» для ручного редактирования.

Полный пример итогового кода

Объединим все вышесказанное в единый алгоритм, который можно использовать в обработке заполнения:


Процедура СоздатьОперациюВручнуюНаСервере()
    
    НовыйДок = Документы.ОперацияБух.СоздатьДокумент();
    НовыйДок.Дата = ТекущаяДата();
    НовыйДок.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Организация");
    НовыйДок.Содержание = "Автоматическая загрузка данных";
    
    // 1. Сначала записываем, чтобы получить ссылку
    НовыйДок.Записать();
    
    // 2. Добавляем информацию о регистре в служебную таблицу (для видимости)
    СтрРегистра = НовыйДок.ТаблицаРегистровСведений.Добавить();
    СтрРегистра.Имя = "СчетаУчетаНоменклатуры"; // Пример имени регистра
    
    // 3. Заполняем сами движения
    Движение = НовыйДок.Движения.СчетаУчетаНоменклатуры.Добавить();
    Движение.Регистратор = НовыйДок.Ссылка;
    Движение.Период = НовыйДок.Дата;
    Движение.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("00001");
    Движение.СчетУчета = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
    
    // Устанавливаем флаг записи движений
    НовыйДок.Движения.СчетаУчетаНоменклатуры.Записывать = Истина;
    
    // 4. Финальная запись документа со всеми изменениями
    Попытка
        НовыйДок.Записать(РежимЗаписиДокумента.Запись);
        Сообщить("Документ успешно создан: " + НовыйДок.Ссылка);
    Исключение
        Сообщить("Ошибка при записи: " + ОписаниеОшибки());
    КонецПопытки;
    
КонецПроцедуры

Резюме и рекомендации

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

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

← На главную