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