В практике разработчика 1С часто возникает задача автоматизации ввода данных. Одной из наиболее востребованных операций является создание документов прихода на основании внешних данных, например, из файлов Excel, JSON или сторонних API. В рамках данной статьи мы проанализируем ситуацию, когда необходимо программно создать документ ПоступлениеТоваровУслуг, корректно заполнить его заголовочную часть, добавить строки в таблицу товаров и обеспечить правильное проведение документа по регистрам учета.
Первым шагом в решении нашей задачи является создание экземпляра объекта документа. Для этого мы обратимся к менеджеру документа. Разберем по шагам, как это происходит в коде. Нам необходимо использовать метод СоздатьДокумент(), который инициализирует новый объект в оперативной памяти, но еще не записывает его в базу данных.
НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
НовыйДокумент.Дата = ТекущаяДата();
НовыйДокумент.УстановитьНовыйНомер();
Обратим внимание на метод УстановитьНовыйНомер(). Мы рекомендуем вызывать его сразу после создания, чтобы система зарезервировала номер согласно установленной периодичности в метаданных. Также важно установить актуальную дату, так как от нее зависят итоги и периоды регистров, в которые документ сделает записи при проведении.
Рассмотрим подробнее процесс заполнения ключевых аналитик. Любой документ поступления требует указания организации, контрагента и склада. Проанализируем типичный код заполнения этих полей. Важно помнить, что реквизиты должны иметь типы данных, соответствующие метаданным (обычно это СправочникСсылка).
НовыйДокумент.Организация = Справочники.Организации.НайтиПоНаименованию("Основная организация");
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоИНН("7700000000");
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643"); // Рубли
Если мы работаем в типовой конфигурации (например, 1С:ERP или 1С:Комплексная автоматизация), выясним причину, по которой некоторые поля могут не заполниться автоматически. Часто требуется дополнительно заполнять соглашения или договоры. В таких случаях мы используем поиск по владельцу или задаем конкретные ссылки, полученные из внешних источников.
Перейдем к самой объемной части задачи — заполнению списка номенклатуры. Проанализируем алгоритм добавления строк. Каждая строка табличной части представляет собой отдельный объект, к которому мы обращаемся через метод Добавить().
Разберем пример кода, где мы в цикле обходим некий массив данных (например, полученный из внешнего файла) и переносим его в документ:
Для Каждого СтрокаДанных Из МассивДанных Цикл
НоваяСтрока = НовыйДокумент.Товары.Добавить();
НоваяСтрока.Номенклатура = СтрокаДанных.СсылкаНаНоменклатуру;
НоваяСтрока.Количество = СтрокаДанных.Количество;
НоваяСтрока.Цена = СтрокаДанных.Цена;
// Рассчитаем сумму строки
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
// Работа с НДС
НоваяСтрока.СтавкаНДС = Справочники.СтавкиНДС.НайтиПоНаименованию("20%");
НоваяСтрока.СуммаНДС = (НоваяСтрока.Сумма * 20) / 120; // Пример расчета НДС сверху
КонецЦикла;
Посмотрим на пример внимательно. При программном заполнении критически важно самостоятельно рассчитывать производные поля, такие как Сумма и СуммаНДС, так как при программном изменении реквизитов типовые обработчики событий формы (например, ПриИзменении) не срабатывают. Мы должны обеспечить логическую целостность данных вручную.
В современных конфигурациях 1С многие расчеты вынесены в общие модули. Чтобы не изобретать велосипед, проанализируем возможность использования встроенных функций. Например, для пересчета сумм документа часто применяется механизм ОбработкаТабличныхЧастей или специализированные методы в модуле менеджера документа.
Рассмотрим, как можно упростить заполнение ставок НДС и расчет сумм, используя типовые механизмы (если они доступны в вашей базе):
ПараметрыЗаполнения = Новый Структура("Организация, Дата", НовыйДокумент.Организация, НовыйДокумент.Дата);
ОбщегоНазначения.ЗаполнитьЗначенияСвойств(НоваяСтрока, ПараметрыЗаполнения);
// Вызов типового метода расчета НДС
// УчетНДС.РассчитатьСуммуНДС(НоваяСтрока, НовыйДокумент.ЦенаВключаетНДС);
Использование таких методов гарантирует, что алгоритм расчета в вашем коде будет полностью совпадать с алгоритмом, заложенным разработчиками конфигурации. Это особенно важно при обновлении программы.
Завершающим этапом является сохранение объекта в базе данных. Выясним, в чем разница между простой записью и проведением. Метод Записать() без параметров просто создает запись в таблице документов. Метод с параметром РежимЗаписиДокумента.Проведение запускает процесс формирования движений по регистрам накопления, сведений и бухгалтерии.
Рассмотрим правильный подход с обработкой возможных ошибок (транзакционный подход):
Попытка
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно создан и проведен: " + НовыйДокумент.Ссылка);
Исключение
Инфо = ИнформацияОбОшибке();
Сообщить("Не удалось провести документ! Ошибка: " + Инфо.Описание);
// При необходимости записываем только объект без проведения
НовыйДокумент.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
Использование конструкции Попытка...Исключение является обязательным стандартом разработки. Это позволяет избежать аварийного завершения работы программы, если, например, на складе не хватает остатков или не заполнен обязательный реквизит, проверяемый в процедуре ПередЗаписью.
Проанализируем несколько дополнительных моментов, которые помогут сделать ваш код более профессиональным:
ОбменДанными.Загрузка = Истина. Это отключит большинство прикладных проверок, что ускорит запись, но потребует от вас максимальной ответственности за корректность данных.Соответствие) или таблицу значений, а затем используйте их. Это значительно ускорит работу кода.Таким образом, мы по шагам разобрали весь цикл жизни программно создаваемого документа. Мы научились инициализировать объект, заполнять его структуру данными и корректно отражать его в учете. Применяя данные подходы, вы сможете создавать надежные и эффективные интеграционные механизмы в среде 1С:Предприятие.