Как программно создать документ и перенести данные в его табличную часть в 1С?

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

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

Типичные ошибки при программном заполнении документов

Проанализируем распространенные ошибки, которые мешают корректному заполнению объектов в 1С:

  1. Передача текстовых строк вместо ссылок на справочники и планы счетов. Попытка присвоить реквизиту типа СправочникСсылка.Склады или ПланСчетовСсылка.Хозрасчетный обычное строковое значение (например, "ОсновнойСклад" или "90.01.1") приведет к тому, что платформа либо выдаст ошибку несоответствия типов, либо оставит реквизит пустым. Разные типы данных — это основа платформы 1С. Для присвоения значений ссылочным реквизитам необходимо использовать объекты-ссылки, полученные с помощью методов поиска (например, НайтиПоКоду(), НайтиПоНаименованию()) или выгруженные из существующих реквизитов.
  2. Некорректное добавление строк в табличную часть. Вызов метода Добавить() у табличной части при присвоении каждого отдельного реквизита создает новую пустую строку. Конструкция вида НовыйДокумент.Товары.Добавить().Номенклатура = ... и следующая за ней НовыйДокумент.Товары.Добавить().Количество = ... создаст в табличной части две разные строки: первую с номенклатурой и пустным количеством, а вторую с количеством и пустой номенклатурой.
  3. Отсутствие вызова метода записи. Вызов функции СоздатьДокумент() менеджера документов формирует объект только в оперативной памяти на сервере. Если не вызвать метод Записать(), созданный объект просто исчезнет из памяти после завершения работы процедуры.

Шаг 1. Правильное добавление строк в табличную часть

Выясним, как верно работать со строками табличной части. Метод Добавить() возвращает ссылку на вновь созданную строку табличной части. Эту ссылку необходимо сохранить в отдельную переменную, после чего заполнять свойства именно этой переменной:


// Создаем новую строку и сохраняем ссылку на нее
НоваяСтрока = НовыйДокумент.Товары.Добавить();

// Заполняем реквизиты конкретной строки
НоваяСтрока.Номенклатура = СсылкаНаНоменклатуру;
НоваяСтрока.Количество = 1;
НоваяСтрока.Сумма = 1500;

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


// Быстрая перезапись табличной части при совпадении имен колонок
НовыйДокумент.Товары.Загрузить(ИсточникДокумент.Товары.Выгрузить());

Шаг 2. Инициализация и работа со ссылочными типами данных

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


// Создаем объект документа в памяти
НовыйДокумент = Документы.ОтчетОРозничныхПродажах.СоздатьДокумент();

// Устанавливаем дату документа
НовыйДокумент.Дата = ТекущаяДата();

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

// Поиск и установка ссылочных реквизитов шапки
НовыйДокумент.Организация = Справочники.Организации.НайтиПоНаименованию("ООО ""Торговый Дом""");
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
НовыйДокумент.СчетКасса = ПланыСчетов.Хозрасчетный.НайтиПоКоду("50.01");

// Заполнение табличной части "Товары"
СтрокаТовары = НовыйДокумент.Товары.Добавить();

// В качестве номенклатуры передаем именно ссылку (например, из списка значений СЗ)
СтрокаТовары.Номенклатура = СЗ[1].Значение; 
СтрокаТовары.Количество = 1;
СтрокаТовары.Сумма = СЗ[7].Значение;
СтрокаТовары.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;

// Заполнение счетов учета ссылками из плана счетов
СтрокаТовары.СчетУчета = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");
СтрокаТовары.СчетДоходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.01.1");
СтрокаТовары.СчетРасходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.1");

// Сохраняем документ в информационной базе
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);

Шаг 3. Автоматическое заполнение счетов учета в типовых конфигурациях

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


// Автоматическое заполнение счетов учета для всей табличной части
ЗаполнениеСчетовУчета.ЗаполнитьСчетаУчетаВТабличнойЧасти(НовыйДокумент, "Товары");

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

Резюме

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

← На главную