Как программно заполнить значение Касса в ПКО и избежать ошибок при проведении в 1С:Комплексная автоматизация 2

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

При разработке расширений для конфигураций «1С:Комплексная автоматизация 2» или «1С:ERP 2.5» программисты часто сталкиваются с задачей автоматизации финансовых операций, например, созданием Приходного кассового ордера (ПКО) на основании Выемки денежных средств из кассы ККМ. Несмотря на кажущуюся простоту, система может выдавать ошибку: «Значение поля "Касса" не может быть пустым!» даже в тех случаях, когда в коде реквизит шапки явно заполнен. Проанализируем причины этой проблемы и разберем правильный алгоритм программного формирования документа.

Разбор типичных ошибок при получении данных запросом

Рассмотрим ситуацию: нам нужно найти основную кассу предприятия, связанную с определенным фискальным устройством, через настройки РМК. В типовом коде часто встречается попытка получить данные через точку от справочника настроек. Проанализируем пример запроса, который может работать нестабильно:


ЗапросКасса = Новый Запрос;
ЗапросКасса.Текст = 
    "ВЫБРАТЬ
    |    НастройкиРМК.Кассы.Касса КАК Касса
    |ИЗ
    |    Справочник.НастройкиРМК КАК НастройкиРМК
    |ГДЕ
    |    НастройкиРМК.Кассы.ПодключаемоеОборудование = &ФискальноеУстройство";

Выясним причину, почему такой запрос может возвращать странные результаты в выборке. В платформе 1С обращение к табличным частям через точку в секции ВЫБРАТЬ от основной таблицы справочника создает неявное соединение, которое в сложных иерархиях настроек РМК может работать некорректно. Правильнее использовать в качестве источника саму таблицу части:


ЗапросКасса = Новый Запрос;
ЗапросКасса.Текст = 
    "ВЫБРАТЬ ПЕРВЫЕ 1
    |    НастройкиРМККассы.Касса КАК Касса
    |ИЗ
    |    Справочник.НастройкиРМК.Кассы КАК НастройкиРМККассы
    |ГДЕ
    |    НастройкиРМККассы.ПодключаемоеОборудование = &ФискальноеУстройство";

Кроме того, обратим внимание на критическую ошибку в обработке результата. Использование метода ВыборкаКасса.Выбрать("Касса") является в корне неверным, так как метод Выбрать() у объекта выборки предназначен для получения подчиненных группировок. Для получения значения конкретного поля следует обращаться к нему напрямую через точку.

Использование типового механизма заполнения на основании

В современных конфигурациях на базе ERP-ядра (КА 2, ERP 2) ручное заполнение каждого реквизита (Организация, Сумма, Валюта) является плохой практикой. Рассмотрим более надежный способ через метод Заполнить(). Этот метод инициализирует документ по правилам, заложенным вендором, включая установку правильной хозяйственной операции.

Посмотрим на пример правильной инициализации документа:


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

// После типового заполнения дозаполняем специфические реквизиты
ПКО.Дата = ТекущаяДата();
ПКО.Касса = НужнаяКассаПредприятия; // Склад денежных средств

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

Критическая важность табличной части «Расшифровка платежа»

Разберем самую коварную причину ошибки «Значение поля "Касса" не может быть пустым!». В конфигурации «Комплексная автоматизация 2» ПКО — это сложный объект, движения которого по регистру накопления Денежные средства (наличные) формируются не только на основе шапки документа, но и на основе данных табличной части РасшифровкаПлатежа.

Если вы заполнили реквизит ПКО.Касса (в шапке), но оставили табличную часть пустой, механизм проведения не сможет распределить сумму по аналитикам. При попытке записи движений в регистр система видит пустую аналитику «Касса» в строке набора записей и выдает ошибку. Выясним, как правильно программно заполнить расшифровку:


