При разработке собственных модулей и интеграций часто возникает необходимость программно сформировать стандартный документ (например, Отчет о розничных продажах в конфигурации «1С:Бухгалтерия 3.0») и перенести в него данные из сторонней системы или самописного документа. Начинающие разработчики часто сталкиваются с ситуацией, когда документ создается пустым, выдаются ошибки заполнения дат или данные просто не записываются в табличную часть. Разберем по шагам причину таких проблем и правильную методику программного заполнения документов.
Проанализируем распространенные ошибки, которые мешают корректному заполнению объектов в 1С:
СправочникСсылка.Склады или ПланСчетовСсылка.Хозрасчетный обычное строковое значение (например, "ОсновнойСклад" или "90.01.1") приведет к тому, что платформа либо выдаст ошибку несоответствия типов, либо оставит реквизит пустым. Разные типы данных — это основа платформы 1С. Для присвоения значений ссылочным реквизитам необходимо использовать объекты-ссылки, полученные с помощью методов поиска (например, НайтиПоКоду(), НайтиПоНаименованию()) или выгруженные из существующих реквизитов.Добавить() у табличной части при присвоении каждого отдельного реквизита создает новую пустую строку. Конструкция вида НовыйДокумент.Товары.Добавить().Номенклатура = ... и следующая за ней НовыйДокумент.Товары.Добавить().Количество = ... создаст в табличной части две разные строки: первую с номенклатурой и пустным количеством, а вторую с количеством и пустой номенклатурой.СоздатьДокумент() менеджера документов формирует объект только в оперативной памяти на сервере. Если не вызвать метод Записать(), созданный объект просто исчезнет из памяти после завершения работы процедуры.Выясним, как верно работать со строками табличной части. Метод Добавить() возвращает ссылку на вновь созданную строку табличной части. Эту ссылку необходимо сохранить в отдельную переменную, после чего заполнять свойства именно этой переменной:
// Создаем новую строку и сохраняем ссылку на нее
НоваяСтрока = НовыйДокумент.Товары.Добавить();
// Заполняем реквизиты конкретной строки
НоваяСтрока.Номенклатура = СсылкаНаНоменклатуру;
НоваяСтрока.Количество = 1;
НоваяСтрока.Сумма = 1500;
Если требуется перегрузить всю табличную часть из одного документа в другой и структуры колонок совпадают, можно воспользоваться методом выгрузки и загрузки таблицы значений:
// Быстрая перезапись табличной части при совпадении имен колонок
НовыйДокумент.Товары.Загрузить(ИсточникДокумент.Товары.Выгрузить());
Рассмотрим полный пример правильного программного создания документа с предварительной инициализацией значений по умолчанию и поиском ссылок в базе данных:
// Создаем объект документа в памяти
НовыйДокумент = Документы.ОтчетОРозничныхПродажах.СоздатьДокумент();
// Устанавливаем дату документа
НовыйДокумент.Дата = ТекущаяДата();
// Вызываем стандартное заполнение базовых реквизитов (ответственный, организация по умолчанию и др.)
НовыйДокумент.Заполнить(Неопределено);
// Поиск и установка ссылочных реквизитов шапки
НовыйДокумент.Организация = Справочники.Организации.НайтиПоНаименованию("ООО ""Торговый Дом""");
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
НовыйДокумент.СчетКасса = ПланыСчетов.Хозрасчетный.НайтиПоКоду("50.01");
// Заполнение табличной части "Товары"
СтрокаТовары = НовыйДокумент.Товары.Добавить();
// В качестве номенклатуры передаем именно ссылку (например, из списка значений СЗ)
СтрокаТовары.Номенклатура = СЗ[1].Значение;
СтрокаТовары.Количество = 1;
СтрокаТовары.Сумма = СЗ[7].Значение;
СтрокаТовары.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
// Заполнение счетов учета ссылками из плана счетов
СтрокаТовары.СчетУчета = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");
СтрокаТовары.СчетДоходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.01.1");
СтрокаТовары.СчетРасходов = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.02.1");
// Сохраняем документ в информационной базе
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
В конфигурации «1С:Бухгалтерия 3.0» не обязательно вручную искать и прописывать счета учета (такие как 41.01, 90.01.1 или 90.02.1). В программе предусмотрены механизмы автоматического подбора счетов из регистра сведений Счета учета номенклатуры. Для этого можно использовать процедуры стандартных общих модулей типовой конфигурации:
// Автоматическое заполнение счетов учета для всей табличной части
ЗаполнениеСчетовУчета.ЗаполнитьСчетаУчетаВТабличнойЧасти(НовыйДокумент, "Товары");
Применение этого подхода гарантирует подстановку корректных счетов учета в зависимости от выбранной организации, склада и категории номенклатуры без необходимости жестко прописывать их в коде обработки.
Для успешного программного формирования документов и переноса данных между табличными частями следует соблюдать простые правила: создавать строки ТЧ через сохранение результата Добавить() в переменную, заполнять реквизиты объектами соответствующих типов (ссылками, числами, датами, а не их строковыми представлениями) и обязательно вызывать метод Записать() для сохранения документа в информационной базе.