Как программно заполнить статью движения денежных средств в Расходном кассовом ордере в 1С?

Программист 1С v8.3 (Обычные формы) Бухгалтерский учет Торговля и дистрибуция
← На главную

При разработке алгоритмов ввода на основании или пакетного создания кассовых документов разработчики нередко сталкиваются с ситуацией, когда прямое присвоение реквизита СтатьяДвиженияДенежныхСредств документу РасходныйКассовыйОрдер не дает результата: поле остается пустым либо возникает ошибка времени выполнения. Рассмотрим причины такого поведения и разберем по шагам правильный способ программного заполнения документа.

Причины возникновения ошибки и пустого значения

Проанализируем типовые ошибки, которые приводят к незаполненности аналитики ДДС при программном создании документа:

  1. Расположение реквизита в табличной части: Во многих типовых конфигурациях (включая конфигурации на базе обычных форм, такие как Управление торговым предприятием, Управление производственным предприятием, Комплексная автоматизация) реквизиты взаиморасчетов и аналитики платежа располагаются не в шапке документа, а в табличной части РасшифровкаПлатежа. На форму документа в шапку выводятся текущие данные выделенной строки. Если табличная часть пуста или реквизит присваивается напрямую объекту документа, отображаемое на форме поле остается пустым.
  2. Попытка обращения к непредопределенному элементу: Конструкция вида Справочники.СтатьиДвиженияДенежныхСредств.ВозвратДенежныхСредствПокупателю работоспособна только в том случае, если в дереве метаданных конфигуратора создан предопределенный элемент с соответствующим именем. Если же статья создана пользователем в режиме предприятия, прямое обращение к менеджеру справочника вызовет ошибку Значение не является значением объектного типа либо вернет Неопределено.
  3. Пустая табличная часть после метода Заполнить(): При вызове стандартного метода Док1.Заполнить(ДокументОснование) табличная часть РасшифровкаПлатежа может остаться пустой, если в алгоритме заполнения на основании для данного типа документа не предусмотрена генерация строк. Обращение по индексу РасшифровкаПлатежа[0] к пустой коллекции вызовет критическую ошибку.

Пошаговое решение: программное заполнение РКО

Разберем корректный алгоритм создания документа, обхода его табличной части и заполнения необходимой аналитики.

  1. Получение ссылки на статью ДДС: Если элемент справочника не является предопределенным в конфигурации, находим его по коду или наименованию:
    
    СтатьяВозврат = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000002");
    
  2. Проверка и заполнение табличной части РасшифровкаПлатежа: Проверяем количество строк в табличной части. Если строки уже созданы процедурой заполнения на основании — обходим их или обращаемся к первой строке. Если строк нет — добавляем новую строку явным образом:
    
    Если Док1.РасшифровкаПлатежа.Количество() = 0 Тогда
        СтрокаПлатежа = Док1.РасшифровкаПлатежа.Добавить();
    Иначе
        СтрокаПлатежа = Док1.РасшифровкаПлатежа[0];
    КонецЕсли;
    
    СтрокаПлатежа.СтатьяДвиженияДенежныхСредств = СтатьяВозврат;
    
  3. Очистка или заполнение счетов учета: Если стоит задача очистить счет учета авансов или установить специфические счета для казахстанских/российских конфигураций, обращаемся к соответствующему плану счетов:
    
    // Для типовых конфигураций Казахстана используется план счетов Типовой:
    СтрокаПлатежа.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Типовой.ПустаяСсылка();
    
  4. Синхронизация реквизитов шапки (при необходимости): В некоторых конфигурациях реквизит СтатьяДвиженияДенежныхСредств присутствует и в шапке документа для определенных видов операций. В этом случае заполняем оба значения: Док1.СтатьяДвиженияДенежныхСредств = СтатьяВозврат;

Пример итогового программного кода

Посмотрим на полный пример процедуры создания и проведения документа РасходныйКассовыйОрдер на основании документа возврата:


Док1 = Документы.РасходныйКассовыйОрдер.СоздатьДокумент();
Док1.Заполнить(Док.Ссылка);
Док1.Дата = Док.Дата;
Док1.Автор = Док.Автор;
Док1.ВидОперации = Перечисления.ВидыОперацийРКО.ВозвратДенежныхСредствПокупателю;

СтатьяВозврат = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("000000002");

// Заполняем реквизит шапки
Док1.СтатьяДвиженияДенежныхСредств = СтатьяВозврат;

// Заполняем строки табличной части
Для Каждого СтрокаПлатежа Из Док1.РасшифровкаПлатежа Цикл
    СтрокаПлатежа.СтатьяДвиженияДенежныхСредств = СтатьяВозврат;
    СтрокаПлатежа.СчетУчетаРасчетовПоАвансам = ПланыСчетов.Типовой.ПустаяСсылка();
КонецЦикла;

// Записываем документ с проведением за один вызов
Док1.Записать(РежимЗаписиДокумента.Проведение);

Почему документ помечается как модифицированный при открытии?

Выясним причину ситуации, когда после программного проведения при интерактивном открытии формы документ сразу считается измененным и запрашивает сохранение при закрытии.

В типовых конфигурациях на обычных формах в обработчиках событий ПриОткрытии или ОбновлениеОтображения модуля формы часто заложены алгоритмы проверки и дозаполнения недостающих реквизитов (например, автоматическая подстановка договоров по умолчанию, счетов расчетов с контрагентами из регистров сведений или ставок НДС). Если документ был сформирован программно без заполнения этих сопутствующих реквизитов, форма при открытии подставляет их в память объекта и устанавливает признак ЭтаФорма.Модифицированность = Истина.

Для предотвращения такого поведения убедитесь, что при программном создании заполняются все аналитические реквизиты, предусмотренные логикой типовой формы документа.

← На главную