В процессе разработки на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью автоматизации ввода данных. Программное создание документов — это базовая, но крайне ответственная задача, требующая понимания объектной модели платформы, работы с транзакциями и особенностями серверного вызова. В данной статье мы подробно разберем, как правильно инициализировать новый документ, заполнить его реквизиты, добавить строки в табличные части и обеспечить корректную запись и проведение в системе.
Для начала работы проанализируем ситуацию: любой документ в 1С создается через менеджер соответствующего типа документа. Важно помнить, что создание объекта всегда должно происходить на стороне сервера. На клиенте мы можем работать только с данными формы, но физическое создание записи в базе данных требует серверного контекста.
Рассмотрим пример инициализации документа РеализацияТоваровУслуг. Выясним причину, почему используется именно метод СоздатьДокумент(). Этот метод возвращает объект типа ДокументОбъект, который обладает всеми необходимыми методами для записи и проведения.
// Создание нового объекта документа на сервере
НовыйДокумент = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
// Установка даты документа (по умолчанию текущая)
НовыйДокумент.Дата = ТекущаяДата();
// Заполнение основных реквизитов "шапки"
НовыйДокумент.Организация = Справочники.Организации.НайтиПоНаименованию("Основная организация");
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоКоду("00001");
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад");
Разберем подробнее: при поиске ссылочных данных (организаций, складов) рекомендуется использовать уникальные идентификаторы или коды, так как поиск по наименованию может быть нестабильным при наличии дублей или изменении названий пользователями.
После заполнения «шапки» документа нам необходимо добавить информацию о товарах или услугах. Табличная часть документа представляет собой коллекцию строк. Посмотрим на пример, как правильно итерироваться по данным и добавлять их в документ.
Для добавления строки используется метод Добавить(). После создания строки каждому ее реквизиту необходимо присвоить значение. Проанализируем типичный цикл заполнения товаров из некоторого внешнего источника (например, массива структур или таблицы значений):
Для Каждого СтрокаДанных Из МассивТоваров Цикл
// Добавление новой строки в табличную часть "Товары"
НоваяСтрока = НовыйДокумент.Товары.Добавить();
// Заполнение реквизитов строки
НоваяСтрока.Номенклатура = СтрокаДанных.Номенклатура;
НоваяСтрока.Количество = СтрокаДанных.Количество;
НоваяСтрока.Цена = СтрокаДанных.Цена;
// Автоматический расчет суммы, если это предусмотрено логикой
НоваяСтрока.Сумма = НоваяСтрока.Количество * НоваяСтрока.Цена;
КонецЦикла;
Важный момент: если в конфигурации прописана сложная логика пересчета налогов или скидок при изменении реквизитов, желательно вызывать соответствующие экспортные процедуры из модуля менеджера или модуля объекта. Это позволит сохранить целостность данных, аналогично тому, как если бы документ заполнял пользователь вручную.
Рассмотрим метод, позволяющий значительно сократить объем кода при заполнении реквизитов с одинаковыми именами. Функция ЗаполнитьЗначенияСвойств копирует значения свойств из источника в приемник. Это особенно полезно, когда структура входных данных совпадает со структурой документа.
// Пример быстрого заполнения реквизитов шапки из структуры
ДанныеШапки = Новый Структура("Организация, Контрагент, Ответственный");
// ... заполнение структуры ...
ЗаполнитьЗначенияСвойств(НовыйДокумент, ДанныеШапки);
Этот подход уменьшает количество ошибок, связанных с опечатками в именах переменных, и делает код более читаемым и лаконичным.
Завершающим этапом является сохранение документа в информационной базе. В 1С существует два основных режима записи: простая запись и проведение. Проанализируем ситуацию, когда необходимо не просто сохранить черновик, а отразить документ в учете (создать движения по регистрам).
Для этого используется метод Записать с параметром РежимЗаписиДокумента.Проведение. Разберем по шагам процесс обработки возможных ошибок при записи:
Попытка...Исключение. Это критически важно, так как проведение может сорваться из-за нехватки остатков на складе или незаполненных обязательных реквизитов.Исключение обязательно выводим сообщение пользователю или записываем ошибку в журнал регистрации.
Попытка
// Установка режима проведения
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);
Сообщить("Документ успешно создан и проведен: " + НовыйДокумент.Ссылка);
Исключение
// Обработка ошибки в случае неудачи
ТекстОшибки = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
Сообщить("Не удалось записать документ: " + ТекстОшибки);
// Здесь можно выполнить дополнительные действия, например, откат транзакции
КонецПопытки;
При массовом создании документов (например, при загрузке данных из внешней системы) следует придерживаться следующих правил:
ОбменДанными.Загрузка = Истина. Однако помните, что это отключает стандартные проверки бизнес-логики.ВалютаДокумента, Курс, Кратность, если они не заполняются автоматически в процедуре ПриУстановкеНовогоНомера.Выясним причину использования ОбменДанными.Загрузка = Истина. Этот флаг сообщает системе, что объект создается в режиме обмена, и большинство подписок на события и проверок в модуле объекта будут проигнорированы. Это значительно повышает скорость работы, но требует от разработчика полной ответственности за корректность данных.
Таким образом, мы рассмотрели полный цикл программной работы с документами. Соблюдение описанных инструкций позволит вам создавать надежные и эффективные механизмы автоматизации в 1С.