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