При автоматизации бизнес-процессов в среде 1С программисты часто сталкиваются с ситуацией, когда при программном создании документов некоторые реквизиты упорно «исчезают» после записи или открытия формы. Особенно часто эта проблема проявляется в кассовых документах — Приходном кассовом ордере (ПКО) и Расходном кассовом ордере (РКО) в конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как 1С:Бухгалтерия предприятия 3.0, 1С:ERP или 1С:Комплексная автоматизация.
В этой статье мы подробно разберем две классические проблемы: почему очищается поле «Статья движения денежных средств» в ПКО и почему пропадает «Контрагент» в РКО, а также предоставим готовые шаблоны кода для правильного заполнения этих документов.
---
Рассмотрим первую проблему: вы программно создаете документ ПКО, заполняете реквизит шапки СтатьяДвиженияДенежныхСредств, записываете документ, но при открытии формы в интерфейсе это поле оказывается пустым. При этом отладчик в момент создания показывает, что ссылка успешно найдена и записана.
Выясним причину этого поведения:
В конфигурациях 1С:Бухгалтерия 3.0 структура метаданных оптимизирована под хранение сложных расчетов. В интерфейсе пользователя ПКО выглядит просто: если оплата идет по одному договору и одной статье ДДС, форма показывает обычные одиночные поля в шапке. Однако на уровне базы данных реквизита СтатьяДвиженияДенежныхСредств (а часто и договора, и ставки НДС) в шапке документа физически не существует. Все эти данные хранятся исключительно в табличной части РасшифровкаПлатежа.
Когда вы открываете форму документа, срабатывают стандартные механизмы платформы и общего модуля ДенежныеСредстваБП. Они анализируют табличную часть РасшифровкаПлатежа:
РасшифровкаПлатежа осталась пустой, то при записи или открытии формы алгоритмы синхронизации считают, что данных нет, и затирают значение в шапке пустой ссылкой.Решение проблемы:
Для правильного заполнения статьи движения денежных средств необходимо всегда обращаться к табличной части РасшифровкаПлатежа и добавлять строку туда.
Рассмотрим правильный пример программного создания ПКО:
// Создаем новый документ ПКО
НовыйПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
НовыйПКО.Дата = ТекущаяДата();
НовыйПКО.Организация = Справочники.Организации.НайтиПоРеквизиту("ИНН", "7700000000");
НовыйПКО.Касса = Справочники.Кассы.НайтиПоНаименованию("Основная касса");
НовыйПКО.СуммаДокумента = 15000;
// Обязательно заполняем табличную часть "РасшифровкаПлатежа"
НоваяСтрока = НовыйПКО.РасшифровкаПлатежа.Добавить();
НоваяСтрока.СуммаПлатежа = 15000;
НоваяСтрока.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоНаименованию("Поступление денежных средств из кассы ККМ");
// Если вид операции предполагает расчеты с контрагентом, заполняем также договор и ставку НДС:
// НоваяСтрока.ДоговорКонтрагента = СсылкаНаДоговор;
// НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС.НДС20;
НовыйПКО.Записать(РежимЗаписиДокумента.Запись);
---
Вторая популярная проблема: в документе РКО программно заполняется поле Контрагент, но после открытия формы или интерактивного пересчета поле на форме становится пустым или недоступным для редактирования.
Проанализируем ситуацию:
Кассовые и банковские документы 1С являются мультиоперационными. Поведение формы и состав доступных полей жестко привязаны к реквизиту ВидОперации. В зависимости от выбранного вида операции система включает или отключает определенные механизмы проведения и проверки заполнения.
Например, если в РКО выбран вид операции Возврат розничному покупателю:
Возврат розничному покупателю реквизит Контрагент (Получатель) логически не нужен системе. Вместо него выступает Склад.ПередЗаписью или при вызове специализированных процедур заполнения (например, из общего модуля ЗаполнениеДокументов) прописано принудительное очищение несовместимых реквизитов. Любое значение контрагента, установленное программно, будет просто стерто.Если вам необходимо вернуть деньги конкретному контрагенту (например, по договору), то следует использовать вид операции Возврат покупателю. В этом случае поле Контрагент станет доступным и не будет очищаться системой.
Посмотрим на пример правильной последовательности заполнения РКО:
При программной генерации документов крайне важно соблюдать строгую последовательность шагов. Сначала устанавливается вид операции, затем инициализируются параметры по умолчанию для этого вида операции, и только в самом конце заполняются остальные реквизиты.
НовыйРКО = Документы.РасходныйКассовыйОрдер.СоздатьДокумент();
// Шаг 1. Устанавливаем вид операции в первую очередь!
НовыйРКО.ВидОперации = Перечисления.ВидыОперацийРКО.ВозвратПокупателю; // Для возврата контрагенту
// Шаг 2. Заполняем основные реквизиты шапки
НовыйРКО.Дата = ТекущаяДата();
НовыйРКО.Организация = Справочники.Организации.НайтиПоНаименованию("Наша Организация");
НовыйРКО.Касса = Справочники.Кассы.НайтиПоНаименованию("Основная касса");
// Шаг 3. Заполняем табличную часть (сверяем контрагента и договор)
СтрокаТЧ = НовыйРКО.РасшифровкаПлатежа.Добавить();
СтрокаТЧ.СуммаПлатежа = 5000;
СтрокаТЧ.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоНаименованию("Оплата поставщику");
// Контрагент и договор будут активны, так как вид операции установлен корректно
КонтрагентСсылка = Справочники.Контрагенты.НайтиПоНаименованию("Розничный покупатель");
НовыйРКО.Контрагент = КонтрагентСсылка; // В РКО Контрагент может находиться в шапке (для совместимости) или браться из ТЧ
СтрокаТЧ.ДоговорКонтрагента = Справочники.ДоговорыКонтрагентов.НайтиПоНаименованию("Основной договор", Ложь, , КонтрагентСсылка);
НовыйРКО.Записать(РежимЗаписиДокумента.Запись);
---
Для того чтобы избежать скрытых ошибок при программном создании кассовых и банковских документов в 1С, рекомендуем придерживаться следующих правил:
РасшифровкаПлатежа. Даже если в интерфейсе вы видите аккуратную шапку с одним полем статьи ДДС или договора, в базе данных эти реквизиты привязаны к табличной части. Заполнение шапки без заполнения ТЧ приведет к потере данных при первой же перезаписи документа.ВидОперации. Изменение вида операции в середине или конце кода приведет к тому, что встроенные обработчики платформы очистят «неподходящие» по их мнению реквизиты (такие как контрагенты, счета учета, склады или договоры).ПередЗаписью и ПриЗаписи, а также обращайте внимание на подписки на события. Именно там обычно кроются механизмы очистки некорректно заполненных реквизитов.