При доработке печатных форм и алгоритмов обработки документов разработчики часто сталкиваются с ситуацией, когда условие вида Если ВидДокумента = "НаАванс" Тогда не выполняется, даже если визуально в реквизите отображается именно это значение. Разберем детально, почему возникает такая ошибка, как устроены типы данных в платформе 1С:Предприятие и как корректно модифицировать номер документа при выводе на печать.
Проанализируем природу реквизитов типа ПеречислениеСсылка. В прикладных конфигурациях 1С (включая 1С:Бухгалтерию) реквизиты, отвечающие за вид документа (например, вид счета-фактуры), хранят не строковый текст, а строго типизированную ссылку на элемент метаданных перечисления.
Когда мы пишем условие, сравнивающее переменную ссылочного типа с текстовой строкой, платформа выполняет строгое сравнение типов. Поскольку тип ПеречислениеСсылка.ВидСчетФактурыВыставленного не равен типу Строка, логическое выражение всегда возвращает значение Ложь.
Разберем по шагам, как нужно обращаться к предопределенным значениям перечислений в модулях 1С. Для этого используется встроенная коллекция Перечисления и менеджер конкретного перечисления.
Посмотрим на пример правильного оформления условия:
Если ВидСчетФактуры = Перечисления.ВидСчетФактурыВыставленного.НаАванс Тогда
ПредставлениеНомера = "А" + ПредставлениеНомера;
КонецЕсли;
В данном случае платформа сравнивает две ссылки одного типа, и при совпадении условий ветка кода успешно выполняется.
Рассмотрим ситуацию, когда выборка данных для формирования печатной формы строится с помощью языка запросов. В текстах запросов обращение к элементам перечислений выполняется через специальную конструкцию ЗНАЧЕНИЕ(), а не через передачу строковых параметров или литералов.
Посмотрим на пример условия в тексте запроса:
ВЫБРАТЬ
СчетФактура.Ссылка КАК Ссылка,
СчетФактура.Номер КАК Номер,
СчетФактура.ВидСчетФактуры КАК ВидСчетФактуры
ИЗ
Документ.СчетФактураВыставленный КАК СчетФактура
ГДЕ
СчетФактура.ВидСчетФактуры = ЗНАЧЕНИЕ(Перечисление.ВидСчетФактурыВыставленного.НаАванс)
Иногда для обхода ошибки разработчики пытаются преобразовать ссылку в строку с помощью функции Строка(). Выясним, почему этот подход считается грубой ошибкой:
Строка(Ссылка) возвращает синоним элемента перечисления. Если пользователь или разработчик изменит синоним в конфигураторе, логика программы нарушится без генерации синтаксических ошибок.Если по архитектурным причинам все же требуется получить строковое системное имя элемента (идентификатор), применяют функцию XMLСтрока() или чтение метаданных:
ИмяЗначения = XMLСтрока(ВидСчетФактуры);
// Либо через объектную модель метаданных:
ИмяЭлемента = ВидСчетФактуры.Метаданные().Имя;
Разберем важные технические и учетные нюансы при добавлении префиксов и буквенных индексов к номерам счетов-фактур:
ПриУстановкеНовогоНомера (через подписку на события). В этом случае номер будет единым и в регистрах учета, и во всех отчетах.