Почему в 1С:КА 2.5.8 при проведении реализации возникает ошибка «Поле Клиент не заполнено» из-за реквизитов КлиентПартнер и КлиентКонтрагент

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

При обновлении конфигурации «1С:Комплексная автоматизация» до версии 2.5.8.221 и выше многие технические специалисты столкнулись с неприятной ситуацией: при попытке провести стандартный документ Реализация товаров и услуг (РТУ) система выдает ошибку о незаполненных обязательных полях, хотя на форме документа эти поля отсутствуют или визуально заполнены. Давайте подробно разберем, почему это происходит и как исправить ситуацию, не прибегая к радикальным мерам.

Причина возникновения проблемы: Новая схема комиссионной торговли

Для начала проанализируем архитектурные изменения. Начиная с версии 2.5.8, фирма «1С» внедрила новый механизм комиссионной торговли (версия 2.0). В рамках этого обновления в документ Реализация товаров и услуг были добавлены новые реквизиты:

Эти поля предназначены для сценариев, когда ваша компания продает товар через комиссионера конечному покупателю. В таких случаях в этих реквизитах фиксируется конечный потребитель. На уровне метаданных для этих реквизитов установлено свойство Проверять заполнение — Выдавать ошибку. Это сделано для обеспечения целостности данных в новой схеме учета.

Механизм программного отключения проверки

Поскольку эти реквизиты нужны далеко не всегда (а только при определенных хозяйственных операциях, связанных с комиссией), разработчики типовой конфигурации предусмотрели механизм программного управления проверкой. Рассмотрим, как это работает «под капотом» системы.

В модуле объекта документа РеализацияТоваровУслуг существует стандартная процедура ОбработкаПроверкиЗаполнения. В норме она должна определять вид операции документа и, если это обычная продажа клиенту, исключать новые реквизиты из списка проверяемых. Логика выглядит примерно следующим образом:


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

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

Выясняем причину сбоя: Конфликт с расширениями

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

Если программист в расширении переопределил процедуру ОбработкаПроверкиЗаполнения, используя аннотацию &Вместо, то типовой код, приведенный выше, просто не выполняется. Система видит только код из расширения. Если в коде расширения не продублирована логика удаления реквизитов КлиентПартнер и КлиентКонтрагент из массива ПроверяемыеРеквизиты, платформа 1С обращается к свойствам метаданных. Видя там пометку «Обязательно», она блокирует проведение документа.

Пошаговое решение проблемы

Разберем по шагам, что необходимо сделать для устранения ошибки:

  1. Проверьте наличие расширений: Перейдите в раздел Администрирование — Печатные формы, отчеты и обработки — Расширения.
  2. Поиск переопределенных процедур: Выясните, в каких расширениях заимствован документ РеализацияТоваровУслуг. Изучите модуль объекта этого документа в расширении.
  3. Анализ аннотаций: Если вы видите процедуру &Вместо("ОбработкаПроверкиЗаполнения"), это главный кандидат на исправление.
  4. Корректировка кода: Самый правильный способ — заменить &Вместо на &Перед или &После, если это позволяет бизнес-логика вашего расширения. Это позволит типовому коду отработать и корректно сформировать список проверяемых полей.

Если использование &Вместо критически необходимо, вам придется вручную добавить в код расширения блок очистки массива проверок:


&Вместо("ОбработкаПроверкиЗаполнения")
Процедура Моя_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
    
    // Вызов оригинального метода (если требуется)
    // ПродолжитьВызов(Отказ, ПроверяемыеРеквизиты);
    
    // Вставляем логику исключения реквизитов
    МассивИсключений = Новый Массив;
    МассивИсключений.Добавить("КлиентПартнер");
    МассивИсключений.Добавить("КлиентКонтрагент");
    
    Для Каждого ИмяРеквизита Из МассивИсключений Цикл
        Индекс = ПроверяемыеРеквизиты.Найти(ИмяРеквизита);
        Если Индекс <> Неопределено Тогда
            ПроверяемыеРеквизиты.Удалить(Индекс);
        КонецЕсли;
    КонецЦикла;

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

Дополнительные факторы: Старые документы и патчи

Выясним еще одну важную деталь. Иногда ошибка проявляется при создании документов исправления или сторно на основании реализаций, созданных до обновления на 2.5.8. В этом случае данные старого документа могут некорректно интерпретироваться новой логикой проверки.

Также рекомендуется проверить наличие установленных патчей (исправлений) от 1С. В версиях 2.5.8.x выпускалось несколько исправлений (например, EF_00_00XXXXXX), которые точечно правили ложные срабатывания проверки заполнения при обмене данными через универсальный формат или при использовании мобильных приложений.

Резюме

Подводя итог, можно сказать, что проблема не является багом самой конфигурации 1С:КА в чистом виде. Это следствие архитектурного конфликта между жесткими требованиями платформы в метаданных и «мягким» программным фильтром в коде, который легко сломать неосторожным использованием расширений.

Золотое правило: При обновлении на новые минорные версии (как 2.5.8) всегда проводите ревизию расширений, использующих &Вместо, особенно в модулях объектов ключевых документов (РТУ, Заказ клиента, Поступление товаров и услуг).

← На главную