При программном формировании кассовых документов в конфигурации «1С:Управление производственным предприятием 1.3» разработчики нередко сталкиваются с ситуацией: документ создается и записывается, но при открытии формы в режиме «1С:Предприятие» ключевые реквизиты (договор, статья движения денежных средств, ставка НДС, сумма налога) остаются пустыми либо не пересчитываются.
Разберем детально, почему так происходит, как устроена внутренняя структура документа ПриходныйКассовыйОрдер и как написать надежный программный код для его формирования.
Проанализируем основные архитектурные особенности конфигурации, которые вызывают ошибки при заполнении:
ОплатаПокупателя) взаиморасчеты, договоры, статьи ДДС и ставки НДС хранятся не в реквизитах шапки, а в строках табличной части РасшифровкаПлатежа. В пользовательском интерфейсе видимость полей переключается режимом «без разбиения / списком», однако на уровне метаданных данные всегда берутся из табличной части.СоздатьДокумент() работает исключительно с объектной моделью на сервере. Обработчики формы ПриИзменении, которые в интерактивном режиме автоматически подставляют счета, пересчитывают суммы взаиморасчетов и налоги, при программном коде не вызываются."1" вместо числа 1 в курсах валют), а также незаполненные реквизиты кратности вызывают сбои при последующем пересчете или проведении документа.Рассмотрим по шагам процесс создания и заполнения объекта документа.
Шаг 1. Инициализация объекта и значений по умолчанию
Сразу после создания экземпляра объекта рекомендуется вызвать типовой метод Заполнить(). Это позволит автоматически установить базовые параметры учетной политики, префиксы и счета по умолчанию:
ОбъектПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
ОбъектПКО.Заполнить(Неопределено);
Шаг 2. Заполнение основных реквизитов шапки
Заполняем дату, организацию, кассу, контрагента, вид операции и флаги учета. Обратите внимание: реквизит КурсДокумента и КратностьДокумента должны иметь числовой тип данных:
ОбъектПКО.Дата = СтруктураСмена.ДатаОкончания;
ОбъектПКО.ВидОперации = Перечисления.ВидыОперацийПКО.ОплатаПокупателя;
ОбъектПКО.Организация = Справочники.Организации.НайтиПоКоду("000000001");
ОбъектПКО.Касса = Справочники.Кассы.НайтиПоНаименованию("АГЗС №15");
ОбъектПКО.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Розничная продажа по ваучерам");
ОбъектПКО.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
ОбъектПКО.КурсДокумента = 1;
ОбъектПКО.КратностьДокумента = 1;
ОбъектПКО.ОтражатьВБухгалтерскомУчете = Истина;
ОбъектПКО.ОтражатьВНалоговомУчете = Истина;
ОбъектПКО.ОтражатьВУправленческомУчете = Истина;
ОбъектПКО.Оплачено = Истина;
ОбъектПКО.СчетУчетаПлатежа = ПланыСчетов.Хозрасчетный.КассаОрганизации;
ОбъектПКО.СчетУчетаПлатежаНУ = ПланыСчетов.Налоговый.Касса;
Шаг 3. Добавление строки в табличную часть «РасшифровкаПлатежа»
Переходим к заполнению аналитики взаиморасчетов. В строку ТЧ необходимо передать договор, статью ДДС, суммы, счета расчетов и способы погашения задолженности:
СтрокаТЧ = ОбъектПКО.РасшифровкаПлатежа.Добавить();
СтрокаТЧ.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Р-12/2017 от 01.12.2017");
СтрокаТЧ.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000003");
СтрокаТЧ.СпособПогашенияЗадолженности = Перечисления.СпособыПогашенияЗадолженности.Автоматически;
СтрокаТЧ.КурсВзаиморасчетов = 1;
СтрокаТЧ.КратностьВзаиморасчетов = 1;
СтрокаТЧ.СуммаПлатежа = 500;
СтрокаТЧ.СуммаВзаиморасчетов = 500;
СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.НДС18; // Или НДС20 в актуальных версиях
Шаг 4. Расчет и заполнение суммы НДС
Поскольку автоматический пересчет формы не срабатывает, сумму налога необходимо вычислить явно. Выполнить это можно двумя способами:
1. С помощью типовой функции конфигурации:
СтрокаТЧ.СуммаНДС = УчетНДС.РассчитатьСуммуНДС(СтрокаТЧ.СуммаПлатежа, СтрокаТЧ.СтавкаНДС, Истина);
2. Прямой расчет по формуле:
СтрокаТЧ.СуммаНДС = Окр(СтрокаТЧ.СуммаПлатежа * 18 / 118, 2);
Шаг 5. Заполнение счетов учета и синхронизация итогов
Для корректного отражения по регистрам указываем счета расчетов с контрагентом и обновляем реквизит общей суммы в шапке документа:
СтрокаТЧ.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиИЗаказчиками;
СтрокаТЧ.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.РасчетыПоАвансамПолученным;
СтрокаТЧ.СчетУчетаРасчетовСКонтрагентомНУ = ПланыСчетов.Налоговый.РасчетыСПокупателями;
СтрокаТЧ.СчетУчетаРасчетовПоАвансамНУ = ПланыСчетов.Налоговый.РасчетыПоАвансамПолученным;
// Синхронизируем общую сумму документа
ОбъектПКО.СуммаДокумента = ОбъектПКО.РасшифровкаПлатежа.Итог("СуммаПлатежа");
Соберем весь алгоритм воедино в готовую процедуру создания документа:
ОбъектПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
ОбъектПКО.Заполнить(Неопределено);
ОбъектПКО.Дата = СтруктураСмена.ДатаОкончания;
ОбъектПКО.ВидОперации = Перечисления.ВидыОперацийПКО.ОплатаПокупателя;
ОбъектПКО.Организация = Справочники.Организации.НайтиПоКоду("000000001");
ОбъектПКО.Касса = Справочники.Кассы.НайтиПоНаименованию("АГЗС №15");
ОбъектПКО.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию("Розничная продажа по ваучерам");
ОбъектПКО.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
ОбъектПКО.КурсДокумента = 1;
ОбъектПКО.КратностьДокумента = 1;
ОбъектПКО.Комментарий = "Излишняя оплата при совершении розничной реализации.";
ОбъектПКО.ОтражатьВБухгалтерскомУчете = Истина;
ОбъектПКО.ОтражатьВНалоговомУчете = Истина;
ОбъектПКО.ОтражатьВУправленческомУчете = Истина;
ОбъектПКО.Оплачено = Истина;
ОбъектПКО.СчетУчетаПлатежа = ПланыСчетов.Хозрасчетный.КассаОрганизации;
ОбъектПКО.СчетУчетаПлатежаНУ = ПланыСчетов.Налоговый.Касса;
// Заполнение табличной части
СтрокаТЧ = ОбъектПКО.РасшифровкаПлатежа.Добавить();
СтрокаТЧ.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Р-12/2017 от 01.12.2017");
СтрокаТЧ.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000003");
СтрокаТЧ.СпособПогашенияЗадолженности = Перечисления.СпособыПогашенияЗадолженности.Автоматически;
СтрокаТЧ.КурсВзаиморасчетов = 1;
СтрокаТЧ.КратностьВзаиморасчетов = 1;
СтрокаТЧ.СуммаПлатежа = СуммаВозвратаПКО;
СтрокаТЧ.СуммаВзаиморасчетов = СуммаВозвратаПКО;
СтрокаТЧ.СтавкаНДС = Перечисления.СтавкиНДС.НДС18;
СтрокаТЧ.СуммаНДС = УчетНДС.РассчитатьСуммуНДС(СтрокаТЧ.СуммаПлатежа, СтрокаТЧ.СтавкаНДС, Истина);
СтрокаТЧ.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиИЗаказчиками;
СтрокаТЧ.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Хозрасчетный.РасчетыПоАвансамПолученным;
СтрокаТЧ.СчетУчетаРасчетовСКонтрагентомНУ = ПланыСчетов.Налоговый.РасчетыСПокупателями;
СтрокаТЧ.СчетУчетаРасчетовПоАвансамНУ = ПланыСчетов.Налоговый.РасчетыПоАвансамПолученным;
// Итог суммы по шапке
ОбъектПКО.СуммаДокумента = ОбъектПКО.РасшифровкаПлатежа.Итог("СуммаПлатежа");
// Запись документа
ОбъектПКО.Записать(РежимЗаписиДокумента.Запись);
Такой подход гарантирует полное заполнение всех зависимых реквизитов документа, исключает появление пустых полей в форме и обеспечивает успешное проведение документа в дальнейшем.