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