НоваяСтрока = ПКО.РасшифровкаПлатежа.Добавить();
НоваяСтрока.Сумма = ПКО.СуммаДокумента;
НоваяСтрока.ВалютаВзаиморасчетов = ПКО.Валюта;
// Важно указать статью ДДС
НоваяСтрока.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоНаименованию("Поступление из кассы ККМ");
// В некоторых операциях касса также дублируется в ТЧ
Если ПКО.РасшифровкаПлатежа.Выгрузить().Колонки.Найти("Касса") <> Неопределено Тогда
    НоваяСтрока.Касса = ПКО.Касса;
КонецЕсли;

Полный пример реализации создания ПКО в расширении

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


&После("ВыполнитьАвтоматическуюИнкассациюДС")
Процедура Автоматическое_СозданиеПКО(КассаККМ, ОшибкаПриСнятииZОтчета) Экспорт
    
    // 1. Ищем последнюю проведенную выемку по данной кассе ККМ
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ ПЕРВЫЕ 1
        |    Выемка.Ссылка КАК Ссылка
        |ИЗ
        |    Документ.ВыемкаДенежныхСредствИзКассыККМ КАК Выемка
        |ГДЕ
        |    Выемка.Проведен И Выемка.КассаККМ = &КассаККМ
        |УПОРЯДОЧИТЬ ПО
        |    Выемка.Дата УБЫВ";
    Запрос.УстановитьПараметр("КассаККМ", КассаККМ);
    
    Результат = Запрос.Выполнить();
    Если Результат.Пустой() Тогда
        Возврат;
    КонецЕсли;
    
    Выборка = Результат.Выбрать();
    Выборка.Следующий();
    СсылкаВыемка = Выборка.Ссылка;

    // 2. Создаем ПКО и используем типовое заполнение
    ПКО = Документы.ПриходныйКассовыйОрдер.СоздатьДокумент();
    ПКО.Заполнить(СсылкаВыемка);
    
    // 3. Уточняем Кассу предприятия (куда поступают деньги)
    // В КА 2.5 касса предприятия часто связана с Кассой ККМ через настройки
    ПКО.Касса = Справочники.Кассы.НайтиПоНаименованию("Основная касса"); 
    
    // 4. Обязательно проверяем и дозаполняем Расшифровку платежа
    Если ПКО.РасшифровкаПлатежа.Количество() = 0 Тогда
        СтрокаТЧ = ПКО.РасшифровкаПлатежа.Добавить();
        СтрокаТЧ.Сумма = ПКО.СуммаДокумента;
        СтрокаТЧ.СтатьяДвиженияДенежныхСредств = Справочники.СтатьиДвиженияДенежныхСредств.НайтиПоКоду("00-000001");
    КонецЕсли;

    // 5. Запись и проведение
    Попытка
        ПКО.Записать(РежимЗаписиДокумента.Проведение);
        Сообщить("Создан и проведен ПКО: " + ПКО.Ссылка);
    Исключение
        ЗаписьЖурналаРегистрации("ОшибкаСозданияПКО", УровеньЖурналаРегистрации.Ошибка, , , КраткоеОписаниеОшибки(ИнформацияОбОшибке()));
    КонецПопытки;

КонецПроцедуры

Подведем итоги

Для успешного программного создания ПКО в 1С:Комплексная автоматизация 2 необходимо соблюдать следующие правила:

  1. Используйте метод Заполнить(Основание). Это избавит вас от ручного заполнения реквизитов и правильно установит хозяйственную операцию.
  2. Проверяйте заполнение табличной части РасшифровкаПлатежа. Ошибка о пустом значении кассы при проведении в 90% случаев вызвана отсутствием строк в этой таблице, так как именно по ним строятся движения регистров накопления.
  3. Правильно работайте с выборкой запроса. Никогда не используйте Выборка.Выбрать("Поле") для получения значения. Пользуйтесь прямым обращением Выборка.Поле.
  4. Следите за типами данных. Убедитесь, что в поле ПКО.Касса передается ссылка на справочник Кассы, а не КассыККМ. Это разные сущности: первая отвечает за склад наличных денег организации, вторая — за физический кассовый аппарат в торговой точке.

Соблюдение этой структуры позволит вашему коду работать надежно даже после обновлений конфигурации, так как вы опираетесь на стандартные механизмы платформы и типовые бизнес-процедуры 1С.

← На главную