При обновлении конфигурации «1С:Комплексная автоматизация» до версии 2.5.8.221 и выше многие технические специалисты столкнулись с неприятной ситуацией: при попытке провести стандартный документ Реализация товаров и услуг (РТУ) система выдает ошибку о незаполненных обязательных полях, хотя на форме документа эти поля отсутствуют или визуально заполнены. Давайте подробно разберем, почему это происходит и как исправить ситуацию, не прибегая к радикальным мерам.
Для начала проанализируем архитектурные изменения. Начиная с версии 2.5.8, фирма «1С» внедрила новый механизм комиссионной торговли (версия 2.0). В рамках этого обновления в документ Реализация товаров и услуг были добавлены новые реквизиты:
Эти поля предназначены для сценариев, когда ваша компания продает товар через комиссионера конечному покупателю. В таких случаях в этих реквизитах фиксируется конечный потребитель. На уровне метаданных для этих реквизитов установлено свойство Проверять заполнение — Выдавать ошибку. Это сделано для обеспечения целостности данных в новой схеме учета.
Поскольку эти реквизиты нужны далеко не всегда (а только при определенных хозяйственных операциях, связанных с комиссией), разработчики типовой конфигурации предусмотрели механизм программного управления проверкой. Рассмотрим, как это работает «под капотом» системы.
В модуле объекта документа РеализацияТоваровУслуг существует стандартная процедура ОбработкаПроверкиЗаполнения. В норме она должна определять вид операции документа и, если это обычная продажа клиенту, исключать новые реквизиты из списка проверяемых. Логика выглядит примерно следующим образом:
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Типовой код проверяет хозяйственную операцию
Если ХозяйственнаяОперация <> Перечисления.ХозяйственныеОперации.РеализацияЧерезКомиссионера Тогда
// Удаляем реквизиты из массива проверки, если они не нужны
Позиция = ПроверяемыеРеквизиты.Найти("КлиентПартнер");
Если Позиция <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Позиция);
КонецЕсли;
Позиция = ПроверяемыеРеквизиты.Найти("КлиентКонтрагент");
Если Позиция <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Позиция);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, описанную пользователем. Если в вашей базе установлены расширения конфигурации, которые затрагивают документ Реализация товаров и услуг, корень проблемы чаще всего кроется именно в них.
Если программист в расширении переопределил процедуру ОбработкаПроверкиЗаполнения, используя аннотацию &Вместо, то типовой код, приведенный выше, просто не выполняется. Система видит только код из расширения. Если в коде расширения не продублирована логика удаления реквизитов КлиентПартнер и КлиентКонтрагент из массива ПроверяемыеРеквизиты, платформа 1С обращается к свойствам метаданных. Видя там пометку «Обязательно», она блокирует проведение документа.
Разберем по шагам, что необходимо сделать для устранения ошибки:
Администрирование — Печатные формы, отчеты и обработки — Расширения.РеализацияТоваровУслуг. Изучите модуль объекта этого документа в расширении.&Вместо("ОбработкаПроверкиЗаполнения"), это главный кандидат на исправление.&Вместо на &Перед или &После, если это позволяет бизнес-логика вашего расширения. Это позволит типовому коду отработать и корректно сформировать список проверяемых полей.Если использование &Вместо критически необходимо, вам придется вручную добавить в код расширения блок очистки массива проверок:
&Вместо("ОбработкаПроверкиЗаполнения")
Процедура Моя_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
// Вызов оригинального метода (если требуется)
// ПродолжитьВызов(Отказ, ПроверяемыеРеквизиты);
// Вставляем логику исключения реквизитов
МассивИсключений = Новый Массив;
МассивИсключений.Добавить("КлиентПартнер");
МассивИсключений.Добавить("КлиентКонтрагент");
Для Каждого ИмяРеквизита Из МассивИсключений Цикл
Индекс = ПроверяемыеРеквизиты.Найти(ИмяРеквизита);
Если Индекс <> Неопределено Тогда
ПроверяемыеРеквизиты.Удалить(Индекс);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Выясним еще одну важную деталь. Иногда ошибка проявляется при создании документов исправления или сторно на основании реализаций, созданных до обновления на 2.5.8. В этом случае данные старого документа могут некорректно интерпретироваться новой логикой проверки.
Также рекомендуется проверить наличие установленных патчей (исправлений) от 1С. В версиях 2.5.8.x выпускалось несколько исправлений (например, EF_00_00XXXXXX), которые точечно правили ложные срабатывания проверки заполнения при обмене данными через универсальный формат или при использовании мобильных приложений.
Подводя итог, можно сказать, что проблема не является багом самой конфигурации 1С:КА в чистом виде. Это следствие архитектурного конфликта между жесткими требованиями платформы в метаданных и «мягким» программным фильтром в коде, который легко сломать неосторожным использованием расширений.
Золотое правило: При обновлении на новые минорные версии (как 2.5.8) всегда проводите ревизию расширений, использующих &Вместо, особенно в модулях объектов ключевых документов (РТУ, Заказ клиента, Поступление товаров и услуг).